Una pregunta agradable y simple: ¿es la función de "git fetch" un subconjunto estricto de git fetch --tags
?
Es decir, si corro git fetch --tags
, ¿hay alguna razón para correr git fetch
inmediatamente después?
¿Qué hay de git pull
y git pull --tags
? ¿Misma situacion?
Respuestas:
Nota: comenzando con git 1.9 / 2.0 (Q1 2014) ,
git fetch --tags
obtiene etiquetas además de las obtenidas por la misma línea de comando sin la opción.Ver commit c5a84e9 por Michael Haggerty (mhagger) :
Dado que Git 2.5 (Q2 2015)
git pull --tags
es más robusto:Ver commit 19d122b por Paul Tan (
pyokagan
) , 13 de mayo de 2015.(Fusión por Junio C Hamano -
gitster
- en commit cc77b99 , 22 de mayo de 2015)Con Git 2.11+ (Q4 2016)
git fetch
es más rápido.Ver commit 5827a03 (13 de octubre de 2016) por Jeff King (
peff
) .(Fusionada por Junio C Hamano -
gitster
- en commit 9fcd144 , 26 oct 2016)Eso solo se aplica a una situación en la que:
Git 2.21 (febrero de 2019) parece haber introducido una regresión cuando la configuración no
remote.origin.fetch
es la predeterminada ('+refs/heads/*:refs/remotes/origin/*'
)Git 2.24 (Q4 2019) agrega otra optimización.
Ver commit b7e2d8b (15 sep 2019) por Masaya Suzuki (
draftcode
) .(Fusionada por Junio C Hamano -
gitster
- en commit 1d8b0df , 07 oct 2019)fuente
git fetch <remote> <branch>
las etiquetas de seguimiento automático (ya que ya actualiza los seguimientos remotos CONTRA las intenciones originales): public-inbox.org/git/…Nota: esta respuesta solo es válida para git v1.8 y anteriores.
La mayor parte de esto se ha dicho en las otras respuestas y comentarios, pero aquí hay una explicación concisa:
git fetch
recupera todos los encabezados de rama (o todos los especificados por la opción de configuración remote.fetch), todas las confirmaciones necesarias para ellos y todas las etiquetas a las que se puede acceder desde estas ramas. En la mayoría de los casos, todas las etiquetas son accesibles de esta manera.git fetch --tags
recupera todas las etiquetas, todas las confirmaciones necesarias para ellas. Será no actualizar directores de las sucursales, incluso si son accesibles desde las etiquetas que eran descabellada.Resumen: si realmente desea estar totalmente actualizado, utilizando solo fetch, debe hacer ambas cosas.
Tampoco es "el doble de lento" a menos que se refiera a escribir en la línea de comandos, en cuyo caso los alias resuelven su problema. Esencialmente no hay gastos generales al hacer las dos solicitudes, ya que están solicitando información diferente.
fuente
git remote update
realidad no es un sustituto degit fetch
ygit fetch --tags
.git remote update
no actualizará las etiquetas existentes que han cambiado, aunque traerá nuevas etiquetas. Sologit fetch --tags
actualizará las etiquetas ya existentes.Voy a responder esto yo mismo.
He determinado que hay una diferencia. "git fetch --tags" puede traer todas las etiquetas, ¡pero no trae nuevos commits!
Resulta que uno tiene que hacer esto para estar totalmente "actualizado", es decir, replicar un "git pull" sin la fusión:
Es una pena, porque es el doble de lento. Si solo "git fetch" tuviera la opción de hacer lo que normalmente hace y traer todas las etiquetas.
fuente
git remote update myRemoteRepo
': eso buscaría contenido remoto y etiquetas?git fetch
todo el tiempo y constantemente elimina cualquier nueva confirmación y cualquier nueva etiqueta. ¿Qué versión de Git estás ejecutando?git fetch
no tomará etiquetas que no estén en el registro de confirmación de una rama. jQuery UI hace esto, por ejemplo, en una etiqueta de lanzamiento. Hacemos ungit checkout -b temp-branch
, hacemos nuestro lanzamiento, agregamos los archivos necesarios para el lanzamiento, actualizamos la versión, etc.,git commit -m "1.10.x" ; git tag 1.10.x; git push --tags
luego eliminamos nuestra rama temporal local. No hay una rama remota que llegue a esa etiqueta ygit fetch
nunca la descargará.El problema general aquí es que
git fetch
buscará+refs/heads/*:refs/remotes/$remote/*
. Si alguno de estos commits tiene etiquetas, esas etiquetas también se recuperarán. Sin embargo, si hay ramas a las que ninguna rama en el control remoto pueda acceder, no se recuperarán.La
--tags
opción cambia la especificación de referencia a+refs/tags/*:refs/tags/*
. Usted podría pedirgit fetch
a agarrar ambos. Estoy bastante seguro de que solo haría ungit fetch && git fetch -t
usaría el siguiente comando:Y si desea hacer que esto sea el predeterminado para este repositorio, puede agregar una segunda especificación de referencia a la búsqueda predeterminada:
Esto agregará una segunda
fetch =
línea.git/config
para este control remoto.Pasé un tiempo buscando la manera de manejar esto para un proyecto. Esto es lo que se me ocurrió.
En mi caso quería estas características
refs/*:refs/*
+
antes de la especificación de referencia-u
-p
-f
fuente
--tags
opción cambia la especificación de referencia a+refs/tags/*:refs/tags/*
". Aunque,man git-fetch
parece especificar que refspec sin el líder+
(refs/tags/*:refs/tags/*
).remote.origin.fetch
por defecto+refs/heads/*:refs/remotes/origin/*
, es decir, la+
versión, ¿no? (Eso significa que el origen / sucursal se sobrescribirá, sin importar dónde esté el origen / sucursal en este momento localmente)git --tags
estaban buscando etiquetas además de todo lo demás. Ver la respuesta de @VonC.En la mayoría de las situaciones,
git fetch
debe hacer lo que quiera, que es 'obtener algo nuevo del repositorio remoto y ponerlo en su copia local sin fusionarse con sus sucursales locales'.git fetch --tags
hace exactamente eso, excepto que no obtiene nada excepto nuevas etiquetas.En ese sentido,
git fetch --tags
de ninguna manera es un superconjunto degit fetch
. De hecho, es exactamente lo contrario.git pull
, por supuesto, no es más que una envoltura para agit fetch <thisrefspec>; git merge
. Se recomienda que uno se acostumbra a hacer manual degit fetch
ING ygit merge
ing antes de hacer el salto agit pull
simplemente porque ayuda a entender lo quegit pull
está haciendo en primer lugar.Dicho esto, la relación es exactamente la misma que con
git fetch
.git pull
es el superconjunto degit pull --tags
.fuente
git pull
no no conseguir todas las etiquetas, pero sólo aquellos accesible desde los directores de las sucursales actuales. Sin embargo,git pull --tags
obtiene todas las etiquetas y aparentemente es equivalente agit fetch --tags
.funciona bien, solo obtendrá nuevas etiquetas y no obtendrá ninguna otra base de código.
fuente
upstream
se llama normalmenteorigin
. Creo queupstream
es un nombre usado por GitHub. En cualquier caso, el nombre a usar es el que se muestra congit remote
.