ver modificados log example branches archivos git diff meld

modificados - ¿Por qué `git diff` no invoca la herramienta de diferencias externa?



git status (3)

En mi repositorio, si escribo

$ git diff some-file

o

$ git difftool some-file

Me sale la pantalla de diferencia en el terminal. Creo que esto no debería suceder, porque he configurado una herramienta externa de diferencias, como se muestra en la salida de git config -l :

$ git config -l user.name=blah blah user.email=blah blah http.sslverify=true diff.external=/home/daniel/bin/git-diff <--This is the important line push.default=simple core.filemode=false core.editor=gedit alias.tree=log --all --graph --decorate=short --color --format=format:''%C(bold blue)%h%C(reset) %C(auto)%d%C(reset) %C(black)[%cr]%C(reset) %x09%C(black)%an: %s %C(reset)'' core.repositoryformatversion=0 core.filemode=false core.bare=false core.logallrefupdates=true core.ignorecase=true remote.origin.url=https://daniel@skynet/git/pyle.git remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* branch.master.remote=origin branch.master.merge=refs/heads/master branch.daniel.remote=origin branch.daniel.merge=refs/heads/daniel

El archivo git-diff al que se hace referencia en la línea diff.external tiene este aspecto

#!/bin/bash meld $2 $5

¿Por qué git diff invoca a meld?

Obtengo el mismo comportamiento si configuro las cosas para que git config -l tenga la siguiente línea:

diff.tool = meld

o

diff.external = usr/bin/meld

Nota : Otros repositorios en mi máquina no tienen este problema.

Preguntas de SO relacionadas, pero no equivalentes:

  1. ¿Cuál es la diferencia entre git diff y git difftool ?
  2. No se puede hacer git diff use diff.external para la herramienta diff externa

Me sale la pantalla de diferencia en el terminal. Esto no debería ocurrir, porque he configurado una herramienta externa de diferencias.

Sí, debería: diff.external es para "visualización de diferencias en el terminal".

(de la página del manual de git config )

diff.external

Si se configura esta variable de configuración, la generación de diferencias no se realiza utilizando la maquinaria interna de diferencias, sino utilizando el comando dado .
Se puede anular con la variable de entorno GIT_EXTERNAL_DIFF .
El comando se llama con los parámetros descritos en "git Diffs" en git (1). Nota: si desea usar un programa de diferencias externo solo en un subconjunto de sus archivos, es posible que desee usar gitattributes(5) lugar.

La pregunta que vincula explica por qué meld no podría desempeñar el papel de un "dif externo".

La visualización de un dif visual con otra herramienta se realiza con:

git difftool --dir-diff shaOfHisCheckIn^! git difftool --tool=meld --dir-diff shaOfHisCheckIn^! git difftool -t meld -d shaOfHisCheckIn^!

meld se puede configurar en Windows como diftool: consulte " Git Diff y Meld en Windows ".

Si quisiera configurar meld para git diff, podría (en Ubuntu) usar el diff.external , pero con un script de envoltorio :

cree un archivo llamado git-diff.sh , usando el siguiente contenido:

#!/bin/bash meld "$2" "$5" > /dev/null 2>&1

Guárdelo en una ubicación como /usr/local/bin , otorgándole derechos de ejecución:

$ sudo mv git-diff.sh /usr/local/bin/ $ sudo chmod +x /usr/local/bin/git-diff.sh

El último paso es abrir el archivo $HOME/.gitconfig y agregar las siguientes líneas:

[diff] external = /usr/local/bin/git-diff.sh

La próxima vez que escriba git diff en un proyecto de Git con cambios, Meld se iniciará y le mostrará un visor de diferencias de panel dividido.
Tenga en cuenta que debe cerrar la instancia abierta de meld antes de abrir el siguiente visor de diferencias.


Normalmente solo quiero comprobar si los cambios que estoy a punto de registrar son correctos. Así que seguí el procedimiento sugerido aquí (similar al observado por VonC). Sin embargo, la ejecución de git difftool todavía no abre Meld. Entonces creé un alias:

alias git-diff=''git difftool $(git rev-parse HEAD)''

Guarde esto en su .bashrc o .zshrc o la configuración correspondiente para su shell. Esto esencialmente compara el estado de la rama con la confirmación anterior en la rama.

Haga un git-diff para ver los cambios en un archivo por archivo o git-diff --dir para ver todos los cambios en una vista de directorio.


Parece que git diff (al menos, a partir de la versión 1.7.12.4 de git ) no ejecutará otra cosa que no sea la diferencia interna, solo para consola, en un archivo que se encuentre en el estado "ambos modificados". git mergetool funciona en tales archivos.