Herramienta de resolución de conflictos de Git que respeta las anotaciones de conflictos

Solía ​​hacer resolución de conflictos con P4merge. Lo encontré bien, pero no presté atención a cómo funciona debajo del capó. Hasta hace muy poco me di cuenta de que intenta hacer la fusión por sí mismo. Como resultado, no muestra los mismos conflictos que git y eso frustró a mi gerente (como en let's switch back to clearcasefrustrado).

La pregunta es: git agrega anotaciones a un archivo que no puede fusionarse de manera similar a estas

<<<<<<< HEAD
    this code
=======
    the other code
>>>>>>> feature/branch-name

¿Existe una herramienta gráfica que lea estas anotaciones y luego le dé la opción de mantener una u otra y luego eliminar las anotaciones?

La herramienta debe ser para Linux y preferiblemente gratuita, pero dado que la organización se hará cargo del costo, también se puede pagar.


ACTUALIZACIÓN: prueba de kdiff3

Desafortunadamente kdiff3tampoco respeta las anotaciones. En primer lugar, la configuración no funcionó, pero no es gran cosa, cambié el .gitconfiga

[mergetool "kdiff3"]
     cmd = /path/to/kdiff3 $BASE $REMOTE $LOCAL -o $MERGED

Y funcionó. Pero luego kdiff3informó esto:

salida kdiff3

No es exactamente lo que esperaba: tuve 4 conflictos y la herramienta dice que hay 2. Además, el Nr of automatically solved conflictsmensaje me hace pensar que kdiff3aplica su propio algoritmo de fusión, que es lo contrario de lo que queremos.

De forma predeterminada, kdiff3resuelve automáticamente los conflictos basándose únicamente en problemas de espacios en blanco. Pero tiene muchas opciones para configurar en su configuración si desea cambiar su comportamiento. Consulte stackoverflow.com/a/15813064/6368697 : "si realmente desea deshabilitar cualquier resolución automática, simplemente agregue --qall a la línea de comando kdiff3". También dijiste que tienes 4 conflictos y la herramienta dice 2 pero sin ver lo que estás viendo es difícil entender tu situación y por qué la discrepancia.
@PatrickMevzek No quiero kdiff3ni ninguna otra herramienta para resolver conflictos por sí sola . Quiero que respete los conflictos que produce git en lugar de rehacer la fusión.
Ver mi comentario editado. Añadir --qall_ De la ayuda: "No resolver conflictos automáticamente". Siempre pensé que es uno de sus puntos fuertes, así que no tengo que perder el tiempo en conflictos triviales, pero al menos tienes la opción de desactivarlo. YMMV.

Respuestas (2)

kdiff3puede manejar esto. Es una diffherramienta genérica de visor y combinación (también se puede usar fuera de cualquier VCS, por ejemplo, para comparar el contenido de los directorios).

Si lo usa, gitpuede tener esto en su gitconfig:

[mergetool "kdiff3"]
    trustExitCode = false
    keepBackup = false

[merge]
    tool = kdiff3
    conflictstyle = diff3

para que git mergetooldespués de una combinación fallida, la herramienta se inicie automáticamente.

kdiff3intentará fusionar para usted las cosas triviales y le presentará una ventana de 4 paneles para resolver las cosas no triviales, según las gitanotaciones de fallas de fusión.

La fila superior se divide en 3 áreas para mostrarle:

  • A = LOCAL: este es el contenido del archivo de su sucursal local
  • B = BASE: este es el contenido del archivo como ancestro común, cómo era antes de cualquiera de los cambios en LOCAL o REMOTO
  • C = REMOTO: este es el contenido del archivo de la rama desde la que se está fusionando y en su rama (como se muestra en LOCAL)

La fila inferior es un texto editable que es el resultado de la combinación, según sus elecciones.

Puede seleccionar las opciones A, B o C para aplicar los cambios en A, B o C en la fusión resultante. O puede editar las cosas usted mismo en el editor de texto inferior.

Vea esta captura de pantalla: http://kdiff3.sourceforge.net/doc/screenshots.html#dirmergebigscreenshot

kdiff3es software gratuito y funcionará en todos los lugares donde funcione KDE. La interfaz está un poco anticuada pero funciona.

Otras opciones:

  • meld, consulte http://meldmerge.org/ ; la interfaz de usuario es más bonita que kdiff3pero la encontré menos completa en cuanto a funciones para mis necesidades
  • si echas un vistazo git-configdebajo de la merge.tooltecla, verás una lista de softwares que git conoce para resolver fusiones. Esto podría darle ideas sobre cosas para probar para encontrar la mejor para usted. En mi instalación, la lista es: araxis, bc, bc3, codecompare, deltawalker, diffmerge, diffuse, ecmerge, emerge, examdiff, , gvimdiff, gvimdiff2, gvimdiff3, kdiff3, meld, opendiff, p4merge, tkdiff, tortoisemerge, vimdiff, vimdiff2, vimdiff3,winmergexxdiff
Gracias por la completa respuesta. Lo hemos intentado meldpero no estábamos contentos con él. También probamos IntelliJla fusión con el mismo resultado. No puedo probar rápidamente kdiff3porque estoy en RHEL, con Gnome y un repositorio local sin Qt. Tomará algún tiempo antes de dar mi opinión.
Si puede, pruebe con una máquina virtual o un contenedor, tal vez al menos para echar un vistazo. O iniciar una computadora con algún LiveCD de una distribución que lo tenga.
Eso es lo que he hecho al final. No quiero ser irrespetuoso, pero desafortunadamente esa es una -1respuesta, aunque no tengo la intención de votar negativamente. kdiff3no parece respetar las anotaciones, la captura de pantalla no lo prueba y meld también realiza su propia combinación. Entonces, a menos que me haya perdido algo en kdiff3la configuración de , esa no es una respuesta correcta. Aunque me he enterado de conflictstyle = diff3que estaba ignorando hasta ahora.
@SteliosAdamantidis Mis experiencias con kdiff3no coinciden con las suyas, lo siento. Desde mi uso, siempre funcionó correctamente con git, haciendo todas las fusiones posibles por sí mismo y dejándome con los demasiado complicados para resolverlos automáticamente. Tenga en cuenta también que no tuve que configurar git de la forma en que necesitaba hacerlo, por lo que tal vez tenga una configuración muy diferente. Lo siento si no te funciona, espero que luego obtengas otras mejores respuestas.

Si está abierto a aprender a usar Emacs o Vim, ofrecen exactamente lo que desea gracias a ediff y vimdiff respectivamente:

  • una interfaz gráfica con resaltado de colores claros de las versiones alternativas de los conflictos (pero sin eliminar ninguno de los marcadores de conflicto de Git)
  • combinaciones de teclas para saltar fácilmente de un conflicto a otro
  • combinaciones de teclas para seleccionar fácilmente una u otra versión para cada conflicto

No están ejecutando ningún algoritmo: Git hace el trabajo. Simplemente son interfaces que hacen que sea más agradable resolver el conflicto.

Para usar ediff, abra su archivo en Emacs y ejecute smerge-ediffo configure Emacs para que lo inicie automáticamente. Consulte esta respuesta de Emacs Stack Exchange para obtener una imagen de la interfaz y los detalles de las combinaciones de teclas. Una alternativa es instalar el paquete magit que usa ediff magit-ediff.

Para usar vimdiff, puede configurarlo como sus herramientas de combinación en la configuración de Git. La interfaz es bastante similar.