Tener dificultades para entender git-fetch

Resuelto Parag asked hace 15 años • 4 respuestas

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:

  1. ¿Es posible que no exista una sucursal de seguimiento local? Si es así, ¿se creará automáticamente?

  2. ¿Qué pasará si hago un envío fetchy especifico una sucursal sin seguimiento como destino?

  3. 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?

Parag avatar Jul 02 '09 00:07 Parag
Aceptado

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 $remoteactualizar 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 avatar Jul 01 '2009 19:07 FelipeC

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 el remotes/<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 (antes remotes/<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 en tags/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/ --forcepara git-fetch, o prefija refspec con '+' (use +<src>:<dst>refspec) fetch se negaría a actualizar esa rama.

  • git fetch origin masteres equivalente a git fetch origin master:, no a git 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 en remotes/origin/masterla rama de seguimiento remoto. Puede ir seguido de git 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 el refs/heads/espacio de nombres) en el origen remoto se recupera en la rama de seguimiento remoto con nombre respectivo en refs/remotes/origin/el espacio de nombres, por ejemplo , la rama maestra en origen (es decir, refs/heads/masterreferencia) se buscaría en origen/maestro rama de seguimiento remoto (es decir, refs/remotes/origin/masterref). 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.

Jakub Narębski avatar Jul 01 '2009 20:07 Jakub Narębski