Ver diferencias de ramas con meld?

159

Sé que puedo ver la diferencia entre HEAD y el estado actual con meld .. Pero, ¿cómo puedo ver las diferencias entre ramas, por ejemplo mastery develcon meld?

En este momento hago los siguientes pasos:

  1. Cambiar el nombre de la carpeta de la copia de trabajo,
    por ejemplo mv /projectA /projectA_master)
  2. Clonar el proyecto nuevamente
    git clone url
  3. Cambiar a develrama
    cd projectA && git -b devel origin/devel
  4. Ver diferencias con meld
    meld /projectA_Master projectA

¿No hay una manera más fácil de obtener el mismo resultado en fusión? Solo lo necesito para revisar los cambios y no principalmente para fusionar.

Marten Bauer
fuente
¿Responde esto a tu pregunta? Configuración y uso de Meld como git difftool y mergetool
evan.bovie

Respuestas:

55

También encontré este problema molesto, así que hice git meld que permite una forma más cómoda de diferenciar las confirmaciones arbitrarias contra el árbol de trabajo o el área de preparación. Puede encontrarlo en https://github.com/wmanley/git-meld . Es un poco como el script de Mark, pero funciona para comparar cualquier confirmación arbitraria o el área de preparación o el directorio de trabajo con cualquiera de los otros. Si una de las cosas con las que está comparando es el árbol de trabajo, entonces eso es leer y escribir también para que no pierda sus cambios.

Will Manley
fuente
1
Excelente herramienta, Will. ¡Gracias! Completamente recomendado ... ahora si solo funcionara en fusiones también.
Varilla medidora
TYVM para una gran herramienta - (recordatorio para agregar al alias)
kfmfe04
26
Citando a Will, del exitoso repositorio de github: "NOTA: git-meld es obsoleto ya que git difftool aprendió la opción --dir-diff en git 1.7.11".
oluc
318

Corto y dulce:

git config --global diff.tool meld

Esto configura Git para usarlo meldcomo herramienta diff. (No necesita especificar los argumentos de la línea de comandos, el soporte para meldGit está integrado).

Luego, si desea una diferencia gráfica en lugar de una textual, simplemente invoque en git difftoollugar de git diff(ambas toman los mismos argumentos). En tu caso:

git difftool master..devel

Actualización: si no desea la diferencia de un archivo a la vez, pero en su lugar desea utilizar la vista "subdirectorio" de meld con todos los cambios entre las dos ramas, tenga en cuenta la opción -du . Por ejemplo, cuando estoy en la rama XYZ y quiero ver qué es diferente entre esto y la rama ABC, ejecuto esto:--dir-diffgit difftool

git difftool -d ABC
Jörg W Mittag
fuente
3
Eso no es lo que estoy buscando. Me muestra las diferencias archivo por archivo. Archivé eso con un script diff.py y 'git diff master..devel' antes. Quiero ver todas las diferencias y el árbol de directorios como 'fusionar carpeta A / carpeta B /'.
Marten Bauer
Marten, así es como funciona Git. Solo realiza un seguimiento del archivo, por lo que solo puede ver la diferencia archivo por archivo. En git, no puede cometer un directorio vacío solo. ¿Alguna razón particular por la que desea mostrar diff entre dir?
Donny Kurnia
@DonnyKurnia: Me tomó un poco descubrir lo que OP está tratando de hacer: Meld tiene una interfaz de usuario separada para ver todos los cambios en un directorio. Puede filtrar los archivos de visualización según si son iguales, modificados, nuevos. OP quiere usar esa interfaz de usuario para mostrar los cambios. (Esto le permite ver una lista de todos los cambios y elegir los que desea diferenciar). Por lo tanto, no es una comparación entre directorios, sino una comparación entre confirmaciones, pero se ve como un todo.
idbrii
17
@MartenBauer Creo que esto es lo que quieres: git difftool --dir-diff master devel
Stéphane
3
¿Se puede hacer esto para que la rama actual no esté en una carpeta tmp y, por lo tanto, permita modificaciones?
zkent
100

Comenzando con git v1.7.11, puede usar git difftool --dir-diffpara realizar un directorio diff. Que funciona bastante bien con fusión sin https://github.com/wmanley/git-meld scripts.

Configurar git

git config --global diff.tool meld

Úsalo

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

Para macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true
GutenYe
fuente
2
Creo que esto es realmente lo que quería el OP. Tenga en cuenta la opción -g para usar la herramienta guidiff y la opción -d para usar --dir-diff. Esto es bueno para hacer revisiones de código. Nit: la opción difftool.prompt no es necesaria cuando se especifica -d, al menos para Git 1.8.
Michael Percy
1
Esto es increíble. Exactamente lo que necesitaba. ¡Gracias!
Nicholas
55
¿Se puede hacer esto para que la rama actual no esté en una carpeta tmp y, por lo tanto, permita modificaciones?
zkent
2
Agradecería una respuesta a la pregunta de @zkent también ... :(
tavlima
3
@zkent @tavlima: Este comando, ya, permite ediciones en su versión actual. Incluso si ve un tmp floder en fusión, si guarda Ctrl+s- la parte correcta, su archivo se modifica.
Benjamin
13

Es importante decir que el uso git difftool -dque usted todavía puede editar sus archivos de trabajo en Meld y los libró . Para lograrlo, debe comparar alguna rama con su árbol de trabajo actual, por ejemplo:

git difftool -d branchname

Meld mostrará que los directorios izquierdo y derecho están ubicados en / tmp. Sin embargo, los archivos en el directorio correcto son en realidad enlaces simbólicos a sus archivos en el directorio de trabajo actual (no se aplica a Windows). Para que pueda editarlos directamente en Meld y cuando los guarde, sus cambios se guardarán en su directorio de trabajo.

Sin embargo, la opción más interesante es la comparación del directorio de trabajo actual con el alijo. Puede hacerlo simplemente escribiendo:

git difftool -d stash

Luego, puede transferir algunos cambios de alijo (ventana izquierda) a su copia de trabajo actual (ventana derecha), sin usar git stash pop/applyy evitar la molesta resolución de conflictos que pueden inducir estos comandos.

Creo que puede aumentar significativamente el flujo de trabajo con escondites. Puede transferir gradualmente los cambios de un alijo a una copia de trabajo y confirmarlos uno por uno, introduciendo algunos otros cambios si lo desea.

Piotr Jurkiewicz
fuente
Piotr, esto es exactamente lo que he estado tratando de hacer, pero en mi caso (en CentOS), no se están creando enlaces simbólicos. ¿Hay alguna configuración de configuración requerida o una versión mínima de meld que lo admita?
wrjohns
Creo que Git es responsable de la creación de enlaces simbólicos, no Meld. Consulte el manual de Git para el comando difftool. ¿Tal vez deberías actualizarlo a una versión más nueva?
Piotr Jurkiewicz
2
copiar nuevos archivos de la rama al directorio de trabajo no funciona :(
pykiss
5

Aunque parece de las otras respuestas como si no hubiera una manera de hacer esto directamente en el repositorio de git en este momento, es fácil (gracias a la respuesta a otra pregunta :)) escribir un script que extraiga los árboles de dos commits a directorios temporales y ejecuta meld en ellos, eliminando ambos directorios cuando sale meld:

http://gist.github.com/498628

Por supuesto, perderá cualquier cambio realizado a través de meld, pero creo que es bastante bueno para una visión general rápida de las diferencias.

Mark Longair
fuente
3

Creo que una manera fácil de hacer esto es usar git reset --soft:

Objetivo: comparar las diferencias entre branch_a y branch_b con meld

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .
tiempo real
fuente
0

En git V1.7.9 puede comparar dos confirmaciones sin la línea de comandos:

Debe configurar en 'git gui' las opciones de edición, global: "Usar herramienta de fusión: fusión".

Inicie gitk , seleccione una confirmación, haga clic derecho en otra confirmación> " diff this -> selected ". En "parche", haga clic con el botón derecho en un archivo> " diff externo ".

meld comenzará y mostrará el todavía seleccionado, primero commit en el lado derecho.

Stefan Forster
fuente
0

Para Meld en macOS, agregue esto a ~/.gitconfiglo recomendado por el mantenedor de la aplicación macOS, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Puede omitir las mergeconfiguraciones si lo desea.

La respuesta de @ GutenYe no funcionó para mí debido al escape automático y / o algo con eso zsh.

evan.bovie
fuente