Comment puis-je visualiser la sortie 'git diff' avec mon outil/ viewer préféré?

quand je tape git diff , je veux voir la sortie avec mon outil de diff visuel de choix (SourceGear" diffmerge " sur Windows). Comment configurer git pour faire cela?

685
demandé sur smci 2008-11-01 01:55:12

25 réponses

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


peut être cet article vous aidera. Voici les meilleures pièces:

il y a deux façons 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, l' variable est censé 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 nécessiteront un ordre différent (et seulement quelques-uns) des arguments, vous aurez très probablement à spécifier un script d'enrubannage à la place, qui à son tour appelle le véritable outil diff.

La seconde méthode, que je préfère est configurer le outil de calcul externe via git config " . Voici ce que j'ai fait:

1) Créer un script d'enrubannage "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

"<path_to_diff_executable>" "" "" | cat
--8<-(snap)--

comme vous pouvez le voir, seuls les deuxième ("ancien-fichier") et cinquième ("nouveau-fichier") arguments seront adoptée à l'outil de comparaison.

2) Type

$ git config --global diff.external <path_to_wrapper_script>

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

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

assurez-vous d'utiliser la bonne syntaxe pour spécifier les chemins vers le script d'enrubannage et la diff l'outil, c.-à-d. utiliser l'outil slashed à la place de l'outil backslashes. Dans mon cas, j'ai

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

in .gitconfig et

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

dans le script d'emballage. L'esprit de la fuite "chat"!

(je suppose que le ' | cat ' est nécessaire seulement pour certains programmes qui peuvent ne pas retourner un bon ou la constance des rendements d'état. Vous pourriez vouloir essayer sans le chat arrière si votre outil diff a le statut de retour explicite)


(l'article cité ci-dessus) est la théorie d'outil externe définis par fichier de config (et non pas par la variable d'environnement).

Dans la pratique (toujours pour la définition de fichier de configuration de l'outil externe), vous pouvez vous référer à:

368
répondu VonC 2018-05-10 11:45:59

pour compléter mon précédent " diff.externe" config réponse ci-dessus:

Comme mentionné par Jakub , Git1.6.3 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 contenu du fichier à partir 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 wor

c'est essentiellement git-mergetool modifié pour fonctionner sur l'index git/worktree.

le scénario habituel pour ce script est lorsque vous avez mis en scène ou non des changements et que vous souhaitez voir les changements dans un viewer de diff side-by-side (par exemple xxdiff , tkdiff , etc.).

git difftool [<filename>*]

un autre cas d'utilisation est lorsque vous souhaitez voir les mêmes informations mais comparez les propagations arbitraires (c'est la partie où l'analyse revarg pourrait être meilleure)

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

le dernier cas d'utilisation est lorsque vous souhaitez comparer votre worktree actuel à quelque chose d'autre que la tête (par exemple une étiquette)

git difftool --commit=v1.0.0 [-- <filename>*]

Note: depuis 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 lancer des outils externes diff qui peuvent comparer deux hiérarchies de répertoires à la fois après avoir peuplé deux répertoires temporaires, au lieu d'exécuter une instance de l'outil externe une fois par une paire de fichier.


Avant Git 2.5:

cas pratique pour configurer difftool avec votre outil de diff personnalisé:

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 un répertoire de votre chemin:

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

si vous avez un autre outil (kdiff3, P4Diff, ...), créer un autre script shell, et la directive de configuration difftool.myDiffTool.cmd appropriée.

Ensuite, vous pouvez facilement changer d'outil avec la config diff.tool .

vous avez aussi cette entrée de blog par Dave pour ajouter d'autres détails.

(Ou cette question pour les winmergeu options)

l'intérêt de ce paramètre est le winmerge.sh script : vous pouvez le personnaliser pour tenir compte des cas spéciaux.

voir par exemple David de Marbre 's réponse ci-dessous pour un exemple qui traite de:

  • nouvelle fichiers en soit l'origine ou la destination
  • supprimé fichiers en soit l'origine ou la destination

comme Kem Mason mentionne dans son réponse , vous pouvez aussi éviter tout emballage en utilisant --extcmd option :

--extcmd=<command>

spécifier une commande personnalisée pour afficher les 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, c'est comme ça que gitk peut exécuter/utiliser n'importe quel outil diff .

197
répondu VonC 2018-05-15 08:11:58

dans le but 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 fournit la navigation autour des changements récents.

105
répondu Charles Merriam 2010-03-14 16:28:42

depuis la version 1.6.3 de git il y a " git difftool " que vous pouvez configurer pour utiliser votre outil de diff graphique préféré. Actuellement pris en charge hors de la boîte sont kdiff3, kom pare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse et opendiff ; si l'outil que vous voulez utiliser n'est pas sur cette liste, vous pouvez toujours utiliser l'option de configuration difftool.<tool>.cmd .

"git difftool"accepte les mêmes options que "git diff".

38
répondu Jakub Narębski 2011-11-25 18:42:26

avec le nouveau git difftool , c'est aussi simple que de l'ajouter à votre .gitconfig fichier:

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

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

34
répondu Seba Illingworth 2015-05-18 01:51:14

j'ai un ajout à cela. J'aime utiliser régulièrement un diff application qui n'est pas pris en charge comme l'un des outils par défaut (par exemple, kaléidoscope), par l'intermédiaire de

git difftool -t

j'aime aussi que la valeur par défaut diff soit simplement la ligne de commande régulière, donc définir la variable GIT_EXTERNAL_DIFF n'est pas une option.

vous pouvez utiliser une application diff comme une application unique avec cette commande:

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

il passe juste le 2 les fichiers à la commande que vous spécifiez, donc vous n'avez probablement pas besoin d'un wrapper non plus.

21
répondu Kem Mason 2015-08-12 02:17:02

en S'appuyant sur la réponse de VonC pour traiter des suppressions et des ajouts de fichiers, utilisez les commandes et les 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

qui est la même chose que mettre cela dans votre global .gitconfig :

[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 [ "" = "$NULL" ] ; then
    echo "removed: "
elif [ "" = "$NULL" ] ; then
    echo "added: "
else
    echo "changed: "
    "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "" ""
fi
17
répondu David Marble 2010-11-07 07:12:50

Solution pour Windows / msys git

après avoir lu les réponses, j'ai découvert une façon plus simple qui implique de changer un seul fichier.

  1. créez un fichier batch pour invoquer votre programme diff, avec les arguments 2 et 5. Ce fichier doit être quelque part dans votre chemin. (Si vous ne savez pas où c'est, mettez-le c:\windows). Appelez-le, par exemple, "gitdiff.chauve." Le mien est:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. définit la variable d'environnement pour pointer vers votre fichier de lots. Par exemple: GIT_EXTERNAL_DIFF=gitdiff.bat . Ou par 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 ça ne marchera pas. C'est pourquoi gitdiff.chauve-souris doit être dans votre chemin.

Maintenant, quand vous tapez "git diff", il appelle votre externe visualisateur.

10
répondu Steve Hanov 2013-02-12 12:09:03

si vous faites cela à travers cygwin, vous pourriez avoir besoin d'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 ` `cygpath -w `
8
répondu idbrii 2010-03-30 17:42:42

cela fonctionne pour moi sur windows 7. Pas besoin de scripts SH intermédiaires

contenu de .gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"
7
répondu Sharas 2012-02-02 21:26:34

un bref résumé des grandes réponses ci-dessus:

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

ensuite utilisez-le en tapant (en spécifiant aussi le nom de fichier):

git difftool
7
répondu 2014-11-04 10:36:46

Introduction

pour référence, j'aimerais inclure ma variation sur la réponse de VonC. Gardez à l'esprit que j'utilise la version MSys de Git (1.6.0.2 en ce moment) avec un chemin modifié, et que J'exécute Git lui-même à partir de Powershell (ou cmd.exe), pas la coquille de Bash.

j'ai introduit une nouvelle commande, gitdiff . L'exécution de cette commande redirige Temporairement git diff pour utiliser un programme de diff visuel de votre choix (par opposition à la solution de VonC) que fait-elle de façon permanente). Cela me permet d'avoir à la fois la fonctionnalité git diff par défaut ( git diff ) et la fonctionnalité visual diff ( gitdiff ). Les deux commandes prennent les mêmes paramètres, ainsi par exemple pour différencier visuellement les changements dans un fichier particulier, vous pouvez taper

gitdiff path/file.txt

Setup

notez que $GitInstall est utilisé comme paramètre pour le répertoire où Git est installé.

  1. créer 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éer un nouveau fichier, $GitInstall\bin\git-diff-visual.cmd (remplacer [visual_diff_exe] placeholder avec le chemin complet vers le 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. C'est fini. Exécuter gitdiff à partir d'un dépôt Git devrait maintenant invoquer votre programme visual diff pour chaque fichier qui a été modifié.

6
répondu Milan Gardian 2008-12-25 15:44:25

voici un fichier par lot qui fonctionne pour Windows - suppose DiffMerge installé à l'emplacement par défaut, traite x64, manipule avant de remplacer les antislash si nécessaire et a la capacité de s'installer. Devrait être facile à remplacer DiffMerge avec votre programme de diff préféré.

à installer:

gitvdiff --install 

gitvdiff.chauve-souris:

@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
6
répondu Brad Robinson 2009-04-09 02:21:04

si vous êtes sur un Mac et que vous avez XCode, alors vous avez FileMerge installé. La commande du terminal est opendiff, donc vous pouvez simplement faire git difftool -t opendiff

6
répondu LuxuryMode 2011-09-04 09:03:16

Pour une version linux de la façon de configurer un outil de comparaison sur git versions antérieures à 1.6.3 (1.6.3 ajouté difftool git) ce est un excellent tutoriel concis,

en résumé:

Étape 1: ajoutez ceci à votre .gitconfig

[diff]
  external = git_diff_wrapper
[pager]
  diff =

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

#!/bin/sh

vimdiff "" ""
5
répondu Fire Crow 2009-10-22 13:28:44

installer la soudure

 # apt-get install meld

puis choisir que comme difftool

 $ git config --global diff.tool meld

si vous voulez l'exécuter sur le type de console:

 $ git difftool

si vous voulez utiliser le mode graphique de type:

 $ 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 de presser enter pour utiliser meld(par défaut), ce qui ouvrirait le mode graphique, ferait le Magic save et presserait que résoudre la fusion. C'est tout

5
répondu G. I. Joe 2015-09-19 01:46:02

sur Mac OS X,

git difftool -t diffuse 

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

sudo port install diffuse
4
répondu Shreyas 2016-05-09 06:52:18

vous pouvez utiliser git difftool .

par exemple si vous avez Fusion , vous pouvez éditer les branchs master et devel par:

git config --global diff.external meld
git difftool master..devel
3
répondu simple_human 2013-12-06 11:23:01

après avoir regardé quelques autres outils externes de diff, j'ai trouvé que la vue diff dans IntelliJ IDEA (et Android Studio) est le meilleur pour moi.

Étape 1 - installation de IntelliJ IDEA pour être exécuté depuis la ligne de commande

si vous voulez utiliser IntelliJ IDEA comme outil de diff, vous devez d'abord configurer IntelliJ IDEA à partir de la ligne de commande en suivant les instructions ici :

Sur macOS ou UNIX:

  1. assurez-vous que IntelliJ IDEA fonctionne.
  2. sur le menu principal, choisissez Tools | Create Command-line Launcher . La boîte de dialogue Créer Script de lancement s'ouvre, avec le chemin suggéré et le nom du script de lancement. Vous pouvez accepter les paramètres par défaut ou spécifier votre propre chemin. Assurez avis, car vous en aurez besoin plus tard. En dehors de IntelliJ IDEA, ajoutez le chemin et le nom du script de lancement à votre chemin.

Sur Windows:

  1. spécifie l'emplacement de L'exécutable IntelliJ IDEA dans la variable D'environnement du système de chemin. Dans ce cas, vous pourrez invoquer L'exécutable IntelliJ IDEA et d'autres commandes IntelliJ IDEA à partir de n'importe quel répertoire.

Étape 2-configurer git pour utiliser IntelliJ IDEA comme difftool

suivant les instructions sur ce billet de blog :

Bash

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

ajouter maintenant ce qui suit à votre configuration 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")

vous pouvez l'essayer avec git difftool ou git difftool HEAD~1 151980920"

3
répondu David Rawson 2017-06-20 22:09:46

j'ai essayé la fantaisie ici (avec tkdiff) et rien ne fonctionnait pour moi. J'ai donc écrit le script suivant, tkgitdiff. C'est ce que j'en ai besoin pour le faire.

$ cat tkgitdiff
#!/bin/sh

#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#

newfile=
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
2
répondu Theodore Sternberg 2013-12-05 00:26:25

j'utilise ce bit dans ~/.gitconfig depuis longtemps:

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

avec git-meld :

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

mais maintenant je me suis lassé de toujours utiliser la fusion dans l'environnement graphique, et ce n'est pas anodin d'invoquer la différence normale avec cette configuration, donc 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 garde toujours le bon vieux git diff .

1
répondu abo-abo 2013-07-11 07:36:25

j'utilise kom Pare sur ubuntu:

sudo apt-get install kompare

pour comparer deux branches:

git difftool -t kompare <my_branch> master
0
répondu Bilal and Olga 2010-02-15 17:33:30

si vous avez déjà un outil de diff associé à des types de fichiers (disons, parce que vous avez installé TortoiseSVN qui vient avec un visualiseur de diff) vous pouvez simplement pipe la sortie régulière git diff à un fichier "temp", puis juste ouvrir ce fichier directement sans avoir besoin de savoir quoi que ce soit sur le visualiseur:

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

le Définir comme un alias global fonctionne encore mieux: git what

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
0
répondu drzaus 2014-01-28 20:31:36

si vous n'êtes pas fait pour la ligne de commande, alors si vous installez tortoise Git, vous pouvez faire un clic droit sur un fichier pour obtenir un sous-menu tortoisegit avec l'option" Diff later".

lorsque vous sélectionnez cette option sur le premier fichier, vous pouvez ensuite cliquer avec le bouton droit de la souris sur le deuxième fichier, aller au sous-menu tortoisegit et sélectionner " Diff with = = yourfilehere==" Cela donnera au tortoisegitmerge gui pour le résultat.

0
répondu user3270579 2016-01-11 14:58:17

vous pouvez essayer xd http://github.com/jiqingtang/xd , qui est GUI wrapper pour git/SVN diff. Ce n'est pas un outil de diff lui-même. Vous exécutez xd quand vous voulez exécuter git diff ou svn diff et il vous montrera une liste de fichiers, une fenêtre de prévisualisation et vous pouvez lancer n'importe quel outil diff que vous aimez, y compris tkdiff, xxdiff, gvimdiff, emacs(ediff), xemacs(ediff), meld, diffus, kom pare et kdiff3. Vous pouvez également exécuter n'importe quel outil personnalisé.

malheureusement, L'outil ne supporte pas Windows.

Divulgation : je suis l'auteur de cet outil.

0
répondu Jiqing Tang 2017-09-18 14:23:50