14 Conflictos avanzados

14.1 Herramientas gráficas de fusión

git mergetool

Invoca una herramienta externa configurada (como vimdiff, meld o kdiff3) para resolver conflictos de forma visual en vez de editar los marcadores a mano.

14.2 git rerere

Las siglas significan reuse recorded resolution. Cuando está activado (git config rerere.enabled true), Git recuerda cómo se resolvió un conflicto la primera vez y aplica automáticamente la misma resolución si el mismo conflicto vuelve a aparecer más adelante. Es especialmente útil durante rebases largos, donde el mismo conflicto puede repetirse en cada commit reaplicado.

14.3 Conflictos durante un rebase

A diferencia de un merge, donde un conflicto se resuelve una sola vez, un rebase puede generar conflictos en cada commit que se reaplica. Al encontrar uno, Git detiene el proceso; tras resolverlo:

git add archivo-resuelto.txt
git rebase --continue

o, para saltar por completo el commit conflictivo:

git rebase --skip

o para cancelar el rebase y volver al estado anterior:

git rebase --abort

14.4 Elegir un lado completo del conflicto

Cuando se sabe de antemano que un archivo entero debe quedar como estaba en una de las dos ramas, sin combinar nada:

git checkout --ours archivo.txt    # conserva la versión de la rama actual
git checkout --theirs archivo.txt  # conserva la versión de la rama entrante
git add archivo.txt

Conviene notar que durante un rebase el significado de "ours" y "theirs" se invierte respecto a un merge, porque internamente un rebase aplica los commits de la rama propia sobre la otra, tratándola como base.