Configuración y uso de Meld como tu git difftool y mergetool

Aunque gran parte de la información en esta pregunta y respuesta está disponible en StackOverflow , se distribuye en muchas páginas y entre otras respuestas que son erróneas o confusas. Me llevó un time rebuild todo lo que quería saber.

Hay muchos progtwigs 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 elección popular multiplataforma (UNIX / Linux, OSX, Windows) como se muestra en la pregunta de StackOverflow , ¿Cuál es la mejor herramienta de fusió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 utilizar el mismo progtwig que su difftool y mergetool, se pueden establecer diferentes progtwigs para ambos.

¿Cómo configuro y uso Meld como mi git difftool?

git difftool muestra la diferencia usando un progtwig de diferencia de GUI (es decir, Meld) en lugar de mostrar la salida de diferencia en su terminal.

Aunque puede establecer el progtwig GUI en la línea de command usando -t <tool> / --tool=<tool> , tiene más sentido configurarlo en su file .gitconfig . [Nota: consulte las secciones sobre cómo escaping de las cotizaciones y las routes 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 configuration no alterará el comportamiento de git diff que continuará funcionando como siempre.]

git difftool exactamente de la misma manera que usas 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 se configura correctamente, se abrirá una window Meld mostrando el diff usando una interfaz GUI.

El order de los paneles de la window de Meld GUI se puede controlar por el order de $LOCAL y $REMOTE en cmd , es decir, qué file se muestra en el panel izquierdo y cuál en el panel derecho. Si los quiere a la inversa, simplemente cambíelos así:

  cmd = meld "$REMOTE" "$LOCAL" 

Finalmente, la línea prompt = false simplemente detiene a git para que no le pregunte si desea iniciar Meld o no, de manera pnetworkingeterminada, git emitirá un post.


¿Cómo configuro y uso Meld como mi git mergetool?

git mergetool le permite usar un progtwig de fusión GUI (es decir, Meld) para resolver los conflictos de fusión que se han producido durante una fusión.

Al igual que difftool, puede establecer el progtwig GUI en la línea de command usando -t <tool> / --tool=<tool> pero, como antes, tiene más sentido configurarlo en su file .gitconfig . [Nota: consulte las secciones sobre cómo escaping de las cotizaciones y las routes 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 usas git mergetool para realizar una fusión real. Antes de usar git mergetool , realiza una fusión de la manera 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 file parcialmente fusionado con la información de conflicto de fusión (ese es el file con todas las inputs >>>>>>> y <<<<<<< en él).

Mergetool ahora se puede usar para resolver los conflictos de combinación. Empiezas muy fácilmente con:

 git mergetool 

Si está configurado correctamente, se abrirá una window Meld mostrando 3 files. Cada file estará contenido en un panel separado de su interfaz GUI.

En el ejemplo de input de .gitconfig anterior, se sugieren 2 líneas como la línea de cmd [mergetool "meld"] . De hecho, hay todo tipo de forms para que los usuarios avanzados configuren la línea de cmd , pero eso está más allá del scope 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á un buen punto de partida para los usuarios avanzados que deseen llevar la herramienta al siguiente nivel de complejidad.

Primero, aquí está lo que significan los parameters:

  • $LOCAL es el file en la twig actual (por ejemplo, maestro).
  • $REMOTE es el file en la twig que se está fusionando (por ejemplo, branch_name).
  • $MERGED es el file parcialmente fusionado con la información de conflicto de fusión en él.
  • $BASE es el antepasado de compromiso compartido de $LOCAL y $REMOTE , es decir, el file tal como era cuando se creó originalmente la twig que contiene $REMOTE .

Te sugiero que uses cualquiera de los siguientes:

 [mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED" 

o:

 [mergetool "meld"] cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED" 

La opción es usar $MERGED o $BASE entre $LOCAL y $REMOTE .

De cualquier forma 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 file que debe editar para resolver los conflictos de fusión. La diferencia radica en la position de edición inicial que prefiera; $MERGED para el file que contiene el file parcialmente fusionado con la información de conflicto de combinación o $BASE para el antepasado de compromiso compartido de $LOCAL y $REMOTE . [Dado que las dos líneas de cmd pueden ser útiles, las guardo ambas en mi file .gitconfig . La mayoría de las veces uso la línea $MERGED y la línea $BASE está comentada, pero el comentario puede cambiarse si, en cambio, quiero usar la línea $BASE .]

Después de editar el panel central para resolver los conflictos de combinación, simplemente guarde el file y cierre la window Meld. Git hará la actualización automáticamente y el file en la twig actual (por ejemplo, maestro) ahora contendrá lo que terminó en el panel central.

git realizará una copy de security del file parcialmente fusionado con la información de conflicto de fusión en él al agregar .orig al nombre de file original. por ejemplo, file_name.orig . Después de verificar que está contento con la combinación y ejecutar cualquier testing que desee realizar, se puede eliminar el file .orig .

En este punto, ahora puede hacer un compromiso para confirmar los cambios.

NOTA: No se preocupe: la --output "$MERGED" se usa en cmd independientemente de si $MERGED o $BASE se usaron anteriormente en la línea del cmd . La opción --output simplemente le dice a Meld en qué nombre de file se quiere save el file de resolución de conflicto. Meld se asegurará de que sus ediciones de conflicto se guarden en ese file, independientemente de si usa $MERGED o $BASE como punto de edición inicial.

Si, mientras edita los conflictos de fusión en Meld, desea abandonar el uso de Meld, luego salga de Meld sin save el file de resolución de fusión en el panel central. git responderá con el post 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 del conflicto de fusión se cancelará y el file permanecerá sin cambios. Tenga en count que si ha guardado el file en Meld en algún momento, no recibirá la advertencia y la request de git. [Por supuesto, puede eliminar el file y replacelo con el file .orig respaldo que git hizo por usted]

Si tiene más de 1 file con conflictos de fusión, entonces git abrirá una nueva window Meld para cada uno, uno tras otro hasta que todos estén listos. No se abrirán todas al mismo time, 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 probar un file con espacios, en caso de que su sistema operativo requiera que escaque las comillas en la línea del cmd , vea a continuación.


Escapando personajes de comillas

Algunos sistemas operativos pueden necesitar tener las comillas en cmd escapado. Los usuarios less experimentados deben recordar que las líneas de commands de configuration deben probarse con nombres de files que incluyen espacios, y si las líneas de cmd no funcionan con los nombres de los files que incluyen espacios, intente escapingse de las comillas. p.ej

 cmd = meld \"$LOCAL\" \"$REMOTE\" 

En algunos casos, puede ser necesario un escape de comillas más complejo. El 1 de los enlaces de ruta de Windows a continuación contiene un ejemplo de escape triple de cada cita. Es un aburrimiento, pero a veces es necesario. p.ej

 cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\" 

Rutas de Windows

Los usuarios de Windows probablemente necesitarán una configuration adicional agregada a las líneas Meld cmd . Es posible que necesiten usar la ruta completa a meldc , que está diseñada para ser meldc en Windows desde la command-line, o pueden necesitar o querer usar un contenedor. Deben leer las páginas de StackOverflow vinculadas a continuación que tratan acerca de cómo configurar la línea meld cmd correcta para Windows. Como soy usuario de Linux, no puedo probar las distintas 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 progtwig Meld a tu path

  • Git Diff y Meld en Windows
  • Cómo configurar Meld como git mergetool
  • Git mergetool con Meld en Windows

Ignorando los espacios en blanco al final con Meld

Meld tiene una serie de preferences que se pueden configurar en la GUI.

En la pestaña de Text Filters preferences hay varios filters útiles para ignorar cosas como los comentarios cuando se realiza una diferencia. Aunque hay filters para ignorar All whitespace y Leading whitespace , no hay ignorar el filter de Trailing whitespace final (esto se ha sugerido como una adición en la list de correo de Meld pero no está disponible en mi versión).

Ignorar espacios en blanco al final suele ser muy útil, especialmente cuando se queuebora, y se puede agregar fácilmente manualmente con una simple expresión regular en la pestaña Meld preferences Text Filters .

 # 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.

Mientras que la otra respuesta es correcta, esta es la forma más rápida de seguir adelante y configurar Meld como su herramienta visual diff. Solo copie / pegue esto:

 git config --global diff.tool meld git config --global difftool.prompt false 

Ahora ejecute git difftool en un directory y se lanzará Meld para cada file diferente.

Nota al margen : Meld es sorprendentemente lento en la comparación de files CSV, y ninguna herramienta de diferencias de Linux que he encontrado es más rápida que esta herramienta de Windows de la era de 2009 llamada CompareIt !.

Para Windows . Ejecute estos commands en Git Bash:

 git config --global diff.tool meld git config --global difftool.diff.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 file para Meld.exe si el suyo es diferente).

Para Linux . Ejecute estos commands 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 usando este command:

 which meld 

Prefiero configurar meld como un command 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 una diferencia en tu cabeza de las diferentes secciones en $ MERGED y aplicar eso. En mi configuration, Meld ayuda mostrándote estos diffs 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, con tres tabs:

  1. en la pestaña 1 verá (de izquierda a derecha) el cambio que debe hacer en la pestaña 2 para resolver el conflicto de fusión.

  2. en el lado derecho de la pestaña 2 aplica el "cambio que debe hacer" y copy todo el contenido del file al portapapeles (usando ctrl-a y ctrl-c).

  3. 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 contexts diferentes). Guarde los cambios realizados en esta pestaña.

Notas:

  • no edite nada en la pestaña 1
  • no guarde nada en la pestaña 2 porque eso producirá windows emergentes molestas en la pestaña 3