Comment visualiser la sortie ‘git diff’ avec mon outil / visualiseur de diff préféré?

Lorsque je tape git diff , je souhaite voir la sortie avec mon outil de diff visuel de choix (SourceGear “diffmerge” sous Windows). Comment configurer git pour le faire?

    Depuis Git1.6.3, vous pouvez utiliser le script git difftool : voir ma réponse ci-dessous .


    Peut-être cet article va vous aider. Voici les meilleures parties:

    Il existe deux manières différentes de spécifier un outil de diff externe.

    La première est la méthode que vous avez utilisée, en définissant la variable GIT_EXTERNAL_DIFF. Cependant, la variable est supposée pointer vers le chemin complet de l’exécutable. De plus, l’exécutable spécifié par GIT_EXTERNAL_DIFF sera appelé avec un ensemble fixe de 7 arguments:

     path old-file old-hex old-mode new-file new-hex new-mode 

    Comme la plupart des outils diff requièrent un ordre différent (et seulement certains) des arguments, vous devrez probablement spécifier un script wrapper à la place, qui à son tour appelle l’outil de diff réel.

    La seconde méthode, que je préfère, consiste à configurer l’outil de diff externe via “git config” . Voici ce que j’ai fait:

    1) Créez un script “git-diff-wrapper.sh” qui contient quelque chose comme

     -->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 "" "$2" "$5" | cat --8<-(snap)-- 

    Comme vous pouvez le voir, seuls les deuxièmes arguments ("old-file") et cinquième ("new-file") seront transmis à l'outil diff.

    2) Type

     $ git config --global diff.external  

    à l'invite de commande, en remplaçant par le chemin "git-diff-wrapper.sh", votre ~ / .gitconfig contient

     -->8-(snip)-- [diff] external =  --8<-(snap)-- 

    Veillez à utiliser la syntaxe correcte pour spécifier les chemins d'access au script et à l'outil diff, par exemple, utilisez des barres obliques au lieu de barres obliques inverses. Dans mon cas, j'ai

     [diff] external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\" 

    dans .gitconfig et

     "d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat 

    dans le script wrapper. Attention au "chat" qui traîne!

    (Je suppose que le ' | cat ' n'est nécessaire que pour certains programmes qui peuvent ne pas renvoyer un état de retour correct ou cohérent. Vous pouvez essayer sans le chat final si votre outil diff a un statut de retour explicite)


    Cela (l'article cité ci-dessus) est la théorie de l'outil externe défini par le fichier de configuration (pas par la variable d'environnement).
    En pratique (toujours pour la définition du fichier de configuration de l'outil externe), vous pouvez vous référer à:

    • Comment configurer DiffMerge avec msysgit / gitk? qui illustre les parameters concrets de DiffMerge et WinMerge pour MsysGit et gitk
    • Comment puis-je configurer un éditeur pour travailler avec Git sous Windows? pour la définition de Notepad ++ en tant qu'éditeur externe.

    Pour compléter ma précédente réponse à la configuration “diff.external” ci-dessus:

    Comme mentionné par Jakub , Git1.6.3 a introduit git difftool , initialement proposé en septembre 2008:

    USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
    (Voir --extcmd dans la dernière partie de cette réponse)

    $LOCAL contient le contenu du fichier de la révision de départ et $REMOTE contient le contenu du fichier dans la révision de fin.
    $BASE contient le contenu du fichier dans le fichier

    Il s’agit essentiellement de git-mergetool modifié pour fonctionner sur l’index / worktree de git.

    Le cas d’utilisation habituel de ce script est lorsque vous avez effectué des modifications par étapes ou non et que vous souhaitez voir les modifications dans un visualiseur de différences côte à côte (par exemple, xxdiff , tkdiff , etc.).

     git difftool [*] 

    Un autre cas d’utilisation est celui où vous souhaitez voir les mêmes informations, mais comparez des commits arbitraires (c’est la partie où l’parsing Revarg pourrait être meilleure)

     git difftool --start=HEAD^ --end=HEAD [-- *] 

    Le dernier cas d’utilisation est celui où vous souhaitez comparer votre worktree actuel à autre chose que HEAD (par exemple, une balise)

     git difftool --commit=v1.0.0 [-- *] 

    Note: puisque Git 2.5, git config diff.tool winmerge est suffisant!
    Voir ” git mergetool winmerge ”

    Et depuis Git 1.7.11 , vous avez l’option --dir-diff , afin de générer des outils de diff externes capables de comparer deux hiérarchies de répertoires à la fois après avoir rempli deux répertoires temporaires, au lieu d’exécuter une instance de l’outil externe une fois par paire de fichiers.


    Avant Git 2.5:

    Cas pratique pour configurer difftool avec votre outil de personnalisation:

     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 

    Avec winmerge.sh stocké dans une partie du répertoire de votre PATH:

     #!/bin/sh echo Launching WinMergeU.exe: $1 $2 "C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote" 

    Si vous avez un autre outil (kdiff3, P4Diff, …), créez un autre script shell et la directive de configuration difftool.myDiffTool.cmd appropriée.
    Ensuite, vous pouvez facilement changer d’outils avec la configuration diff.tool .

    Vous avez également cette entrée de blog par Dave pour append d’autres détails.
    (Ou cette question pour les options winmergeu )

    L’intérêt de ce paramètre est le script winmerge.sh : vous pouvez le personnaliser pour prendre en compte les cas particuliers.

    Voir par exemple la réponse de David Marble ci-dessous pour un exemple qui traite de:

    • nouveaux fichiers d’origine ou de destination
    • fichiers supprimés dans l’origine ou la destination

    Comme Kem Mason le mentionne dans sa réponse , vous pouvez également éviter tout wrapper en utilisant l’option --extcmd :

     --extcmd= 

    Spécifiez une commande personnalisée pour l’affichage des diffs. git-difftool ignore les valeurs par défaut configurées et exécute $command $LOCAL $REMOTE lorsque cette option est spécifiée.

    Par exemple, gitk est capable d’exécuter / utiliser n’importe quel outil de diff .

    Dans l’esprit de répondre à des questions quelque peu différentes de celles posées. Essayez cette solution:

     $ meld my_project_using_git 

    Meld comprend git et permet de naviguer autour des changements récents.

    Depuis la version 1.6.3 de git, il existe ” git difftool ” que vous pouvez configurer pour utiliser votre outil de comparaison graphique préféré. Les logiciels actuellement pris en charge sont kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse et opendiff ; Si l’outil que vous souhaitez utiliser ne figure pas dans cette liste, vous pouvez toujours utiliser l’option de configuration ‘ difftool..cmd ‘.

    “git difftool” accepte les mêmes options que “git diff”.

    Avec new git difftool , c’est aussi simple que de l’append à votre fichier .gitconfig :

     [diff] tool = any-name [difftool "any-name"] cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\"" 

    Consultez également diffall , un script simple que j’ai écrit pour étendre le comportement diff par défaut de l’ouverture (IMO) de chaque ouverture en série.

    J’ai un ajout à cela. J’aime utiliser régulièrement une application diff qui n’est pas prise en charge comme l’un des outils par défaut (par exemple, le kaléidoscope), via

     git difftool -t 

    J’aime aussi avoir le diff par défaut qui ne soit que la ligne de commande normale, par conséquent, définir la variable GIT_EXTERNAL_DIFF n’est pas une option.

    Vous pouvez utiliser une application diff arbitraire avec cette commande:

     git difftool --extcmd=/usr/bin/ksdiff 

    Il ne fait que passer les 2 fichiers à la commande que vous spécifiez, vous n’avez donc probablement pas besoin d’un wrapper.

    En vous appuyant sur la réponse de VonC pour gérer les suppressions et les ajouts de fichiers, utilisez les commandes et scripts suivants:

     > git config --global diff.tool winmerge > git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\" \"$BASE\"" > git config --global difftool.prompt false 

    Ce qui revient à mettre ceci dans votre .gitconfig global:

     [diff] tool = winmerge [difftool "winmerge"] cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE" [difftool] prompt = false 

    Ensuite, mettez ce qui suit dans winmerge.sh qui doit être sur votre chemin:

     #!/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 

    Solution pour Windows / msys git

    Après avoir lu les réponses, j’ai découvert un moyen plus simple consistant à ne changer qu’un seul fichier.

    1. Créez un fichier de commandes pour appeler votre programme diff, avec les arguments 2 et 5. Ce fichier doit se trouver quelque part dans votre chemin. (Si vous ne savez pas où c’est, mettez-le dans c: \ windows). Appelez-le, par exemple, “gitdiff.bat”. Le mien est:

       @echo off REM This is gitdiff.bat "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5 
    2. Définissez la variable d’environnement pour qu’elle pointe sur votre fichier de commandes. Par exemple: GIT_EXTERNAL_DIFF=gitdiff.bat . Ou via powershell en tapant git config --global diff.external gitdiff.bat .

      Il est important de ne pas utiliser de guillemets ou de spécifier des informations de chemin, sinon cela ne fonctionnera pas. C’est pourquoi gitdiff.bat doit être sur votre chemin.

    Maintenant, lorsque vous tapez “git diff”, il appellera votre visualiseur de diff externe.

    Si vous le faites via cygwin, vous devrez peut-être utiliser 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` 

    Cela fonctionne pour moi sur Windows 7. Pas besoin de scripts intermédiaires

    contenu de .gitconfig:

      [diff] tool = kdiff3 [difftool] prompt = false [difftool "kdiff3"] path = C:/Program Files (x86)/KDiff3/kdiff3.exe cmd = "$LOCAL" "$REMOTE" 

    Un bref résumé des réponses ci-dessus:

     git difftool --tool-help git config --global diff.tool  git config --global --add difftool.prompt false 

    Ensuite, utilisez-le en tapant (en spécifiant éventuellement le nom du fichier):

     git difftool 

    introduction

    Pour référence, j’aimerais inclure ma variation dans la réponse de VonC. Gardez à l’esprit que j’utilise la version MSys de Git (1.6.0.2 pour le moment) avec PATH modifié, et que Git s’exécute à partir de Powershell (ou cmd.exe), pas le shell Bash.

    J’ai introduit une nouvelle commande, gitdiff . Exécuter cette commande temporairement redirige git diff pour utiliser un programme de diff visuel de votre choix (par opposition à la solution de VonC qui le fait de manière permanente). Cela me permet d’avoir à la fois la fonctionnalité de diff Git par défaut ( git diff ) ainsi que la fonctionnalité de diff visuelle ( gitdiff ). Les deux commandes prennent les mêmes parameters. Par exemple, vous pouvez, par exemple, modifier visuellement les modifications apscopes à un fichier particulier.

     gitdiff path/file.txt 

    Installer

    Notez que $GitInstall est utilisé comme espace réservé pour le répertoire dans lequel Git est installé.

    1. Créez un nouveau fichier, $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. Créez un nouveau fichier, $GitInstall\bin\git-diff-visual.cmd (remplaçant l’espace réservé [visual_diff_exe] par le chemin complet du programme diff de votre choix)

       @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. Vous avez maintenant terminé. L’exécution de gitdiff partir d’un référentiel Git doit maintenant appeler votre programme de diff visuel pour chaque fichier modifié.

    Voici un fichier de commandes qui fonctionne pour Windows – suppose que DiffMerge installé à l’emplacement par défaut, gère x64, gère le remplacement des barres obliques inverses si nécessaire et qu’il est capable de s’installer. Devrait être facile de remplacer DiffMerge avec votre programme diff préféré.

    À installer:

     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 

    Si vous utilisez un Mac et que vous avez XCode, FileMerge est installé. La commande du terminal est opendiff, vous pouvez donc simplement faire git difftool -t opendiff

    Pour une version Linux de la configuration d’un outil de diff sur les versions de git antérieures à 1.6.3 (1.6.3 a ajouté difftool à git), il s’agit d’un excellent tutoriel concis,

    en bref:

    Étape 1: ajoutez ceci à votre .gitconfig

     [diff] external = git_diff_wrapper [pager] diff = 

    Étape 2: créez un fichier nommé git_diff_wrapper, placez-le quelque part dans votre $ PATH

     #!/bin/sh vimdiff "$2" "$5" 

    Installer la fusion

      # apt-get install meld 

    Ensuite, choisissez cela comme difftool

      $ git config --global diff.tool meld 

    Si vous voulez l’exécuter sur le type de console:

      $ git difftool 

    Si vous souhaitez utiliser le type de mode graphique:

      $ git mergetool 

    Et la sortie serait:

      '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): 

    Il suffit donc d’appuyer sur Entrée pour utiliser Meld (par défaut), cela ouvrirait le mode graphique, effectuerait la sauvegarde magique et appuierait sur celle qui résoudrait la fusion. C’est tout

    Sur Mac OS X,

     git difftool -t diffuse 

    fait le travail pour moi dans le dossier git. Pour installer diffuse, on peut utiliser le port –

     sudo port install diffuse 

    vous pouvez utiliser git difftool .

    Par exemple, si vous avez fusionné , vous pouvez éditer les twigs master et les déployer par:

     git config --global diff.external meld git difftool master..devel 

    Après avoir examiné d’autres outils de diff externes, j’ai constaté que l’affichage des diff dans IntelliJ IDEA (et Android Studio) était le meilleur pour moi.

    Étape 1 – Configurer IntelliJ IDEA à exécuter à partir de la ligne de commande

    Si vous souhaitez utiliser IntelliJ IDEA comme outil de comparaison, vous devez d’abord configurer IntelliJ IDEA à partir de la ligne de commande en suivant les instructions ci- dessous :

    Sous macOS ou UNIX:

    1. Assurez-vous que IntelliJ IDEA fonctionne.
    2. Dans le menu principal, choisissez Tools | Create Command-line Launcher Tools | Create Command-line Launcher . La boîte de dialog Créer un script de lancement s’ouvre, avec le chemin suggéré et le nom du script de lancement. Vous pouvez accepter la valeur par défaut ou spécifier votre propre chemin. Faites-en attention, car vous en aurez besoin plus tard. En dehors de IntelliJ IDEA, ajoutez le chemin et le nom du script de lancement à votre chemin.

    Sous Windows:

    1. Spécifiez l’emplacement du fichier exécutable IntelliJ IDEA dans la variable d’environnement système Path. Dans ce cas, vous pourrez appeler l’exécutable IntelliJ IDEA et d’autres commandes IntelliJ IDEA depuis n’importe quel répertoire.

    Étape 2 – configurez git pour utiliser IntelliJ IDEA comme difftool

    En suivant les instructions sur cet article de blog :

    Frapper

     export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS PATH=$IDEA_HOME $PATH 

    Poisson

     set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS set PATH $INTELLIJ_HOME $PATH 

    Maintenant, ajoutez ce qui suit à votre git config:

     [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") 

    Vous pouvez l’essayer avec git difftool ou git difftool HEAD~1

    J’ai essayé les trucs de fantaisie ici (avec tkdiff) et rien n’a fonctionné pour moi. J’ai donc écrit le script suivant, tkgitdiff. Il fait ce que j’ai besoin de faire.

     $ 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 

    J’utilise ce bit dans ~/.gitconfig depuis longtemps:

     [diff] external = ~/Dropbox/source/bash/git-meld 

    Avec git-meld :

     #!/bin/bash if [ "$DISPLAY" = "" ]; then diff $2 $5 else meld $2 $5 fi 

    Mais maintenant je me suis fatigué de toujours utiliser Meld dans un environnement graphique, et il n’est pas sortingvial d’invoquer le diff normal avec cette configuration, alors je suis passé à ceci:

     [alias] v = "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -" 

    Avec cette configuration, des choses comme ce travail:

     git v git v --staged git v -t kompare git v --staged -t tkdiff 

    Et je continue à garder le bon vieux git diff .

    J’utilise kompare sur Ubuntu:

     sudo apt-get install kompare 

    Pour comparer deux twigs:

     git difftool -t kompare  master 

    Si vous avez déjà un outil diff associé à des types de fichiers (par exemple, parce que vous avez installé TortoiseSVN fourni avec un visualiseur de différences), vous pouvez simplement générer la sortie régulière de git diff dans un fichier “temp”. savoir quelque chose sur le spectateur:

     git diff > "~/temp.diff" && start "~/temp.diff" 

    La définir comme un alias global fonctionne encore mieux: git what

     [alias] what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f" 

    Si vous n’en faites pas partie pour la ligne de commande, si vous installez tortoise git, vous pouvez cliquer avec le bouton droit sur un fichier pour obtenir un sous-menu tortoisegit avec l’option “Diff later”.

    Lorsque vous sélectionnez cette option dans le premier fichier, vous pouvez cliquer avec le bouton droit sur le second fichier, accéder au sous-menu tortoisegit et sélectionner “Diff with == yourfilehere ==”. Cela donnera le gui tortoisegitmerge pour le résultat.

    Vous pouvez essayer xd http://github.com/jiqingtang/xd , qui est un wrapper graphique pour GIT / SVN diff. Ce n’est pas un outil de diff lui-même. Vous exécutez xd lorsque vous voulez lancer git diff ou svn diff et vous verrez une liste de fichiers, une fenêtre de prévisualisation et vous pourrez lancer n’importe quel outil de diff, comme tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs ( ediff), meld, diffuse, kompare et kdiff3. Vous pouvez également exécuter n’importe quel outil personnalisé.

    Malheureusement, l’outil ne prend pas en charge Windows.

    Disclosure : Je suis l’auteur de cet outil.