Cómo crear "git fetch" y "git merge" desde una rama de seguimiento remoto (por ejemplo, "git pull")

Creé varias sucursales de seguimiento remoto en git, pero nunca puedo combinarlas en una sucursal local después de haberlas actualizado con git fetch.

Por ejemplo, supongamos que tengo una sucursal remota llamada "an-other-branch". Lo instalé localmente como una rama de seguimiento usando

 git branch --track an-other-branch origin/an-other-branch 

Hasta aquí todo bien. Pero si esta rama se actualiza (como regla general, usando una máquina en movimiento y trabajando con esta máquina), y quiero actualizarla en la máquina original, tengo problemas con la búsqueda / fusión:

 git fetch origin an-other-branch git merge origin/an-other-branch 

Cada vez que hago esto, recibo el mensaje "Ya el más moderno" y nada se fusiona.

Sin embargo un

 git pull origin an-other-branch 

Siempre lo actualiza, como es de esperar.

También corriendo git diff

 git diff origin/an-other-branch 

muestra que hay diferencias, así que creo que tengo la sintaxis incorrecta.

¿Qué estoy haciendo mal?

EDITAR [2010-04-09]: Lo comprobé un par de veces y definitivamente no estoy en otra sucursal. ¿Debería mi git buscar y luego git fusionar (como se muestra arriba) hacer lo mismo que git pull? Obtendré un flujo de trabajo que muestra los resultados del estado de Git, etc.

101
08 апр. conjunto por kaybenleroll 08 abr. 2010-04-08 21:45 '10 a las 21:45 2010-04-08 21:45
@ 5 respuestas

No obtienes una rama, obtienes toda la consola:

 git fetch origin git merge origin/an-other-branch 
153
08 апр. La respuesta es dada por Gareth 08 de abril. 2010-04-08 22:08 '10 a las 10:08 pm 2010-04-08 22:08

Selección de una sola rama: fetch / merge vs. pull

La gente a menudo le aconseja separar el "muestreo" de la "fusión". En su lugar, dicen:

  git pull remoteR branchB 

haga lo siguiente:

  git fetch remoteR git merge remoteR branchB 

Lo que no mencionan es que dicho comando de extracción extraerá todas las ramas de un repositorio remoto, que no es lo que hace el comando de extracción. Si hay miles de sucursales en un repositorio remoto, pero no quieres verlas, puedes ejecutar este comando oscuro:

  git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB git branch -a # to verify git branch -t branchB remoteR/branchB 

Por supuesto, es ridículo recordarlo, por lo que si realmente desea evitar muestrear todas las sucursales, es mejor cambiar su .git/config , como se describe en ProGit.

Eh

La mejor explicación para todo esto en el Capítulo 9-5 de ProGit, Git Internals es Refspec ( o vía github ). Es sorprendentemente difícil de encontrar a través de Google.

border=0

Primero, necesitamos aclarar algunos términos. Para rastrear ramas remotas, se conocen 3 ramas diferentes:

  • En respuesta a un repositorio remoto: refs/heads/branchB dentro de otro repositorio
  • Seguimiento de seguimiento refs/remotes/remoteR/branchB en su repositorio
  • Tu propio compartimiento: refs/heads/branchB dentro de tu repositorio

El seguimiento de seguimiento remoto (en refs/remotes ) es de solo lectura. No los cambias directamente. Cambia su rama, y ​​luego hace clic en la rama correspondiente en el repositorio remoto. El resultado no se refleja en sus refs/remotes hasta que se haya realizado la extracción o selección correspondiente. Esta distinción fue difícil de entender desde las páginas de manual de git, principalmente porque la rama local ( refs/heads/branchB ) se denomina rama de "seguimiento" del seguimiento remoto cuando .git/config define branch.branchB.remote = remoteR .

Piense en "refs" como punteros de C ++. Físicamente, estos son archivos que contienen resúmenes de SHA, pero en su mayoría son solo indicadores del árbol de confirmación. git fetch agregará muchos nodos a tu árbol de compromiso, pero cómo git decide qué punteros mover es un poco más complicado.

Como se menciona en la otra respuesta , tampoco

  git pull remoteR branchB 

ninguno

  git fetch remoteR branchB 

refs/remotes/branches/branchB se moverá, y el último, por supuesto, no se puede mover refs/heads/branchB . Sin embargo, ambos mueven FETCH_HEAD . (Puede activar cualquiera de estos archivos dentro de .git/ see cuando cambian). Y git merge se referirá a FETCH_HEAD al instalar MERGE_ORIG , etc.

66
18 янв. la respuesta se da cdunn2001 18 jan. 2011-01-18 02:32 '11 a las 2:32 2011-01-18 02:32

¿Estás seguro de que estás en una an-other-branch local an-other-branch cuando te fusionas?

 git fetch origin an-other-branch git checkout an-other-branch git merge origin/an-other-branch 

otra explicación :

todos los cambios de la rama que está intentando fusionar ya se han combinado con la rama en la que se encuentra actualmente.
Más específicamente, esto significa que la rama que está intentando fusionar es la matriz de su rama actual.

Si está delante de un repositorio remoto con un pestillo, este es un repositorio remoto que está desactualizado y no usted.

Pero en tu caso, si git pull funciona, significa que no estás en la rama correcta.

9
08 апр. La respuesta se da VonC 08 de abril. 2010-04-08 21:52 '10 a las 9:52 PM 2010-04-08 21:52

Git pull es en realidad una herramienta combinada: ejecuta git fetch (obteniendo cambios) y git merge (combinándolos con la copia actual)

¿Estás seguro de que estás en la rama correcta?

2
08 апр. La respuesta se da RDL 08 apr. 2010-04-08 21:54 '10 a las 21:54 2010-04-08 21:54

estos son comandos:

 git fetch origin git merge origin/somebranch somebranch 

Si haces esto en la segunda línea:

 git merge origin somebranch 

intentará fusionar el asistente local en su rama actual.

La pregunta, tal como la entiendo, fue elegida por usted ya localmente y ahora quiere fusionar su sucursal con la última rama de la misma .

1
21 июля '13 в 20:50 2013-07-21 20:50 la respuesta la da user1524957 21 de julio de 2013 a las 20:50 2013-07-21 20:50

Otras preguntas sobre tags o Haz una pregunta