He configurado algunas ramas de seguimiento remoto en git, pero parece que nunca puedo fusionarlas en la rama local una vez que las he actualizado con 'git fetch'.
Por ejemplo, supongamos que tengo una rama remota llamada 'an-other-branch'. Lo configuré localmente como una rama de seguimiento usando
git branch --track an-other-branch origin/an-other-branch
Hasta aquí todo bien. Pero si esa rama se actualiza (generalmente moviendo la máquina y comprometiéndome desde esa 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
Siempre que hago esto, recibo un mensaje de 'Ya actualizado' y nada se fusiona.
Sin embargo, un
git pull origin an-other-branch
siempre lo actualiza como cabría esperar.
Además, ejecutando git diff
git diff origin/an-other-branch
muestra que hay diferencias, así que creo que tengo una sintaxis incorrecta.
¿Qué estoy haciendo mal?
EDITAR [2010-04-09]: Lo he comprobado un par de veces, y definitivamente no estoy en una rama diferente. ¿Mi 'git fetch' seguido de un 'git merge' (como se muestra arriba) debería hacer exactamente lo mismo que un git pull? Obtendré un flujo de trabajo que muestre los resultados de un estado de git, etc.
git fetch origin an-other-branch
almacena la propina recuperadaFETCH_HEAD
, pero noorigin/an-other-branch
(es decir, la "rama de seguimiento remoto" habitual). Entonces, uno podría hacerlogit fetch origin an-other-branch && git merge FETCH_HEAD
, pero hacerlo como dice @Gareth es mejor (o simplemente use git pull ).git merge origin/an-other-branch
fusionaráorigin/an-other-branch
con todas las sucursales locales que están configuradas para rastrearlo? ¿Cómo puedo fusionarme en una sola sucursal local?git pull
(sin argumentos)? ¿Qué rama se fusiona? ¿Fusiona la rama de seguimiento remoto correspondiente a la rama actual ?Seleccionando solo una rama:
fetch
/merge
vs.pull
La gente suele aconsejarle que separe "buscar" de "fusionar". Dicen en lugar de esto:
hacer esto:
Lo que no mencionan es que tal comando de recuperación en realidad recuperará todas las ramas del repositorio remoto, que no es lo que hace ese comando de extracción. Si tiene miles de ramas en el repositorio remoto, pero no desea verlas todas, puede ejecutar este comando poco conocido:
Por supuesto, eso es ridículamente difícil de recordar, por lo que si realmente desea evitar buscar todas las ramas, es mejor modificar su
.git/config
como se describe en ProGit.¿Eh?
La mejor explicación de todo esto se encuentra en el Capítulo 9-5 de ProGit, Git Internals - The Refspec ( o vía github ). Eso es increíblemente difícil de encontrar a través de Google.
Primero, necesitamos aclarar algo de terminología. Para el seguimiento de sucursales remotas, generalmente hay 3 sucursales diferentes que debe tener en cuenta:
refs/heads/branchB
dentro del otro repositoriorefs/remotes/remoteR/branchB
en su repositoriorefs/heads/branchB
dentro de tu repositorioLas ramas de seguimiento remoto (en
refs/remotes
) son de solo lectura. No los modifica directamente. Modifica su propia rama y luego empuja a la rama correspondiente en el repositorio remoto. El resultado no se refleja en surefs/remotes
hasta después de una extracción o recuperación adecuada. Esa distinción me resultó difícil de entender a partir de las páginas de manual de git, principalmente porquerefs/heads/branchB
se dice que la rama local ( ) "rastrea" la rama de seguimiento remoto cuando se.git/config
definebranch.branchB.remote = remoteR
.Piense en 'refs' como punteros de C ++. Físicamente, son archivos que contienen resúmenes SHA, pero básicamente son solo indicadores del árbol de confirmación.
git fetch
agregará muchos nodos a su árbol de confirmación, pero la forma en que git decide qué punteros mover es un poco complicado.Como se menciona en otra respuesta , ninguno
ni
se movería
refs/remotes/branches/branchB
, y este último ciertamente no puede moverserefs/heads/branchB
. Sin embargo, ambos se muevenFETCH_HEAD
. (Puede ingresarcat
cualquiera de estos archivos.git/
para ver cuándo cambian). Ygit merge
se referirá aFETCH_HEAD
, mientras se configuraMERGE_ORIG
, etc.fuente
¿Está seguro de que está en el local
an-other-branch
cuando se fusiona?La otra explicación :
Pero en su caso, si
git pull
funciona, eso solo significa que no está en la rama correcta.fuente
Git pull es en realidad una herramienta combinada: ejecuta git fetch (obteniendo los cambios) y git merge (fusionándolos con su copia actual)
¿Estás seguro de que estás en la rama correcta?
fuente
estos son los comandos:
si hace esto en la segunda línea:
intentará fusionar el maestro local en su rama actual.
La pregunta, según tengo entendido, fue que ya lo buscó localmente y ahora desea fusionar su rama con la última de la misma rama.
fuente