2012-01-16 10 views
15

Tienes un archivo que tiene dos confirmaciones de interés, tanto en la rama Master, tanto modificando solamente un único archivo foo: la confirmación anterior AA, y la versión actual de HEAD. Me gustaría fusionar las dos versiones del archivo, manteniendo bits de ambos, en HEAD en Master.Git: Combinar edad comprometerse en la versión actual jefe

que hice lo más simple que pensé que trabajar:

git checkout -b merge-purgatory AA 
git commit -m "pulled foo back from previous commit for merging into HEAD." 
git checkout master 
git merge merge-purgatory 

que simplemente se sobrescribe la versión actual de HEADfoo con la versión AA. Probé el más detallado git checkout -m también, el mismo resultado: una sobreescritura tonta.

¿Cómo forzo a git a tratar la versión AA de foo como una combinación conflictiva con la versión actual HEAD?

Respuesta

14

Si fusión de Git no está haciendo lo que quiere, se puede hacer lo siguiente en su lugar:

  1. Asegúrese de que no hay cambios no confirmados en el archivo foo, por ejemplo, asegurándose de que git status esté limpio.
  2. Sobrescribir foo con la versión de AA usando: git show AA:foo > foo
  3. etapa selectivamente sólo los cambios de foo que desees: git add -p foo
  4. descartar todos los otros cambios en foo con git checkout -- foo
  5. confirmar los cambios por etapas: git commit

Alternativamente, si prefiere usar una herramienta de diferencia gráfica (como meld), Usted podría hacer:

git show AA:foo > old-foo 
meld old-foo foo 
+2

Así que, básicamente, omita el conocimiento de git sobre la confirmación anterior y use una combinación manual/combinación de herramientas. Estaba esperando un comportamiento más cromático de git, pero esto es tan simple que lo utilicé con éxito y luego hice un poco de limpieza después. ¡Gracias! – Noel

1
git merge --no-commit merge-purgatory 

al menos le daría la oportunidad de revisar: cambiar la fusión antes de comprometerlo.
Consulte también las técnicas propuestas en "How do you merge selective files with git-merge?", basadas en la recolección de cerezas o el pago y envío.


En cuanto a obligar a la fusión manual, se podría declarar en un .gitatributes file, para ese archivo específico, una política de combinación conexión a desconexión.

Realización de una de tres vías se fusionan

fusión

The attribute merge affects how three versions of a file is merged when a file-level merge is necessary during git merge, and other commands such as git revert and git cherry-pick. 
Unset 

Tomar la versión de la rama actual como el resultado de la fusión tentativa, y declarar que la fusión tiene conflictos. Esto es adecuado para archivos binarios que no tienen una semántica de fusión bien definida.

+0

¿Está "revisión: cambiar" un comando o interruptor de opción? – Noel

+0

Y, en cualquier caso, "La fusión automática fue bien; se detuvo antes de confirmar lo solicitado" no responde completamente a mi pregunta: cómo evitar que se produzca la "Combinación automática" y en su lugar trata las dos versiones como conflictivas (son, sobreescribiendo las líneas de cada uno) y requiriendo una fusión manual? – Noel

+0

@Noel: lo siento, eliminé la parte de fusión manual. He editado mi respuesta. – VonC

3

Las respuestas anteriores no mantienen la historia del cambio, por lo que el hecho de que utilizó la confirmación anterior para generar el nuevo commit. El siguiente procedimiento mantendrá esta historia.

git checkout -b merge-purgatory AA 

Aquí necesita modificar ligeramente su archivo, por ejemplo, puede agregar una línea vacía. Luego

git commit "pulled foo back from previous commit for merging into HEAD." 
git checkout master 
git merge --no-commit merge-purgatory 

De esta forma, la fusión fallará y, entonces, todo lo que tiene que hacer es solucionar el conflicto. Esto funcionó para mí.

Cuestiones relacionadas