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?
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 à:
- comment configurer DiffMerge avec msysgit / gitk? qui illustre les montages en béton de DiffMerge et WinMerge pour MsysGit et gitk
- comment configurer un éditeur pour travailler avec Git sur Windows? pour la définition de Notepad++ en tant qu'éditeur externe.
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
.
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.
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".
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.
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.
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
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.
-
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
-
définit la variable d'environnement pour pointer vers votre fichier de lots. Par exemple:
GIT_EXTERNAL_DIFF=gitdiff.bat
. Ou par powershell en tapantgit 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.
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 `
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"
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é.
-
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
-
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
-
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é.
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
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
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 "" ""
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
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
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
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:
- assurez-vous que IntelliJ IDEA fonctionne.
- 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:
- 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"
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
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
.
j'utilise kom Pare sur ubuntu:
sudo apt-get install kompare
pour comparer deux branches:
git difftool -t kompare <my_branch> master
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"
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.
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.