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 agit 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) enFETCH_HEAD
, y no en la rama ''master
'' o la rama ''remotes/origin/master
'' remotas / de seguimientoremotes/origin/master
(de la answer de Jakub Narębski )
En otras palabras, no especificó el destino de su refspec