git - the - merge tool
Configurar y usar Meld como git difftool y mergetool (7)
¿Cómo configuro y uso Meld como mi git difftool?
git difftool muestra el diff usando un programa de GUI diff (es decir, Meld) en lugar de mostrar la salida de diff en su terminal.
Aunque puede configurar el programa GUI en la línea de comando usando
-t <tool> / --tool=<tool>
, tiene más sentido configurarlo en su archivo
.gitconfig
.
[Nota: Consulte las secciones sobre comillas de escape y rutas de Windows en la parte inferior.]
# Add the following to your .gitconfig file.
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = meld "$LOCAL" "$REMOTE"
[Nota: esta configuración no alterará el comportamiento de
git diff
que continuará funcionando como de costumbre].
Utiliza
git difftool
exactamente de la misma manera que usa
git diff
.
p.ej
git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name
Si está configurado correctamente, se abrirá una ventana Meld que muestra el diff usando una interfaz GUI.
El orden de los paneles de la ventana Meld GUI se puede controlar mediante el orden de
$LOCAL
y
$REMOTE
en
cmd
, es decir, qué archivo se muestra en el panel izquierdo y cuál en el panel derecho.
Si los quiere al revés, simplemente cámbielos así:
cmd = meld "$REMOTE" "$LOCAL"
Finalmente, la línea
prompt = false
simplemente evita que git le
prompt = false
si desea iniciar Meld o no, por defecto git emitirá un mensaje.
¿Cómo configuro y uso Meld como mi git mergetool?
git mergetool le permite usar un programa de fusión de GUI (es decir, Meld) para resolver los conflictos de fusión que se han producido durante una fusión.
Al igual que difftool, puede configurar el programa GUI en la línea de comando usando
-t <tool> / --tool=<tool>
pero, como antes, tiene más sentido configurarlo en su archivo
.gitconfig
.
[Nota: Consulte las secciones sobre comillas de escape y rutas de Windows en la parte inferior.]
# Add the following to your .gitconfig file.
[merge]
tool = meld
[mergetool "meld"]
# Choose one of these 2 lines (not both!) explained below.
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
NO utiliza
git mergetool
para realizar una fusión real.
Antes de usar
git mergetool
, realice una fusión de la forma habitual con git.
p.ej
git checkout master
git merge branch_name
Si hay un conflicto de fusión, git mostrará algo como esto:
$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.
En este punto,
file_name
contendrá el archivo parcialmente fusionado con la información de conflicto de fusión (ese es el archivo con todas las entradas
>>>>>>>
y
<<<<<<<
en él).
Mergetool ahora se puede utilizar para resolver los conflictos de fusión. Lo comienzas muy fácilmente con:
git mergetool
Si está configurado correctamente, se abrirá una ventana Meld que mostrará 3 archivos. Cada archivo estará contenido en un panel separado de su interfaz GUI.
En la entrada de ejemplo
.gitconfig
anterior, se sugieren 2 líneas como la línea
cmd
[mergetool "meld"]
.
De hecho, hay todo tipo de formas para que los usuarios avanzados configuren la línea
cmd
, pero eso está más allá del alcance de esta respuesta.
Esta respuesta tiene 2 líneas de
cmd
alternativas que, entre ellas, atenderán a la mayoría de los usuarios, y serán un buen punto de partida para los usuarios avanzados que desean llevar la herramienta al siguiente nivel de complejidad.
En primer lugar, esto es lo que significan los parámetros:
-
$LOCAL
es el archivo en la rama actual (por ejemplo, maestro). -
$REMOTE
es el archivo en la rama que se está fusionando (por ejemplo, nombre_de_ sucursal). -
$MERGED
es el archivo parcialmente fusionado con la información de conflicto de fusión. -
$BASE
es el ancestro de confirmación compartido de$LOCAL
y$REMOTE
, es decir, el archivo como estaba cuando se creó originalmente la rama que contenía$REMOTE
.
Le sugiero que use:
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
o:
[mergetool "meld"]
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
# See ''Note On Output File'' which explains --output "$MERGED".
La opción es usar
$MERGED
o
$BASE
entre
$LOCAL
y
$REMOTE
.
De cualquier manera, Meld mostrará 3 paneles con
$LOCAL
y
$REMOTE
en los paneles izquierdo y derecho y
$MERGED
o
$BASE
en el panel central.
En AMBOS casos, el panel central es el archivo que debe editar para resolver los conflictos de fusión.
La diferencia es en qué posición de edición inicial preferiría;
$MERGED
para el archivo que contiene el archivo parcialmente fusionado con la información de conflicto de fusión o
$BASE
para el antecesor de confirmación compartido de
$LOCAL
y
$REMOTE
.
[Dado que ambas líneas
cmd
pueden ser útiles, las mantengo en mi archivo
.gitconfig
.
La mayoría de las veces uso la línea
$MERGED
y la línea
$BASE
está comentada, pero el comentario se puede cambiar si quiero usar la línea
$BASE
lugar.]
Nota sobre el archivo de salida: No se preocupe de que la
--output "$MERGED"
se use en
cmd
independientemente de si se
$MERGED
o
$BASE
anteriormente en la línea
cmd
.
La opción
--output
simplemente le dice a Meld en qué nombre de archivo git quiere que se guarde el archivo de resolución de conflictos. Meld guardará sus ediciones de conflictos en ese archivo independientemente de si usa
$MERGED
o
$BASE
como su punto de edición inicial.
Después de editar el panel central para resolver los conflictos de fusión, solo guarde el archivo y cierre la ventana Meld. Git realizará la actualización automáticamente y el archivo en la rama actual (por ejemplo, maestro) ahora contendrá lo que haya terminado en el panel central.
git habrá hecho una copia de seguridad del archivo parcialmente fusionado con la información de conflicto de fusión agregando
.orig
al nombre de archivo original.
por ejemplo,
file_name.orig
.
Después de comprobar que está satisfecho con la combinación y ejecutar cualquier prueba que desee hacer, se puede eliminar el archivo
.orig
.
En este punto, ahora puede hacer un compromiso para confirmar los cambios.
Si, mientras está editando los conflictos de fusión en Meld, desea abandonar el uso de Meld, salga de Meld sin guardar el archivo de resolución de fusión en el panel central.
git responderá con el mensaje
file_name seems unchanged
y luego preguntar
Was the merge successful? [y/n]
Was the merge successful? [y/n]
, si responde
n
, la resolución de conflicto de fusión se cancelará y el archivo permanecerá sin cambios.
Tenga en cuenta que si ha guardado el archivo en Meld en algún momento, no recibirá la advertencia y el aviso de git.
[Por supuesto, puede eliminar el archivo y reemplazarlo con el archivo de copia de seguridad
.orig
que git creó para usted].
Si tiene más de 1 archivo con conflictos de fusión, git abrirá una nueva ventana Meld para cada uno, uno tras otro hasta que estén listos. No todos se abrirán al mismo tiempo, pero cuando termine de editar los conflictos en uno y cierre Meld, git abrirá el siguiente, y así sucesivamente hasta que se hayan resuelto todos los conflictos de fusión.
Sería sensato crear un proyecto ficticio para probar el uso de
git mergetool
antes de usarlo en un proyecto en
vivo
.
Asegúrese de utilizar un nombre de archivo que contenga un espacio en su prueba, en caso de que su sistema operativo requiera que usted escape de las comillas en la línea de
cmd
, consulte a continuación.
Personajes de comillas escapadas
Es posible que algunos sistemas operativos necesiten que se escapen las comillas en
cmd
.
Los usuarios menos experimentados deben recordar que las líneas de comando de configuración deben probarse con nombres de archivo que incluyan espacios, y si las líneas
cmd
no funcionan con los nombres de archivo que incluyen espacios, intente escapar de las comillas.
p.ej
cmd = meld /"$LOCAL/" /"$REMOTE/"
En algunos casos, se puede necesitar un escape de cotización más complejo. El primero de los enlaces de ruta de Windows a continuación contiene un ejemplo de escape triple de cada cita. Es aburrido pero a veces necesario. p.ej
cmd = meld ///"$LOCAL///" ///"$REMOTE///"
Rutas de Windows
Los usuarios de Windows probablemente necesitarán una configuración adicional agregada a las líneas de
cmd
Meld.
Es posible que necesiten usar la ruta completa a
meldc
, que está diseñada para
meldc
en Windows desde la línea de comandos, o pueden necesitar o querer usar un contenedor.
Deben leer las páginas de
StackOverflow
vinculadas a continuación que tratan sobre la configuración de la línea correcta de Meld
cmd
para Windows.
Como soy un usuario de Linux, no puedo probar las diversas líneas de
cmd
Windows y no tengo más información sobre el tema que no sea recomendar el uso de mis ejemplos con la adición de una ruta completa a Meld o
meldc
, o agregar la carpeta del programa Meld a tu
path
- Git Diff y Meld en Windows
- Cómo configurar Meld como git mergetool
- Git Mergetool con Meld en Windows
Ignorando el espacio en blanco al final con Meld
Meld tiene una serie de preferencias que se pueden configurar en la GUI.
En la pestaña de
Text Filters
preferencias hay varios filtros útiles para ignorar cosas como los comentarios al realizar una diferencia.
Aunque hay filtros para ignorar
All whitespace
y los
Leading whitespace
, no hay ignorar el filtro de
Trailing whitespace
final (esto se ha sugerido como una adición en la lista de correo Meld, pero no está disponible en mi versión).
Ignorar el espacio en blanco al final suele ser muy útil, especialmente cuando se colabora, y se puede agregar fácilmente de forma manual con una expresión regular simple en la pestaña
Text Filters
preferencias de Meld.
# Use either of these regexes depending on how comprehensive you want it to be.
[ /t]*$
[ /t/r/f/v]*$
Espero que esto ayude a todos.
Aunque gran parte de la información en esta pregunta y respuesta está disponible en StackOverflow , se extiende en muchas páginas y entre otras respuestas que son incorrectas o engañosas. Me llevó un tiempo reconstruir todo lo que quería saber.
Hay muchos programas diferentes que se pueden usar como git difftool y mergetool, y ciertamente no hay consenso sobre cuál es el mejor (las opiniones, los requisitos y los sistemas operativos diferirán claramente).
Meld es una opción popular multiplataforma (UNIX / Linux, OSX, Windows) como se muestra en la pregunta de StackOverflow , ¿Cuál es la mejor herramienta de combinación visual para Git? , en el que la respuesta que propone Meld tiene más de 3 veces los votos que cualquier otra herramienta.
Las siguientes 2 preguntas serán respondidas en mi respuesta a continuación:
- ¿Cómo configuro y uso Meld como mi git difftool?
- ¿Cómo configuro y uso Meld como mi git mergetool?
Nota: No es necesario usar el mismo programa que su difftool y mergetool, se pueden configurar diferentes programas para ambos.
Esta es una respuesta dirigida principalmente a desarrolladores que usan Windows, ya que la sintaxis de ruta de la herramienta diff difiere de otras plataformas.
Uso Kdiff3 como git mergetool, pero para configurar git difftool como Meld, primero instalé la última versión de Meld de Meldmerge.org y luego agregué lo siguiente a mi .gitconfig global usando:
git config --global -e
Tenga en cuenta que si prefiere Sublime Text 3 en lugar del Vim predeterminado como núcleo ditor, puede agregar esto al archivo .gitconfig:
[core]
editor = ''c:/Program Files/Sublime Text 3/sublime_text.exe''
Luego agrega Inn Meld como la herramienta de control
[diff]
tool = meld
guitool = meld
[difftool "meld"]
cmd = /"C:/Program Files (x86)/Meld/Meld.exe/" /"$LOCAL/" /"$REMOTE/" --label /"DIFF
(ORIGINAL MY)/"
prompt = false
path = C://Program Files (x86)//Meld//Meld.exe
Tenga en cuenta la barra diagonal en el cmd anterior, en Windows es necesario.
También es posible configurar un alias para mostrar el git diff actual con una opción --dir-diff . Esto mostrará una lista de los archivos modificados dentro de Meld, lo cual es útil cuando ha modificado varios archivos (un escenario muy común).
El alias se ve así dentro del archivo .gitconfig, debajo de la sección [alias] :
showchanges = difftool --dir-diff
Para mostrar los cambios que he realizado en el código, simplemente ingreso el siguiente comando:
git showchanges
La siguiente imagen muestra cómo esta opción --dir-diff puede mostrar una lista de archivos modificados (ejemplo):
Luego es posible hacer clic en cada archivo y mostrar los cambios dentro de Meld.
Para Windows 10 tuve que poner esto en mi .gitconfig:
[merge]
tool = meld
[mergetool "meld"]
cmd = ''C:/Program Files (x86)/Meld/Meld.exe'' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
prompt = false
Todo lo demás que necesita saber está escrito en esta súper answer por mattst más arriba.
PD: Por alguna razón, esto solo funcionó con Meld 3.18.x, Meld 3.20.x me da un error.
Prefiero configurar meld como un comando separado, así:
git config --global alias.meld ''!git difftool -t meld --dir-diff''
Esto lo hace similar al script git-meld.pl aquí: https://github.com/wmanley/git-meld
Entonces puedes simplemente correr
git meld
Puede ser complicado calcular un diferencial en su cabeza de las diferentes secciones en $ MERGED y aplicarlo. En mi configuración, meld ayuda mostrándote estas diferencias visualmente, usando:
[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED
Parece extraño pero ofrece un flujo de trabajo muy conveniente, usando tres pestañas:
-
en la pestaña 1 verá (de izquierda a derecha) el cambio que debe realizar en la pestaña 2 para resolver el conflicto de fusión.
-
en el lado derecho de la pestaña 2, aplica el "cambio que debe hacer" y copia todo el contenido del archivo en el portapapeles (usando ctrl-a y ctrl-c).
-
en la pestaña 3, reemplace el lado derecho con el contenido del portapapeles. Si todo está correcto, ahora verá, de izquierda a derecha, el mismo cambio que se muestra en la pestaña 1 (pero con diferentes contextos). Guarde los cambios realizados en esta pestaña.
Notas:
- no edites nada en la pestaña 1
- no guarde nada en la pestaña 2 porque eso producirá ventanas emergentes molestas en la pestaña 3
Si bien la otra respuesta es correcta, esta es la forma más rápida de seguir adelante y configurar Meld como su herramienta de diferencia visual. Simplemente copie / pegue esto:
git config --global diff.tool meld
git config --global difftool.prompt false
Ahora ejecute
git difftool
en un directorio y Meld se iniciará para cada archivo diferente.
Nota al margen : Meld es sorprendentemente lento en la comparación de archivos CSV, y ninguna herramienta de diferencia de Linux que he encontrado es más rápida que esta herramienta de Windows llamada Compare It! (última actualización en 2010).
Para Windows Ejecute estos comandos en Git Bash:
git config --global diff.tool meld
git config --global difftool.meld.path "C:/Program Files (x86)/Meld/Meld.exe"
git config --global difftool.prompt false
git config --global merge.tool meld
git config --global mergetool.meld.path "C:/Program Files (x86)/Meld/Meld.exe"
git config --global mergetool.prompt false
(Actualice la ruta del archivo para Meld.exe si la suya es diferente).
Para Linux Ejecute estos comandos en Git Bash:
git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false
git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false
Puede verificar la ruta de Meld con este comando:
which meld