Cómo resolver los conflictos de fusión en Git

¿Cómo se resuelven los conflictos de fusión en Git?

Solución

Inténtalo: git mergetool

Abre una interfaz gráfica de usuario que le guía a través de cada conflicto, y usted puede elegir cómo fusionar. A veces requiere un poco de edición manual después, pero normalmente es suficiente por sí mismo. Es mucho mejor que hacerlo todo a mano, ciertamente.

Según el comentario de @JoshGlover:

El comando no necesariamente abre una GUI a menos que instales una. Ejecutar git mergetool para mí resultó en vimdiff siendo utilizado. Puedes instalar una de las siguientes herramientas para usarla en su lugar: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

A continuación se muestra el procedimiento de ejemplo para utilizar vimdiff para resolver conflictos de fusión. Basado en este enlace

Paso 1: Ejecute los siguientes comandos en su terminal

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

Esto establecerá vimdiff como la herramienta de fusión por defecto.

Paso 2: Ejecute el siguiente comando en la terminal

git mergetool

Paso 3: Verá una pantalla de vimdiff con el siguiente formato

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

Estas 4 vistas son

LOCAL - este es el archivo de la rama actual

BASE - ancestro común, cómo era el archivo antes de ambos cambios

REMOTO - archivo que está fusionando en su rama

MERGED - resultado de la fusión, esto es lo que se guarda en el repo

Puedes navegar entre estas vistas usando ctrl+w. Puedes llegar directamente a la vista MERGED usando ctrl+w seguido de j.

Más información sobre la navegación con vimdiff aquí y aquí

Paso 4. Puedes editar la vista MERGED de la siguiente manera

Si quieres obtener los cambios de REMOTE

:diffg RE  

Si desea obtener los cambios de la BASE

:diffg BA  

Si desea obtener los cambios de LOCAL

:diffg LO 

Paso 5. Guardar, Salir, Confirmar y Limpiar

:wqa guardar y salir de vi

git commit -m "mensaje"

git clean Eliminar los archivos extra (por ejemplo *.orig) creados por la herramienta diff.

Comentarios (20)
  1. Identifique qué archivos están en conflicto (Git debería decírselo).

  2. Abre cada archivo y examina los diffs; Git los delimita. Con suerte, será obvio qué versión de cada bloque hay que mantener. Es posible que tengas que discutirlo con los compañeros que han comprometido el código.

  3. Una vez que hayas resuelto el conflicto en un archivo git add the_file.

  4. Una vez que hayas resuelto todos los conflictos, haz git rebase --continue o cualquier comando Git haya dicho que hagas cuando hayas completado.

Comentarios (7)

Si estás haciendo pequeñas confirmaciones frecuentes, entonces empieza por mirar los comentarios de las confirmaciones con git log --merge. Entonces git diff te mostrará los conflictos.

Para los conflictos que implican más de unas pocas líneas, es más fácil ver lo que está pasando en una herramienta GUI externa. Me gusta opendiff -- Git también soporta vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge fuera de la caja y puedes instalar otras: git config merge.tool "your.tool" establecerá tu herramienta elegida y entonces git mergetool después de una fusión fallida te mostrará las diferencias en contexto.

Cada vez que edites un archivo para resolver un conflicto, git add filename actualizará el índice y tu diff ya no lo mostrará. Cuando todos los conflictos estén resueltos y sus archivos hayan sido git add, git commit completará su fusión.

Comentarios (1)