Comment afficher la sortie « diff git » avec mon outil préféré diff / spectateur?

voix
669

Quand je tape git diff, je veux voir la sortie avec mon outil visuel diff de choix (SourceGear « DiffMerge » sous Windows). Comment puis-je configurer git pour le faire?

Créé 31/10/2008 à 23:55
source utilisateur
Dans d'autres langues...                            


26 réponses

voix
361

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


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

Il existe deux façons de spécifier un outil de comparaison externe.

La première est la méthode utilisée, en définissant la variable GIT_EXTERNAL_DIFF. Cependant, la variable est censé pointer vers le chemin complet de l'exécutable. En outre, l'exécutable spécifié par GIT_EXTERNAL_DIFF sera appelée 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 de diff nécessiteront un ordre différent (et seulement quelques-uns) des arguments, vous devrez probablement spécifier un script au lieu wrapper, qui appelle à son tour l'outil réel diff.

La deuxième méthode, que je préfère, est de configurer l'outil de diff externe via « config git » . Voici ce que j'ai fait:

1) Créer un script wrapper « de 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>" "$2" "$5" | cat
--8<-(snap)--

Comme vous pouvez le voir, seul le second ( "old-file") et cinquième ( "new-file") arguments seront transmis à l'outil de diff.

2) Type

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

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

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

Assurez-vous d'utiliser la syntaxe correcte pour spécifier les chemins d'accès au script d'emballage et un outil de diff, utilisez-à-dire avant tailladé au lieu de barre oblique inverse. Dans mon cas, je

[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 d'emballage. Attention à la fuite « chat »!

(Je suppose que le « | cat» est nécessaire que pour certains programmes qui ne peuvent pas retourner un état de retour approprié ou cohérent. Vous pourriez vouloir essayer sans le chat de fuite si votre outil de comparaison a le statut de retour explicite)


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

Créé 01/11/2008 à 00:03
source utilisateur

voix
194

Pour compléter ma précédente réponse config « diff.external » ci - dessus:

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

= USAGES '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(voir --extcmddans la dernière partie de cette réponse)

$LOCALcontient le contenu du fichier de la révision de départ et $REMOTEcontient le contenu du fichier dans la révision de fin.
$BASEcontient le contenu du fichier dans le WOR

Il est fondamentalement git-mergetoolmodifié pour fonctionner sur l'indice git / worktree.

Le cas d'utilisation habituelle pour ce script est quand vous avez soit mis en scène ou des changements Unstaged et vous souhaitez voir les changements dans un visualisateur de différences côte à côte (par exemple xxdiff, tkdiff, etc.).

git difftool [<filename>*]

Un autre cas d'utilisation est lorsque vous souhaitez voir les mêmes informations, mais comparez commits arbitraires (ce qui est la partie où pourrait être mieux l'analyse syntaxique de revarg)

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

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

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

Remarque: depuis Git 2.5, git config diff.tool winmergeest assez!
Voir " git mergetool winmerge "

Et depuis Git 1.7.11 , vous avez la possibilité --dir-diff, afin de frayer des outils diff externes qui peuvent comparer deux hiérarchies de répertoire à la fois après avoir rempli deux répertoires temporaires, au lieu de l' exécution d' une instance de l'outil externe une fois par une paire de fichiers.


Avant Git 2.5:

Cas pratique pour configurer difftoolvotre 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 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éer un autre script shell, et la appropriée difftool.myDiffTool.cmddirective de configuration.
Ensuite , vous pouvez facilement changer d' outil avec la diff.toolconfig.

Vous avez également cette entrée de blog par Dave pour ajouter d' autres détails.
(Ou cette question pour les winmergeuoptions)

L'intérêt de ce paramètre est le winmerge.shscénario : vous pouvez le personnaliser à prendre en compte des cas particuliers.

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

  • de nouveaux fichiers dans les deux origine ou de destination
  • supprimés des fichiers en format origine ou de destination

Comme Kem Mason mentionne dans sa réponse , vous pouvez également éviter tout emballage en utilisant l' --extcmdoption de :

--extcmd=<command>

Spécifiez une commande personnalisée pour l' affichage diffs. git-difftoolne tient pas compte des valeurs par défaut configurées et fonctionne $command $LOCAL $REMOTElorsque cette option est spécifiée.

Par exemple, voici comment gitkest en mesure d'exécuter / utiliser un diffoutil .

Créé 04/06/2009 à 09:25
source utilisateur

voix
105

Dans l'esprit de répondre à des questions qui sont un peu différent de celui demandé. Essayez cette solution:

$ meld my_project_using_git

Meld comprend git et fournit la navigation autour des changements récents.

Créé 14/03/2010 à 17:28
source utilisateur

voix
37

Depuis la version 1.6.3 git il est « difftool git » que vous pouvez configurer pour utiliser votre outil de comparaison graphique favori. Actuellement pris en charge hors de la boîte sont kdiff3, kompare, tkdiff, MELD xxdiff, émergent, vimdiff, gvimdiff, ecmerge, diffuse et opendiff ; si l'outil que vous voulez utiliser ne figure pas sur cette liste, vous pouvez toujours utiliser « difftool.<tool>.cmd» option de configuration.

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

Créé 23/05/2009 à 12:37
source utilisateur

voix
33

Avec le nouveau git difftool , est aussi simple que d' ajouter ceci à votre .gitconfig fichier:

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

Consultez également diffall , un script simple je l' ai écrit pour étendre le comportement par défaut de diff gênant (OMI) d'ouvrir chacun en série.

Créé 27/08/2009 à 10:39
source utilisateur

voix
21

J'ai un ajout à ce sujet. J'aime utiliser régulièrement une application diff non pris en charge comme l'un des outils par défaut (par exemple kaléidoscope), par l'intermédiaire

git difftool -t

J'aime aussi avoir la valeur par défaut diffsoit juste la ligne de commande régulière, donc le réglage de la GIT_EXTERNAL_DIFFvariable ne soit pas une option.

Vous pouvez utiliser une quelconque diffapplication comme unique avec cette commande:

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

Il passe juste les 2 fichiers à la commande que vous spécifiez, de sorte que vous ne probablement pas besoin soit d'un emballage.

Créé 03/02/2011 à 01:16
source utilisateur

voix
17

S'appuyant sur la réponse de VonC à traiter le transfert de fichiers et des ajouts, 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

Ce qui est la même chose que mettre dans votre monde .gitconfig:

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

Ensuite , placez ce qui suit dans winmerge.shlequel doit se trouver 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
Créé 07/11/2010 à 08:12
source utilisateur

voix
10

Solution pour Windows / msys git

Après avoir lu les réponses, j'ai découvert un moyen plus simple qui consiste à changer un seul fichier.

  1. Créez un fichier batch pour appeler votre programme diff, avec l'argument 2 et 5. Ce fichier doit être quelque part dans votre chemin. (Si vous ne savez pas où c'est, mettez-le dans c: \ windows). Appelez, 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 pointer vers votre fichier batch. 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 des guillemets, ou spécifier des informations de chemin, sinon cela ne fonctionnera pas. Voilà pourquoi gitdiff.bat doit être dans votre chemin.

Maintenant, lorsque vous tapez « git diff », il appellera votre lecteur de diff externe.

Créé 21/02/2009 à 20:10
source utilisateur

voix
8

Si vous faites cela par 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`
Créé 30/03/2010 à 18:42
source utilisateur

voix
7

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 en tapant (en précisant le cas échéant le nom du fichier ainsi):

git difftool
Créé 04/11/2014 à 10:36
source utilisateur

voix
7

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"
Créé 02/02/2012 à 22:26
source utilisateur

voix
6

Si vous êtes sur un Mac et Xcode, vous avez FileMerge installé. La commande terminal est opendiff, de sorte que vous pouvez juste fairegit difftool -t opendiff

Créé 04/09/2011 à 10:03
source utilisateur

voix
6

Voici un fichier batch qui fonctionne pour Windows - suppose DiffMerge installé dans l'emplacement par défaut, poignées x64, poignées avant de remplacer backslash si nécessaire et a la capacité de s'installer. Devrait être facile à remplacer DiffMerge avec votre programme diff favori.

À 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
Créé 09/04/2009 à 03:21
source utilisateur

voix
6

introduction

Pour référence, je voudrais inclure ma variation sur la réponse de VonC. Gardez à l'esprit que j'utilise la version MSys de Git (1.6.0.2 à ce moment) avec PATH modifié, et en cours d'exécution Git lui-même de Powershell (ou cmd.exe), et non le shell Bash.

J'introduit une nouvelle commande, gitdiff. L' exécution de cette commande redirige temporairement git diffd'utiliser un programme visuel diff de votre choix (par opposition à la solution de VonC qui le fait en permanence). Cela me permet d'avoir à la fois la fonctionnalité Git par défaut diff ( git diff), ainsi que la fonctionnalité visuelle diff ( gitdiff). Les deux commandes prennent les mêmes paramètres, donc par exemple aux changements visuellement diff dans un fichier particulier , vous pouvez taper

gitdiff path/file.txt

Installer

Notez que $GitInstallest utilisé comme un espace réservé pour le répertoire dans lequel 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( en remplacement de l' [visual_diff_exe]espace réservé avec le chemin complet au 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 êtes maintenant terminé. Exécution à gitdiffpartir d'un dépôt Git doit maintenant appeler votre programme visuel de diff pour chaque fichier qui a été modifié.

Créé 25/12/2008 à 16:44
source utilisateur

voix
5

installer meld

 # apt-get install meld

Choisissez ensuite que difftool

 $ git config --global diff.tool meld

Si voulez exécuter Tou sur le type de console:

 $ git difftool

Si vous voulez 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 appuyez sur Entrée pour utiliser meld (par défaut), cela ouvrirait mode graphique, que la magie enregistrer et presse cette détermination de la fusion. C'est tout

Créé 19/09/2015 à 01:46
source utilisateur

voix
5

Pour une version Linux de la façon de configurer un outil de diff sur les versions git avant 1.6.3 (1.6.3 ajouté difftool à git) c'est un grand tutoriel concis,

en bref:

Étape 1: ajouter à votre .gitconfig

[diff]
  external = git_diff_wrapper
[pager]
  diff =

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

#!/bin/sh

vimdiff "$2" "$5"
Créé 22/10/2009 à 14:28
source utilisateur

voix
4

Sous Mac OS X,

git difftool -t diffuse 

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

sudo port install diffuse
Créé 09/05/2016 à 06:52
source utilisateur

voix
3

Après avoir examiné d'autres outils de comparaison externe, je trouve que la diffvue dans IntelliJ IDEA (et Android Studio) est le meilleur pour moi.

Étape 1 - Configuration IntelliJ IDEA à exécuter à partir de la ligne de commande

Si vous souhaitez utiliser IntelliJ IDEA comme outil de diff vous devez d' abord la configuration IntelliJ IDEA à exécuter à partir de la ligne de commande en suivant les instructions ici :

Sur macOS ou UNIX:

  1. Assurez-vous IDEA IntelliJ est en cours d'exécution.
  2. Dans le menu principal, choisissez Tools | Create Command-line Launcher. La boîte de dialogue Créer un lanceur de script ouvre, avec le chemin proposé et le nom du lanceur de script. Vous pouvez accepter par défaut ou indiquer votre propre chemin. Faire un avis de celui - ci, comme vous en aurez besoin plus tard. En dehors de IntelliJ IDEA, ajoutez le chemin et le nom du lanceur de script sur votre chemin.

Sous Windows:

  1. Indiquez l'emplacement de l'exécutable IDEA IntelliJ dans la variable d'environnement système Path. Dans ce cas, vous serez en mesure d'invoquer l'exécutable IntelliJ IDEA et d'autres commandes d'IntelliJ IDEA partir d'un répertoire.

Étape 2 - configurer git utiliser IntelliJ IDEA comme difftool

En suivant les instructions sur ce 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 config 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 difftoolougit difftool HEAD~1

Créé 20/06/2017 à 22:09
source utilisateur

voix
3

vous pouvez utiliser git difftool.

par exemple si vous avez meld , vous pouvez modifier les Branchs masteret develpar:

git config --global diff.external meld
git difftool master..devel
Créé 06/12/2013 à 12:23
source utilisateur

voix
2

J'ai essayé les trucs de fantaisie ici (avec tkdiff) et rien ne fonctionnait pour moi. Donc, je l'ai écrit le script suivant, tkgitdiff. Il fait ce que je besoin de le 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
Créé 05/12/2013 à 01:26
source utilisateur

voix
1

Les éléments suivants peuvent être glanées à partir des autres réponses ici, mais pour moi il est (trop d'informations) difficile,, voici donc le « il suffit de taper dans » réponse pour tkdiff:

git difftool --tool=tkdiff <path to the file to be diffed>

Vous pouvez remplacer le nom de l'exécutable de votre outil favori pour diffing tkdiff. Tant que (par exemple tkdiff), (ou votre outil favori diffing) est dans votre PATH, il sera lancé.

Créé 18/12/2018 à 17:01
source utilisateur

voix
1

Je me sers de ce bit dans ~/.gitconfigdepuis 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 suis fatigué de toujours en utilisant meld dans un environnement graphique, et ce n'est pas trivial d'invoquer la diff 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 reçois toujours de garder le bon vieux git diff.

Créé 11/07/2013 à 08:36
source utilisateur

voix
0

Si vous n'êtes pas un pour la ligne de commande, si vous installez tortoisegit vous pouvez faire un clic droit sur un fichier pour obtenir un sous-menu TortoiseGit avec l'option « Diff plus tard ».

Lorsque vous sélectionnez ce le premier fichier que vous pouvez faire un clic droit sur le second fichier, allez dans le sous-menu TortoiseGit et sélectionnez « Diff avec == == yourfilehere » Cela donnera l'IUG de tortoisegitmerge pour le résultat.

Créé 11/01/2016 à 14:58
source utilisateur

voix
0

Si vous arrive d'avoir déjà un outil de comparaison associé à des types de fichiers ( par exemple, parce que vous avez installé TortoiseSVN qui est livré avec une visionneuse diff) vous pouvez simplement redirigez la régulière git diffsortie vers un fichier « temp », puis il suffit d' ouvrir ce fichier directement , sans avoir besoin de connaître quoi que ce soit au sujet du spectateur:

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

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

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
Créé 28/01/2014 à 21:31
source utilisateur

voix
0

Vous pouvez essayer xd http://github.com/jiqingtang/xd , qui est wrapper GUI pour diff GIT / SVN. Il est pas un outil de comparaison lui - même. Vous exécutez xdquand vous voulez exécuter git diffou svn diffet il vous affichera une liste des fichiers, une fenêtre d'aperçu et vous pouvez lancer un outil de diff que vous voulez, y compris tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), MELD diffuse, kompare et kdiff3. Vous pouvez également exécuter un outil personnalisé.

Malheureusement, l'outil ne supporte pas Windows.

Divulgation : Je suis l'auteur de cet outil.

Créé 01/10/2010 à 08:29
source utilisateur

voix
0

J'utilise kompare sur ubuntu:

sudo apt-get install kompare

Pour comparer deux branches:

git difftool -t kompare <my_branch> master
Créé 15/02/2010 à 18:33
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more