El buscador de git fetch vs. git fetch tiene diferentes efectos en la twig de seguimiento

Esto es principalmente de naturaleza de curiosidad ya que estoy tratando de familiarizarme con Git. He revisado la documentation de 'git fetch' pero no veo una explicación obvia para el siguiente. Gracias de antemano, y me disculpo si esto es aullantemente obvio.

1) Desde un repository central, digamos GitHub, clono un repository llamado website en cada una de las dos máquinas, HostB y HostB .

2) en HostA , realizo un cambio en un file, digamos README.txt , y lo confirmo.
En este punto en HostA , los commits para branches master y origin/master son, como se esperaba, diferentes ya que aún no he empujado

 git show master git show origin/master 

informa diferentes hashes (dado que el master tiene el cambio y el origin/master no)

3) Una vez que presiono, ellos son después de lo mismo.


4) Ahora, más en HostB , si hago lo siguiente:

 git fetch git merge FETCH_HEAD 

después, en HostB master y origin/master informan el mismo hash cuando se les consulta con git show

PERO

si en cambio lo hubiera hecho, en HostB :

 git fetch origin master git merge FETCH_HEAD 

en ese punto los hashes aún difieren.

 git show origin git show origin/master 

informa diferentes hashes

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

¿Por qué es esto?

Si su sucursal tiene una twig de seguimiento remoto asociada, significa que su configuration es similar a:

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

La parte key de git fetch que explica la diferencia entre los dos commands es:

 <refspec> 

El formatting de un parámetro <refspec> es un plus + opcional, seguido de la fuente ref <src> , seguido de dos puntos : seguido de la reference de destino <dst> .
Se obtiene la reference remota que coincide con <src> , y si <dst> no es cadena vacía, la reference local que coincide con ella se reenvía rápidamente utilizando <src> .

Déjame repetirlo:

si <dst> no es una cadena vacía, la reference local que coincide con ella se reenvía rápidamente utilizando <src> .
Sabiendo que:

  • git fetch es equivalente a git fetch origin master:master (del valor pnetworkingeterminado de la configuration de su twig), por lo que actualizará la twig de seguimiento remoto: el destino de la especificación se especifica 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 twig ' master ' (del ' origin ' remoto) en FETCH_HEAD , y no en la twig ' master ' o en la twig ' remotes/origin/master ' de seguimiento remotes/origin/master (a partir de la respuesta de Jakub Narębski )
    En otras palabras, no especificó el destino de su refspec

La respuesta está en los posts que recibes de git fetch . En el primer caso, cuando recupera sin proporcionar un refspec, verá que las twigs 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 post dice que el origen / maestro se actualiza con el maestro desde el origen.

Ahora en el segundo caso, donde especificas el refspec, obtienes 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 twig de seguimiento remoto (origen / maestro) NO se actualiza, solo FETCH_HEAD.

El resultado final es que parecerás estar por 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 pequeña peculiaridad interesante del command fetch.

Si quieres avanzar rápido, únete o usa git pull. Parece que no entiendes que el propósito de Git fetch NO es actualizar tu tree de trabajo. La finalidad de Fetch es actualizar tus rastreos de seguimiento.