read how conflicts git diff mergetool

how - git merge conflict



Fusionando con "git mergetool" (3)

He descubierto que git mergetool es una útil herramienta para combinar diffs visualmente, pero la forma en que voy parece realmente poco convincente. Esencialmente, mi proceso se ve así cuando se informan los conflictos:

  1. Ejecuta un git mergetool
  2. En el aviso, presione Enter para iniciar mi herramienta diff (Meld o FileMerge, dependiendo de qué computadora)
  3. Resuelva los conflictos
  4. Guarde los cambios
  5. Cierre la herramienta diff

Si tengo más de un conflicto, enjuague, repita. Sí, ese soy yo abriendo y cerrando mi visor de diferencias una vez por cada conflicto en la fusión. Desde que se lanzó desde la línea de comandos, cerrarlo es la única forma que conozco de decirle a git mergetool que he resuelto este conflicto en particular y que puede pasar al siguiente.

Seguramente hay una mejor manera, pero no tengo idea. Li''l ayuda, por favor? Este proceso parece loco ineficiente.


A primera vista, no parece posible reutilizar una sesión de herramienta de diferencia externa.

La documentación de git-mergetool establece claramente:

Si la herramienta de fusión personalizada indica correctamente el éxito de una resolución de fusión con su código de salida , entonces la variable de configuración mergetool.<tool>.trustExitCode puede establecerse en true.
De lo contrario, git-mergetool pedirá al usuario que indique el éxito de la resolución después de que la herramienta personalizada haya salido.

Por lo tanto, se necesita el código de salida (o la validación del usuario después de la salida de la herramienta diff ), lo que implica que el usuario cierra primero la herramienta de diferencia externa.

Parece un gran incentivo para reducir el número de conflictos en cada combinación / rebase;) (cualquiera que sea la herramienta VCScs utilizada)

Nota:
Otras dos configuraciones de herramientas de diferencias externas de git (" Configuración de herramientas de diferencias y fusión para Git en Windows " y " Configuración de SourceGear DiffMerge con Git ") no dan más esperanzas cuando se trata de no cerrar la herramienta de diferencia externa ...


El problema para mergetool es que utiliza deliberadamente una interfaz de línea de comando para iniciar una sesión de fusión y luego espera a que regrese el comando invocado para determinar cuándo se completó la fusión dirigida por el usuario.

La mayoría de las herramientas de combinación no proporcionan un mecanismo de línea de comando para iniciar una sesión de fusión en un proceso que ya se está ejecutando, con una forma de determinar cuándo se ha completado la resolución y si fue exitosa o no.

Es concebible que algunas herramientas de combinación puedan proporcionar esta funcionalidad a través de un comando de contenedor separado y algún tipo de IPC, pero sería excesivamente específico de la herramienta y difícil de implementar en el programa genérico mergetool.


Si su combinación de herramientas admite la apertura de archivos en una instancia existente, puede especificar el comando en su configuración de git:

% git config mergetool.whatever_you_want.cmd ''exec /path/to/merge/tool $LOCAL $MERGED $REMOTE'' % git config merge.tool whatever_you_want

git mergetool ejecutará su comando personalizado y luego le preguntará si el archivo se fusionó correctamente (en lugar de buscar un código de salida).

Un ejemplo que acabo de piratear para vimdiff:

% git config mergetool.persistent.cmd ''gvim --remote-tab-silent "+set buftype=nowrite" "$PWD/$BASE" && sleep 1; gvim --remote-send ":split $PWD/$REMOTE<CR>:set buftype=nowrite<CR>:vertical diffsplit $PWD/$MERGED<CR>:vertical diffsplit $PWD/$LOCAL<CR>:set buftype=nowrite<CR><C-W>l"''

Esto funciona bastante bien, ¡puedo comenzar a usarlo yo mismo!