2012-06-07 15 views
55

Tengo dos ramas con el mismo archivo exacto (en caso de que se esté preguntando si es un archivo .sql) y quiero fusionarlo de forma interactiva.Git Interactive Merge?

Bastante quiero abrir un programa diff como lo hago cuando hay un conflicto (o línea de comando) y seleccionar exactamente qué líneas van a dónde.

¿Hay alguna forma de hacerlo?

Respuesta

52

Sí, pero será mayormente al hacerlo manualmente. Le dirá a Git que está fusionando las dos ramas relevantes, pero que no debe tratar de confirmar el resultado, (editado para agregar: ni avanzar si cree que la fusión es trivial):

git merge --no-commit --no-ff branch-to-merge 

Entonces usted va a pedir git para el archivo tal como apareció en las dos ramas:

git show HEAD:filename >filename.HEAD 
git show branch-to-merge:filename >filename.branch 

y su base de mezcla,

git show `git merge-base HEAD branch-to-merge`:filename >filename.base 

Vas a combinarlos USI ng cualquier herramienta que desee (por ejemplo)

meld filename.{HEAD,branch,base} 

podrás etapa que (git add filename), y luego confirmar la fusión (git commit).

+4

Y haces todo esto ¿cómo ...? –

+1

Preguntándome lo mismo Graham ... Intenté hacer 'git merge --no-commit branch' y terminó fusionándolo ... Lo que me gustaría es terminar con 3 archivos, o 2 archivos. Que podría usar un diff y mover todo lo que quiero en ese archivo. – Steven

+0

Si desea que el comando original de fusión deje * todo * solo, para hacerlo manualmente, puede llamarlo como 'git merge -s ours' para mantener todo como está en la rama actual, pero entonces depende de usted asegúrese de que los cambios en otros archivos terminen. – Novelocrat

1

Puede usar simplemente WinMerge, DiffMerge o cualquier herramienta de interfaz de usuario diff/merge disponible para realizar el trabajo de forma manual. Si desea conectarlo a "git difftool", puede buscar en línea para que esas herramientas funcionen con git.

35

La manera más fácil es hacer git merge <other_branch luego git mergetool para resolver gráficamente los conflictos. Vea # 10935226 para saber cómo configurar mergetool.

El problema es que su archivo modificado puede fusionarse rápidamente con el anterior. Entonces tienes que ser un poco más inteligente.

Novelocrat ofrece una excelente manera de profundizar un poco más, pero a menudo tendrá que cambiar el comando inicial a git merge --no-commit --no-ff <other_branch> porque --no-commit realmente significa "No cometer la fusión ... a menos que sea un fast- fusión hacia adelante ". Es un poco agudo para muchas personas que intentan hacer exactamente lo que quieres.

A veces la forma menos confusa no es muy elegante: verifique la otra rama en una copia de trabajo diferente, use su herramienta de combinación favorita para obtener la versión que desee en el directorio que desee y luego confírmela.

+1

10935226 es el número de esta pregunta. ¿Qué quisiste escribir allí? –

21

Según esta idea, donde la temperatura podría ser una rama existente.

https://gist.github.com/katylava/564416


El maestro:

git checkout -b temp 

En temp:

git merge --no-commit --no-ff refactor 

... que pone en escena todo, así:

git reset HEAD 

luego, incrementar las piezas que desee:

git add --interactive 
+1

Esto funcionó, pero tuve que dejar 'cabeza' en 'git reset head', pero el reinicio de git funcionó bien. – Micah

+0

¡Un último 'commit de git' no hace una fusión! - ¿Cómo termino la fusión al final? –

+0

@RobertSiemer Quizás supongo que puedes hacer una fusión normal en los siguientes pasos: git co master; git merge temp –

13

De la rama que desea combinar en:

git checkout -p branch_to_merge -- 

Esto no va a obtener de la branch_to_merge, pero le permitirá añadir trozos de forma interactiva el parche (diff).

http://git-scm.com/docs/git-checkout

0

La mejor manera que he encontrado para hacer esto es:

  1. Pedido la rama con sus cambios
  2. Crear una nueva rama de ese punto
  3. Restablecer su nueva rama de el compromiso con el que desea comparar y construir. El restablecimiento será un restablecimiento "mixto" por defecto, lo que significa que no cambiará el "árbol de trabajo", es decir, los archivos de código reales
  4. En este punto, mi editor de texto (VSCode) me muestra qué es diferente entre mi actual archivos y la confirmación a la que reinicié mi Puedo editar el código para seleccionar qué líneas quiero comprometer. Lo que esto hace es permitirme ver todo lo que mi rama ha cambiado y confirmar cada línea de código que comprometeré. Esto es útil, como antes de fusionar mis cambios nuevamente en la producción.