Fusión con " git mergetool"


He encontrado git mergetool para ser una utilidad útil para la fusión de diferencias visualmente, pero la forma en que lo estoy haciendo parece muy torpe. Esencialmente, mi proceso se ve así cuando se reportan conflictos:

  1. Ejecutar un git mergetool
  2. En el prompt, presiona Enter para iniciar mi herramienta diff (Meld o FileMerge, dependiendo del equipo)
  3. Resolver los conflictos
  4. Guarda los cambios
  5. Cerrar la herramienta diff

Si tener más de un conflicto, enjuagar, repetir. Sí, ese soy yo abriendo y cerrando mi visor de diferencias una vez por cada conflicto en la fusión. Dado que se lanza 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. ¿Pequeña ayuda, por favor? Este proceso parece una locura ineficiente.

Author: nbro, 2009-02-25

3 answers

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

El git-mergetool la documentación establece claramente:

Si la herramienta de fusión personalizada indica correctamente el éxito de una resolución de fusióncon su código de salida, entonces la variable de configuración mergetool.<tool>.trustExitCode se puede establecer 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.

Así que el el código de salida (o la validación del usuario después de la salida de la herramienta diff) es necesario, lo que implica que el usuario primero cierre la herramienta diff externa.

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

Nota:
Otras dos configuraciones de git external diff tools ("Configuración de herramientas de diff y merge para Git en Windows" y "Configuración de SourceGear DiffMerge con Git") no dé más esperanzas cuando se trata de no cerrar la herramienta de diferencias externas...

 34
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 13:36:43

Si tu mergetool de elección admite la apertura de archivos en una instancia existente, puedes especificar el comando en tu 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 luego ejecutará su comando personalizado y luego le preguntará si el archivo se fusionó correctamente (en lugar de mirar un código de salida).

Un ejemplo que acabo de hackear 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 lo suficientemente bien, ¡puedo comenzar a usarlo yo mismo!

 22
Author: Brian Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 16:26:30

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

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

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

 12
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 14:39:23