remote origin comandos git branch tracking fetch

comandos - git fetch frente a git fetch origin master tienen diferentes efectos en el rastreo de rama



git remote (3)

La respuesta está en los mensajes que recibes de git fetch . En el primer caso, cuando recuperas sin proporcionar un refspec, verás que las ramas de seguimiento remoto se actualizan:

remote: Counting objects: 5, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From /depot c67d1c8..1941673 master -> origin/master

Observe cómo el mensaje dice que el origen / maestro se actualiza con el maestro desde el origen.

Ahora, en el segundo caso, donde especifica la refspec, obtiene algo completamente diferente:

remote: Counting objects: 5, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From /depot * branch master -> FETCH_HEAD

Por lo tanto, cuando especifica el refspec, la rama de seguimiento remoto (origen / maestro) NO se actualiza, solo FETCH_HEAD.

El resultado final es que parecerás estar delante del origen / maestro cuando en realidad no lo estás. No puedo imaginar por qué este comportamiento sería deseable, pero definitivamente es una peculiaridad interesante del comando fetch.

Esto es principalmente de la naturaleza de una curiosidad ya que estoy tratando de familiarizarme con Git. He consultado la documentación de ''git fetch'', pero no veo una explicación obvia para lo siguiente. Gracias de antemano, y disculpas si esto es muy obvio.

1) Desde un repositorio central, digamos GitHub, cloné un repositorio denominado website en cada una de las dos máquinas, HostB y HostB .

2) en HostA , hago un cambio en un archivo, digo README.txt , y lo confirmo.
En este punto en HostA , las confirmaciones para el master sucursales y el origin/master son, como se esperaba, diferentes, ya que no he empujado aún

git show master git show origin/master

Reportar diferentes hashes (ya que el master tiene el cambio y el origin/master no)

3) Una vez que empujo, después de eso son lo mismo.

4) Ahora, sobre HostB , si hago lo siguiente:

git fetch git merge FETCH_HEAD

luego, en HostB master y origin/master reportan el mismo hash cuando se consulta con git show

PERO

Si por el contrario lo hubiera hecho, en HostB :

git fetch origin master git merge FETCH_HEAD

En ese punto los hashes todavía difieren.

git show origin git show origin/master

reportar diferentes hashes

El origin/master rama de seguimiento no se actualiza hasta que hago una git fetch simple

¿Por qué es esto?


Si quieres avanzar rápido, combínate o usa git pull. Parece que no entiendes que el propósito de git fetch NO es actualizar tu árbol de trabajo. Fetch está destinado a actualizar sus ramas de seguimiento.


Si su sucursal tiene una sucursal de seguimiento remoto asociada, significa que su configuración es como:

git config branch.[branch-name].remote [remote-name] git config branch.[branch-name].merge [remote-master]

La parte clave de git fetch que explica la diferencia entre los dos comandos es:

<refspec>

El formato de un parámetro <refspec> es un signo más + opcional, seguido de la referencia de origen <src> , seguido de dos puntos : seguido de la referencia de destino <dst> .
La referencia remota que coincide con <src> se recupera, y si <dst> no es una cadena vacía, la referencia local que coincide con ella se reenvía rápidamente usando <src> .

Déjame repetirlo:

Si <dst> no es una cadena vacía, la referencia local que coincide con ella se adelanta usando <src> .
Sabiendo que:

  • git fetch es equivalente a git fetch origin master:master (del valor predeterminado de la configuración de su rama), por lo que actualizará la rama de seguimiento remoto: el destino de la refspec está especificado para usted .

  • git fetch origin master es equivalente a " git fetch origin master: ", no a " git fetch origin master:master "; almacena el valor obtenido de la rama '' master '' (del '' origin '' remoto) en FETCH_HEAD , y no en la rama '' master '' o la rama '' remotes/origin/master '' remotas / de seguimiento remotes/origin/master (de la answer de Jakub NarÄ™bski )
    En otras palabras, no especificó el destino de su refspec