2012-08-09 18 views
18

Esto es principalmente de naturaleza curiosa ya que estoy tratando de familiarizarme con Git. He revisado la documentación de 'git fetch' pero no veo una explicación obvia para el siguiente. Gracias de antemano, y me disculpo si esto es aullantemente obvio.git fetch vs. git fetch origin master tienen diferentes efectos en la rama de seguimiento

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

2) en HostA, realizo un cambio en un archivo, digamos README.txt, y lo confirmo.
En este punto de HostA, las confirmaciones de las ramas master y origin/master están, como se esperaba diferente ya que no he empujado todavía

informe
git show master 
git show origin/master 

diferentes valores hash (ya master tiene el cambio y origin/master no lo hace)

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


4) Ahora, a lo largo de HostB, si hago lo siguiente:

git fetch 
git merge FETCH_HEAD 

después, el HostB master y origin/master informe el mismo hash cuando se les pregunta con git show

PERO

si en cambio lo hubiera hecho, en HostB:

git fetch origin master 
git merge FETCH_HEAD 

en ese punto, los valores hash aún difieren. informe

git show origin 
git show origin/master 

diferente hashes

la rama de seguimiento origin/master no se actualiza hasta que lo haga una llanura git fetch

¿Por qué es esto?

+0

Casi duplicado: (el hecho de que sea pull, not fetch, no hace diferencia de material) http://stackoverflow.com/questions/1741143/git-pull-origin- mybranch-leaves-local- mybranch-n- commits-ahead-of-origin-why –

Respuesta

20

Si su rama tiene un remote tracking branch asociada eso 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 explican la diferencia entre los dos comandos es:

<refspec> 

El formato de un parámetro <refspec> es una opción más +, seguido de la fuente ref <src>, seguido de dos puntos :, seguido de la referencia de destino <dst>.
Se busca la referencia remota que coincide con <src>, y si <dst> no es cadena vacía, la referencia local que coincide con ella se reenvía rápidamente usando <src>.

Repito que:

si <dst> no es una cadena vacía, el árbitro local que coincide que avanza rápidamente usando <src>.
Sabiendo que:

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

  • git fetch origin master es equivalente a "git fetch origin master:", no a "git fetch origin master:master"; que almacena valor captado de 'master' rama (del mando a distancia 'origin ') en FETCH_HEAD, y no en' master' sucursal o remota de seguimiento 'remotes/origin/master' rama (de Jakub Narębski 's answer)
    En otras palabras, no lo hiciste 't especificar el destino de su refspec

+0

Hola VonC: Muchas gracias, eso es exactamente lo que necesitaba saber. – Xoanon93

+0

@ Xoanon93 De nada. Siempre vuelvo a http://stackoverflow.com/questions/1070496/having-a-hard-time-understanding-git-fetch cuando tengo dudas sobre las sucursales de rastreo remoto. – VonC

+2

me duele el cerebro. –

0

La respuesta se encuentra en los mensajes que recibe de git fetch. En el primer caso, al recuperar sin proporcionar un refspec, verá 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 

Nota cómo el mensaje dice que origin/master se actualiza con el maestro desde el origen.

Ahora bien, en el segundo caso, donde se especifica la refspec, se 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 eso, cuando se especifica el refspec, la rama de seguimiento remoto (origin/master) no se actualiza, sólo se FETCH_HEAD.

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

0

Si desea avanzar rápidamente combinar usted mismo, o usar git pull. Parece que no entiendes que el propósito de Git fetch NO es actualizar tu árbol de trabajo. La finalidad de Fetch es actualizar tus rastreos de seguimiento.

Cuestiones relacionadas