2010-01-05 22 views
127

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

En el momento en que hago las siguientes etapas:

  1. Cambiar nombre de carpeta de copia
    de trabajo Por ejemplo mv /projectA /projectA_master)
  2. clonar el proyecto de nuevo
    git clone url
  3. Cambiar a devel rama
    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 conseguir el mismo resultado en MELD? Solo lo necesito para revisar los cambios y no principalmente para la fusión.

Respuesta

51

También encontré este problema molesto, así que he hecho git meld, que permite una forma más cómoda de diferir las confirmaciones arbitrarias contra el árbol de trabajo o el área de ensayo. Puede encontrarlo en https://github.com/wmanley/git-meld. Es un poco como el guión de Mark, pero funciona para comparar cualquier compromiso arbitrario o el área de ensayo o el directorio de trabajo contra cualquiera de los otros. Si una de las cosas con las que compara es el árbol de trabajo, entonces también es de lectura y escritura para que no pierda sus cambios.

+1

Excelente herramienta, Will. ¡Gracias! Completamente recomendado ... ahora si solo funcionó en las fusiones también. – Dipstick

+0

TYVM para una gran herramienta - (recordatorio para añadirlo al alias) – kfmfe04

+20

Citando Will, del repositorio de hit github: "NOTA: git-meld está obsoleto porque git difftool aprendió la opción --dir-diff en git 1.7. 11. " – oluc

265

corto & dulce:

git config --global diff.tool meld 

este modo se configura para usar Git meld como la herramienta de diferencias. (No es necesario especificar los argumentos de línea de comandos, soporte para meld está integrado en Git.)

Entonces, si quieres un diff gráfica en lugar de uno textual, simplemente se le invoca git difftool en lugar de git diff (ambos toma los mismos argumentos). En su caso:

git difftool master..devel 

Actualización: Si no desea que el diff de un archivo-en-un-tiempo, sino que queremos usar la vista "subdirectorio" de MELD con todos los cambios entre el dos ramas, observe la opción -d o --dir-diff para git difftool. Por ejemplo, cuando estoy en el XYZ rama y yo quiero ver lo que es diferente entre esta y la rama ABC, corro esto:

git difftool -d ABC 
+2

eso no es lo que estoy buscando. Me muestra las diferencias archivo por archivo. Lo archivé con un script diff.py y 'git diff master..devel' antes. Quiero ver todas las diferencias y el árbol de directorios como 'meld folderA/folderB /'. –

+0

Marten, esa es la forma en que funciona. Solo rastrea el archivo, por lo que solo puede ver la diferencia archivo por archivo. En git, no puedes comprometer un solo directorio vacío. ¿Alguna razón en particular por la que desea mostrar diff entre dir? –

+0

@DonnyKurnia: Me llevó un poco averiguar qué intenta hacer OP: Meld tiene una IU separada para ver todos los cambios en un directorio. Puede filtrar los archivos de visualización según si son iguales, cambiados o 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

5

Aunque parece de las otras respuestas, como si no hay una manera de hacerlo esto directamente en el repositorio de git en este momento, es fácil (gracias a la respuesta al another question :)) escribir un script que extraiga los árboles de dos confirmaciones en directorios temporales y ejecutar meld en ellos, eliminando ambos directorios cuando meld exits:

http://gist.github.com/498628

Por supuesto, si no se pierden los cambios realizados a través de MELD, pero es bastante bueno para una visión general rápida de las diferencias, creo.

5

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

A partir de v1.7.11 git, se puede utilizar para llevar a cabo git difftool --dir-diff un directorio diff Que funciona bastante bien con Meld sin secuencias de comandos https://github.com/wmanley/git-meld.

Configurar GIT

git config --global diff.tool meld 

Utilícelo

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 
+2

Creo que esto es realmente lo que el OP quería. Tenga en cuenta la opción -g para usar la herramienta guidiff y la opción -d para usar un --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. –

+0

Esto es INCREÍBLE. Exactamente lo que necesitaba. ¡Gracias! –

+2

¿Se puede hacer esto para que la rama actual no se encuentre en una carpeta tmp y, por lo tanto, permita editarla? – zkent

0

Si tiene directorio de trabajo limpio y el índice limpia (o no se preocupan por él), entonces esto es lo que quiere:

git diff master..devel | patch -p1 && meld . && git reset --hard 
1

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

Debe configurar en 'git gui' opciones de edición, global: "herramienta de utilizar la combinación de: fundir".

inicio gitk, seleccione una confirmación, haga clic derecho en otra cometer> "diff esto -> seleccionado". En 'parche', haga clic derecho en un archivo> "diff externo".

meld se iniciará y mostrará la foto seleccionada, primer compromiso en el lado derecho.

8

Es importante decir que el uso de git difftool -d que todavía puede editar los archivos de trabajo en Meld y los libró. Con el fin de lograr que se necesita para comparar alguna rama de su árbol de trabajo actual, por ejemplo:

git difftool -d branchname 

Meld estará mostrando que ambos directorios izquierdo y derecho se encuentran 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). Entonces puede 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 comparar el directorio de trabajo actual con el escondite. Puede hacer que simplemente escribiendo:

git difftool -d stash 

A continuación, puede transferir algunos cambios de escondite (ventana izquierda) a su copia de trabajo actual (derecha), sin necesidad de utilizar git stash pop/apply y evitando la resolución de conflictos molesto que puede ser inducido por esto ordena.

Creo que puede aumentar significativamente el flujo de trabajo con stashes. Puede transferir gradualmente los cambios del escondite a la copia de trabajo y confirmarlos uno por uno, introduciendo algunos otros cambios si lo desea.

+0

Piotr, esto es exactamente lo que He estado tratando de hacerlo, 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 apoye esto? – wrjohns

+0

Creo que Git es responsable de la creación de enlaces simbólicos, no Meld. Consulte el manual de Git para ver el comando difftool. ¿Tal vez debería actualizarlo a una versión más nueva? –

+1

copiar nuevos archivos desde la rama al directorio de trabajo no funciona :( – pykiss

Cuestiones relacionadas