¿Cómo se resuelven los conflictos de fusión en Git?
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.
Identifique qué archivos están en conflicto (Git debería decírselo).
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.
Una vez que hayas resuelto el conflicto en un archivo git add the_file
.
Una vez que hayas resuelto todos los conflictos, haz git rebase --continue
o cualquier comando
Git haya dicho que hagas cuando hayas completado.
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.