git difftool example
¿Cómo veo la salida ''git diff'' con mi herramienta/visor de diferencias preferido? (25)
Introducción
Para referencia, me gustaría incluir mi variación en la respuesta de VonC. Tenga en cuenta que estoy usando la versión MSys de Git (1.6.0.2 en este momento) con PATH modificado, y ejecutando Git desde Powershell (o cmd.exe), no desde el shell Bash.
Introduje un nuevo comando, gitdiff
. La ejecución de este comando redirige temporalmente a git diff
para que use un programa visual de su elección (a diferencia de la solución de VonC que lo hace de forma permanente). Esto me permite tener tanto la funcionalidad predeterminada de Git diff ( git diff
) como la funcionalidad de visual diff ( gitdiff
). Ambos comandos toman los mismos parámetros, por ejemplo, para hacer cambios visuales en un archivo en particular, puede escribir
gitdiff path/file.txt
Preparar
Tenga en cuenta que $GitInstall
se utiliza como marcador de posición para el directorio donde está instalado Git.
Cree un nuevo archivo,
$GitInstall/cmd/gitdiff.cmd
@echo off setlocal for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI/bin;%%~fI/mingw/bin;%PATH% if "%HOME%"=="" @set HOME=%USERPROFILE% set GIT_EXTERNAL_DIFF=git-diff-visual.cmd set GIT_PAGER=cat git diff %* endlocal
Cree un nuevo archivo,
$GitInstall/bin/git-diff-visual.cmd
(reemplazando el marcador de posición[visual_diff_exe]
con la ruta completa al programa diff de su elección)@echo off rem diff is called by git with 7 parameters: rem path old-file old-hex old-mode new-file new-hex new-mode echo Diffing "%5" "[visual_diff_exe]" "%2" "%5" exit 0
Ya has terminado. Ejecutar
gitdiff
desde un repositorio de Git ahora debería invocar su programa visual diff para cada archivo que se modificó.
Cuando git diff
, quiero ver la salida con la herramienta visual de la opción de diferencias (SourceGear "diffmerge" en Windows). ¿Cómo configuro git para hacer esto?
Solución para Windows / msys git
Después de leer las respuestas, descubrí una forma más sencilla que implica cambiar solo un archivo.
Cree un archivo por lotes para invocar su programa diff, con los argumentos 2 y 5. Este archivo debe estar en algún lugar de su ruta. (Si no sabe dónde está, póngalo en c: / windows). Llámelo, por ejemplo, "gitdiff.bat". El mio es:
@echo off REM This is gitdiff.bat "C:/Program Files/WinMerge/WinMergeU.exe" %2 %5
Establezca la variable de entorno para que apunte a su archivo por lotes. Por ejemplo:
GIT_EXTERNAL_DIFF=gitdiff.bat
. O a través de powershell escribiendogit config --global diff.external gitdiff.bat
.Es importante no usar comillas, o especificar cualquier información de ruta, de lo contrario no funcionará. Es por eso que gitdiff.bat debe estar en tu camino.
Ahora cuando escribe "git diff", invocará su visor externo de diferencias.
Aquí hay un archivo por lotes que funciona para Windows: asume que DiffMerge está instalado en la ubicación predeterminada, maneja x64, maneja el reemplazo hacia atrás cuando sea necesario y tiene la capacidad de instalarse solo. Debería ser fácil reemplazar DiffMerge con su programa de diferencias favorito.
Instalar:
gitvdiff --install
gitvdiff.bat:
@echo off
REM ---- Install? ----
REM To install, run gitvdiff --install
if %1==--install goto install
REM ---- Find DiffMerge ----
if DEFINED ProgramFiles^(x86^) (
Set DIFF="%ProgramFiles(x86)%/SourceGear/DiffMerge/DiffMerge.exe"
) else (
Set DIFF="%ProgramFiles%/SourceGear/DiffMerge/DiffMerge.exe"
)
REM ---- Switch forward slashes to back slashes ----
set oldW=%2
set oldW=%oldW:/=/%
set newW=%5
set newW=%newW:/=/%
REM ---- Launch DiffMerge ----
%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%
goto :EOF
REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:/=/%
@echo on
git config --global diff.external %selfL%
@echo off
:EOF
Con el nuevo git difftool , es tan simple como agregar esto a su archivo .gitconfig :
[diff]
tool = any-name
[difftool "any-name"]
cmd = "/"C:/path/to/my/ext/diff.exe/" /"$LOCAL/" /"$REMOTE/""
También revise diffall , un simple script que escribí para extender el comportamiento difuso molesto (IMO) de abrir cada uno en serie.
Desde Git1.6.3, puede utilizar el script git difftool : vea mi respuesta a continuación .
Puede que este article te ayude. Aquí están las mejores partes:
Hay dos formas diferentes de especificar una herramienta de diferencias externa.
El primero es el método que utilizó, al establecer la variable GIT_EXTERNAL_DIFF. Sin embargo, se supone que la variable apunta a la ruta completa del ejecutable. Además, el ejecutable especificado por GIT_EXTERNAL_DIFF se llamará con un conjunto fijo de 7 argumentos:
path old-file old-hex old-mode new-file new-hex new-mode
Como la mayoría de las herramientas de diferencias requerirán un orden diferente (y solo algunos) de los argumentos, lo más probable es que tenga que especificar un script de envoltura, que a su vez llama a la herramienta de diferencias reales.
El segundo método, que prefiero, es configurar la herramienta de diferencias externa a través de "git config" . Aquí esta lo que hice:
1) Cree un script de envoltura "git-diff-wrapper.sh" que contenga algo como
-->8-(snip)--
#!/bin/sh
# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode
"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--
Como puede ver, solo los argumentos segundo ("archivo antiguo") y quinto ("archivo nuevo") se pasarán a la herramienta de diferencias.
2) Tipo
$ git config --global diff.external <path_to_wrapper_script>
en el símbolo del sistema, reemplazando con la ruta a "git-diff-wrapper.sh", por lo que su ~ / .gitconfig contiene
-->8-(snip)--
[diff]
external = <path_to_wrapper_script>
--8<-(snap)--
Asegúrese de usar la sintaxis correcta para especificar las rutas de acceso al script de envoltorio y la herramienta diff, es decir, use barras diagonales en lugar de barras diagonales invertidas. En mi caso, tengo
[diff]
external = /"c:/Documents and Settings/sschuber/git-diff-wrapper.sh/"
en .gitconfig y
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
en el script contenedor ¡Cuidado con el "gato" al final!
(Supongo que el '' | cat
'' es necesario solo para algunos programas que pueden no devolver un estado de devolución adecuado o consistente. Es posible que desee probar sin el gato final si su herramienta diff tiene un estado de devolución explícito)
Eso (el artículo citado anteriormente) es la teoría para la herramienta externa definida a través del archivo de configuración (no a través de la variable de entorno).
En la práctica (aún para la definición del archivo de configuración de la herramienta externa), puede consultar:
- ¿Cómo configuro DiffMerge con msysgit / gitk? que ilustra la configuración concreta de DiffMerge y WinMerge para MsysGit y gitk
- ¿Cómo puedo configurar un editor para que funcione con Git en Windows? para la definición de Notepad ++ como editor externo.
Desde la versión 1.6.3 de git hay " git difftool " que puede configurar para usar su herramienta gráfica de diferencias favorita. Actualmente, se admiten fuera de la caja kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, difuse y opendiff ; Si la herramienta que desea usar no está en esta lista, siempre puede usar la opción de configuración '' difftool.<tool>.cmd
''.
"git difftool" acepta las mismas opciones que "git diff".
Después de ver algunas otras herramientas externas de diferencias, descubrí que la vista de diff
en IntelliJ IDEA (y Android Studio) es la mejor para mí.
Paso 1: configurar IntelliJ IDEA para que se ejecute desde la línea de comandos
Si desea utilizar IntelliJ IDEA como su herramienta de diferencias, primero debe configurar IntelliJ IDEA para que se ejecute desde la línea de comandos siguiendo las instrucciones que se encuentran here :
En macOS o UNIX:
- Asegúrese de que IntelliJ IDEA se está ejecutando.
- En el menú principal, seleccione
Tools | Create Command-line Launcher
Tools | Create Command-line Launcher
. Se abrirá el cuadro de diálogo Crear secuencia de comandos de inicio, con la ruta sugerida y el nombre de la secuencia de comandos de inicio. Puede aceptar el valor predeterminado o especificar su propia ruta. Notifícalo, ya que lo necesitarás más tarde. Fuera de IntelliJ IDEA, agregue la ruta y el nombre del script de inicio a su ruta.
En Windows:
- Especifique la ubicación del ejecutable IDEA de IntelliJ en la variable de entorno del sistema Ruta. En este caso, podrá invocar el ejecutable IntelliJ IDEA y otros comandos IntelliJ IDEA desde cualquier directorio.
Paso 2: configura git para usar IntelliJ IDEA como la herramienta de datos.
Siguiendo las instrucciones en esta entrada de blog :
Golpetazo
export INTELLIJ_HOME /Applications/IntelliJ/ IDEA/ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH
Pez
set INTELLIJ_HOME /Applications/IntelliJ/ IDEA/ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH
Ahora agregue lo siguiente a su configuración git:
[merge]
tool = intellij
[mergetool "intellij"]
cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
trustExitCode = true
[diff]
tool = intellij
[difftool "intellij"]
cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")
Puede probarlo con git difftool
o git difftool HEAD~1
En Mac OS X,
git difftool -t diffuse
hace el trabajo para mí en la carpeta git. Para la instalación difusa, se puede usar puerto -
sudo port install diffuse
En el espíritu de responder preguntas que son algo diferentes de lo que se pregunta. Pruebe esta solución:
$ meld my_project_using_git
Meld entiende git y proporciona navegación alrededor de los cambios recientes.
Es posible que desee probar xd http://github.com/jiqingtang/xd , que es un contenedor GUI para GIT / SVN diff. NO es una herramienta de diferencias en sí misma. Ejecuta xd
cuando quieras ejecutar git diff
o svn diff
y te mostrará una lista de archivos, una ventana de vista previa y podrás lanzar cualquier herramienta de diferencias que desees, incluyendo tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs ( ediff), meld, difuse, kompare y kdiff3. También puede ejecutar cualquier herramienta personalizada.
Desafortunadamente la herramienta no soporta Windows.
Divulgación : Soy el autor de esta herramienta.
He estado usando este bit en ~/.gitconfig
durante mucho tiempo:
[diff]
external = ~/Dropbox/source/bash/git-meld
Con git-meld
:
#!/bin/bash
if [ "$DISPLAY" = "" ];
then
diff $2 $5
else
meld $2 $5
fi
Pero ahora me cansé de usar siempre meld en un entorno gráfico, y no es trivial invocar el diff normal con esta configuración, así que cambié a esto:
[alias]
v = "!sh -c ''if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi'' -"
Con esta configuración, cosas como esta funcionan:
git v
git v --staged
git v -t kompare
git v --staged -t tkdiff
Y sigo manteniendo el buen viejo git diff
.
Instalar meld
# apt-get install meld
Entonces elige eso como diftool
$ git config --global diff.tool meld
Si quieres ejecutarlo en consola, escribe:
$ git difftool
Si desea utilizar el modo de modo gráfico:
$ git mergetool
Y la salida sería:
''git mergetool'' will now attempt to use one of the following tools:
meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
Merging:
www/css/style.css
www/js/controllers.js
Normal merge conflict for ''www/css/style.css'':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (meld):
Así que solo presiona enter para usar meld (predeterminado), esto abriría el modo gráfico, guardaría la magia y presionaba para resolver la fusión. Eso es todo
Para completar mi respuesta de configuración anterior "diff.external" arriba:
Como lo mencionó Jakub , Git1.6.3 introdujo git difftool , originalmente propuesto en septiembre de 2008:
USAGE = ''[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]''
(Ver --extcmd
en la última parte de esta respuesta)
$LOCAL
contiene el contenido del archivo de la revisión inicial y $REMOTE
contiene el contenido del archivo en la revisión final.
$BASE
contiene los contenidos del archivo en el mundo.
Es básicamente
git-mergetool
modificado para operar en el índice / worktree de git.El caso de uso habitual de esta secuencia de comandos es cuando tiene cambios en etapas o sin etapas y le gustaría ver los cambios en un visor de diferencias lado a lado (por ejemplo,
tkdiff
,tkdiff
, etc.).
git difftool [<filename>*]
Otro caso de uso es cuando le gustaría ver la misma información pero está comparando confirmaciones arbitrarias (esta es la parte donde el análisis de revarg podría ser mejor)
git difftool --start=HEAD^ --end=HEAD [-- <filename>*]
El último caso de uso es cuando desea comparar su árbol de trabajo actual con algo que no sea HEAD (por ejemplo, una etiqueta)
git difftool --commit=v1.0.0 [-- <filename>*]
Nota: desde Git 2.5, git config diff.tool winmerge
es suficiente!
Ver " git mergetool winmerge "
Y desde Git 1.7.11 , tiene la opción --dir-diff
, para generar herramientas de diferencias externas que puedan comparar dos jerarquías de directorios a la vez después de llenar dos directorios temporales, en lugar de ejecutar una instancia de la herramienta externa una vez. por un par de archivos.
Antes de Git 2.5:
Caso práctico para configurar difftool
con su herramienta personalizada de diferencias:
C:/myGitRepo>git config --global diff.tool winmerge
C:/myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh /"$LOCAL/" /"$REMOTE/""
C:/myGitRepo>git config --global difftool.prompt false
Con winmerge.sh almacenado en una parte del directorio de su PATH:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"
Si tiene otra herramienta (kdiff3, P4Diff, ...), cree otro script de shell y la correspondiente directiva de configuración difftool.myDiffTool.cmd
.
Entonces puedes cambiar herramientas fácilmente con la configuración de diff.tool
.
También tienes esta entrada de blog de Dave para agregar otros detalles.
(O esta pregunta para las opciones de winmergeu
)
El interés por esta configuración es el script winmerge.sh
: puede personalizarlo para tener en cuenta casos especiales.
Vea por ejemplo la respuesta de David Marble a continuación para ver un ejemplo que trata sobre:
- Nuevos archivos en origen o destino.
- archivos eliminados en origen o destino
Como Kem Mason menciona en su respuesta , también puede evitar cualquier envoltorio usando la opción --extcmd
:
--extcmd=<command>
Especifique un comando personalizado para ver diffs.
git-difftool
ignora los valores predeterminados configurados y ejecuta$command $LOCAL $REMOTE
cuando se especifica esta opción.
Por ejemplo, así es como gitk
puede ejecutar / usar cualquier herramienta de diff
.
Para una versión de Linux de cómo configurar una herramienta de diferencias en versiones de git anteriores a 1.6.3 (1.6.3 se agregó difftool to git) this es un excelente tutorial conciso,
en breve:
Paso 1: agrega esto a tu .gitconfig
[diff]
external = git_diff_wrapper
[pager]
diff =
Paso 2: crea un archivo llamado git_diff_wrapper, colócalo en algún lugar de tu $ PATH
#!/bin/sh
vimdiff "$2" "$5"
Probé las cosas elegantes aquí (con tkdiff) y nada me funcionó. Así que escribí el siguiente script, tkgitdiff. Hace lo que necesito que haga.
$ cat tkgitdiff
#!/bin/sh
#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#
newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile
Puedes usar git difftool
.
por ejemplo, si tiene meld , puede editar el master
sucursales y devel
de la siguiente manera:
git config --global diff.external meld
git difftool master..devel
Si está en una Mac y tiene XCode, entonces tiene instalado FileMerge. El comando de la terminal es opendiff, por lo que puedes hacer git difftool -t opendiff
Si estás haciendo esto a través de cygwin, es posible que necesites usar cygpath :
$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh /$LOCAL /$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`
Si no es uno para la línea de comandos, entonces si instala git de tortuga, puede hacer clic derecho en un archivo para obtener un submenú de tortuga con la opción "Difundir más tarde".
Cuando selecciona esto en el primer archivo, puede hacer clic con el botón derecho en el segundo archivo, ir al submenú tortoisegit y seleccionar "Diff with == yourfilehere ==" Esto le dará al gui tortoisegitmerge el resultado.
Si ya tiene una herramienta de diferencias asociada con los tipos de archivo (por ejemplo, debido a que instaló TortoiseSVN que viene con un visor de diferencias), podría canalizar la salida de git diff
a un archivo "temporal", luego abrirlo directamente sin necesidad de Para saber algo sobre el espectador:
git diff > "~/temp.diff" && start "~/temp.diff"
Establecerlo como un alias global funciona incluso mejor: git what
[alias]
what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
Sobre la base de la respuesta de VonC para lidiar con la eliminación de archivos y adiciones, use los siguientes comandos y scripts:
> git config --global diff.tool winmerge
> git config --global difftool.winmerge.cmd "winmerge.sh /"$LOCAL/" /"$REMOTE/" /"$BASE/""
> git config --global difftool.prompt false
Lo que es lo mismo que poner esto en tu .gitconfig
global:
[diff]
tool = winmerge
[difftool "winmerge"]
cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
prompt = false
Luego ponga lo siguiente en winmerge.sh
que debe estar en su camino:
#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
echo "added: $3"
else
echo "changed: $3"
"C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi
Tengo una adición a esto. Me gusta usar regularmente una aplicación de diferencias que no es compatible como una de las herramientas predeterminadas (por ejemplo, caleidoscopio), a través de
git difftool -t
También me gusta tener el diff
predeterminado solo como la línea de comando regular, por lo que configurar la variable GIT_EXTERNAL_DIFF
no es una opción.
Puede usar una aplicación de diff
arbitrarias como una sola vez con este comando:
git difftool --extcmd=/usr/bin/ksdiff
Simplemente pasa los 2 archivos al comando que especifique, por lo que probablemente tampoco necesite un envoltorio.
Un breve resumen de las grandes respuestas anteriores:
git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false
Luego utilícelo escribiendo (opcionalmente también especificando el nombre del archivo):
git difftool
Yo uso kompare en ubuntu:
sudo apt-get install kompare
Para comparar dos ramas:
git difftool -t kompare <my_branch> master
esto funciona para mí en Windows 7. No hay necesidad de scripts sh intermedios
contenido de .gitconfig:
[diff]
tool = kdiff3
[difftool]
prompt = false
[difftool "kdiff3"]
path = C:/Program Files (x86)/KDiff3/kdiff3.exe
cmd = "$LOCAL" "$REMOTE"