Tener dificultades para entender git-fetch
Me cuesta entender los matices de git-fetch. Entiendo que al hacer un fetch
, se obtienen las referencias remotas en una rama de seguimiento local.
Aunque tengo algunas preguntas:
¿Es posible que no exista una sucursal de seguimiento local? Si es así, ¿se creará automáticamente?
¿Qué pasará si hago un envío
fetch
y especifico una sucursal sin seguimiento como destino?La página de manual de git-fetch especifica:
git-fetch <options> <repository> <refspec>
¿Cómo usaría refspec para recuperar contenidos de mi maestro remoto en su rama de seguimiento remoto? Creo que esto puede ser posible si mi HEAD actual está en master y ejecuto
git fetch origin master
Sin embargo, ¿puedo usar <+?src:dest>
refspec para lograr lo mismo? Creo que esto me ayudará a comprender mejor los conceptos.
Y una pregunta más:
Mi archivo .git/config tiene la siguiente línea para recuperar (mostrando solo las líneas relevantes):
fetch = +refs/heads/*:refs/remotes/origin/*
¿Alguien puede explicar qué significa exactamente esta línea?
En primer lugar, no existe el concepto de sucursales de " seguimiento local ", sólo sucursales de " seguimiento remoto ". Entonces origin/master es una rama de seguimiento remoto para master en el repositorio de origen .
Normalmente lo que hace es git fetch $remote
actualizar todas sus ramas de seguimiento remoto y crear otras nuevas si es necesario.
Sin embargo, también puede especificar una especificación de referencia, pero eso no afectará sus ramas de seguimiento remoto; en cambio, buscará la rama que especificó y la guardará en FETCH_HEAD
, a menos que especifique un destino. En general, no querrás meterte con esto.
Finalmente:
fetch = +refs/heads/*:refs/remotes/origin/*
Eso significa que si lo haces
git fetch origin
En realidad servirá:
git fetch origin +refs/heads/*:refs/remotes/origin/*
Lo que significa que un control remoto heads/foobar será el control remoto local/origin/foobar , y el signo más significa que se actualizarán incluso si no es un avance rápido.
Por lo tanto, su origen/foobar local siempre será el mismo que foobar en el control remoto de origen (después de ejecutar git fetch
). Y origen/maestro obviamente será el mismo que maestro en el control remoto de origen . También lo harán todas las demás ramas de seguimiento remoto.
Felipec ha respondido la mayoría de las cuestiones en cuestión en su respuesta .
Quedan algunos (la mayoría tomados de la página de manual de git fetch ; desafortunadamente, está un poco anticuado en algunos lugares):
Si la rama de seguimiento remoto (rama que rastrea alguna rama en algún repositorio remoto) no existe, se creará.
La rama a la que accede (
<dst>
in[+]<src>:<dst>
) no necesita residir en elremotes/<remote>/
espacio de nombres. Por ejemplo, para duplicar repositorios (git clone --mirror
), refspec es 1 a 1. En los viejos tiempos, antes del diseño de controles remotos separados (antesremotes/<remote>/
del espacio de nombres para las referencias de seguimiento remoto), la rama maestra se recuperaba en una rama llamada origen . Incluso actualmente las etiquetas se recuperan directamente entags/
el espacio de nombres en forma de espejo.Si la rama a la que está accediendo (el lado derecho de refspec
<src>:<dst>
existe, Git comprobaría si la descarga daría como resultado un avance rápido, es decir, si el estado actual<dst>
es el antecesor del estado en<src>
un repositorio remoto determinado. Si no es así, y no usa la opción-f
/--force
para git-fetch, o prefija refspec con '+' (use+<src>:<dst>
refspec) fetch se negaría a actualizar esa rama.git fetch origin master
es equivalente agit fetch origin master:
, no agit fetch origin master:master
; almacena el valor recuperado de la rama maestra (de origen remoto ) en FETCH_HEAD , y no en la rama maestra o enremotes/origin/master
la rama de seguimiento remoto. Puede ir seguido degit merge FETCH_HEAD
. Por lo general, no se usa directamente, sino como parte de una extracción única sin configurar la rama de seguimiento remoto:git pull <URL> <branch>
.+refs/heads/*:refs/remotes/origin/*
como valor para la variable de configuración remota.origin.fetch significa que cada rama (ref en elrefs/heads/
espacio de nombres) en el origen remoto se recupera en la rama de seguimiento remoto con nombre respectivo enrefs/remotes/origin/
el espacio de nombres, por ejemplo , la rama maestra en origen (es decir,refs/heads/master
referencia) se buscaría en origen/maestro rama de seguimiento remoto (es decir,refs/remotes/origin/master
ref). El prefijo '+' significa que la recuperación se realizará correctamente incluso en casos que no sean de avance rápido, lo que significa que cuando la bifurcación en el control remoto se reestablece, se rebobina (se restablece a algún estado anterior) o se modifica de otro modo.
Nota al margen: probablemente desee utilizar el comando remoto git de nivel superior para administrar repositorios remotos y obtener actualizaciones.