example git diff difftool git-difftool diffmerge

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.

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

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

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

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

  2. 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 escribiendo git 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:


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:

  1. Asegúrese de que IntelliJ IDEA se está ejecutando.
  2. 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:

  1. 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"