803 votes

Comment puis-je visualiser les résultats de "git diff" avec mon outil de comparaison 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 puis-je configurer git pour faire cela ?

115 votes

Vous pouvez utiliser "git difftool" au lieu de "git diff" dans toutes les nouvelles versions de git. Cela ouvrira un programme de comparaison visuelle.

0 votes

Concernant le nouveau difftool script, j'ai ajouté une réponse ci-dessous : stackoverflow.com/questions/255202/

2 votes

Gitx - gitx.frim.nl . Nuff said.

403voto

VonC Points 414372

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


C'est peut-être ça. article vous aidera. Voici les meilleures parties :

Il y a deux façons différentes de spécifier un outil de comparaison 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 censé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 de diff nécessitent un ordre différent (et seulement certains) des arguments, vous devrez très probablement spécifier un script enveloppant à la place, qui appelle à son tour le véritable outil de diff.

La deuxième 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éer un wrapper 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

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

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

2) Type

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

à l'invite de commande, en remplaçant par le chemin d'accès à "git-diff-wrapper.sh", de sorte que votre ~/.gitconfig contienne

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

Assurez-vous d'utiliser la syntaxe correcte pour spécifier les chemins vers le wrapper script et diff. c'est-à-dire utilisez des slashs avant au lieu de backslashes. 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 wrapper script. Attention au "chat" qui suit !

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

( Diomidis Spinellis ajoute dans les commentaires :

El cat est nécessaire, car diff(1) par défaut, se termine avec un code d'erreur si les fichiers sont différents.
Git s'attend à ce que le programme diff externe ne se termine avec un code d'erreur que si une erreur réelle se produit, par exemple s'il manque de mémoire.
En faisant passer la sortie de git a cat le code d'erreur non nul est masqué.
Plus efficacement, le programme pourrait simplement exécuter exit avec un argument de 0.)


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

2 votes

Ah, j'avais mis le programme diff externe mais je ne savais pas pour les 7 arguments, merci.

4 votes

Bravo ... c'est très pratique. Je l'ai configuré avec "opendiff" (qui lance l'utilitaire XCode FileMerge sous Mac OS X).

0 votes

@Ryan : c'est génial :) Avez-vous utilisé le paramètre "diff.external" détaillé dans cette réponse ou le "git difftool" de ma deuxième réponse ci-dessous ?

219voto

VonC Points 414372

Pour compléter mon précédent "Réponse à la configuration "diff.external ci-dessus :

Comme mentionné par Jakub , Git1.6.3 introduit git difftool proposé à l'origine 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 à partir de la révision de départ et $REMOTE contient le contenu du fichier dans la révision finale.
$BASE contient le contenu du fichier dans le wor

En gros, c'est git-mergetool modifié pour fonctionner sur l'index/arbre de travail git.

Le cas d'utilisation habituel de ce script est lorsque vous avez des changements staged ou unstaged et que vous souhaitez voir les changements dans une visionneuse de différences côte à côte (par ex. xxdiff , tkdiff etc).

git difftool [<filename>*]

Un autre cas d'utilisation est lorsque vous souhaitez voir les mêmes informations mais que vous comparez des commits 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 arbre de travail actuel à quelque chose d'autre que HEAD (par exemple, une balise).

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 de comparaison externes qui peuvent comparer deux hiérarchies de répertoires à la fois après avoir rempli deux répertoires temporaires, au lieu de lancer une instance de l'outil externe une fois par paire de fichiers.


Avant Git 2.5 :

Cas pratique pour la configuration difftool avec votre outil de différenciation 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 faisant partie 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 disposez d'un autre outil (kdiff3, P4Diff, ...), créez un autre shell script, et l'outil approprié difftool.myDiffTool.cmd directive de configuration.
Ensuite, vous pouvez facilement changer d'outil avec le diff.tool config.

Vous avez aussi ceci entrée de blog par Dave pour ajouter d'autres détails.
(Ou cette question pour le winmergeu options)

L'intérêt de ce paramètre est le suivant winmerge.sh script : vous pouvez le personnaliser pour tenir compte de cas particuliers.

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

  • nouveau dans les fichiers d'origine ou de destination
  • supprimé dans les fichiers d'origine ou de destination

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

--extcmd=<command>

Spécifier une commande personnalisée pour visualiser 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, voici comment gitk est capable d'exécuter/utiliser n'importe quel diff outil .

11 votes

J'ai dû échapper le $, pour $LOCAL et $REMOTE pour éviter qu'ils ne deviennent "" et "". J'éditerais pour dire git config --globla difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""

0 votes

En outre, avez-vous une idée de la façon dont l'option -s (ouvrir plusieurs diffs dans une fenêtre winmerge) peut fonctionner dans ce schéma ?

0 votes

@Frank : Je confirme, le $PATH o %PATH% est respecté lorsqu'il s'agit de git config (quelle est votre configuration ? Version de Git ? Système d'exploitation ?). Et si vous voulez signaler un message à Carlos, votre commentaire doit commencer par ' @ ' : @Carlos (voir meta.stackexchange.com/questions/1093/ )

119voto

Charles Merriam Points 4498

Essayez cette solution :

$ meld my_project_using_git

Meld comprend Git et permet de s'orienter dans les changements récents.

19 votes

C'est génial, beaucoup plus facile à taper meld . que git difftool et de devoir visualiser les fichiers modifiés de manière séquentielle. Et c'est beaucoup plus proche de la méthode Mercurial. hg vdiff plugin.

7 votes

Aussi, meld . fonctionne également sur les projets Mercurial et Subversion, au cas où quelqu'un serait curieux.

0 votes

Hmm, quand je fais cela, une liste des fichiers modifiés s'affiche. Lorsque je clique sur l'un d'eux ou que je fais "comparer", il s'ouvre seul dans un onglet séparé. Comment puis-je obtenir une différence ?

48voto

Seba Illingworth Points 1536

Avec le nouveau git difftool c'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\""

En option, ajoutez également :

[difftool]
    prompt = false

Consultez également Diffuser un simple script que j'ai écrit pour étendre l'ennuyeux (IMO) comportement de diff par défaut d'ouvrir chacun en série.

Le fichier .gitconfig global sous Windows se trouve à l'adresse suivante %USERPROFILE%\.gitconfig

1 votes

Qu'est-ce que $local et qu'est-ce que $remote ?

3 votes

+1 pour une méthode qui ne nécessite pas de wrapper script.

0 votes

@CJohnson : Chemin du fichier original et chemin du fichier modifié, respectivement.

43voto

Jakub Narębski Points 87537

Depuis la version 1.6.3 de Git, il existe un " git difftool "que vous pouvez configurer pour utiliser votre outil graphique de comparaison préféré.

Les produits actuellement pris en charge (au moment de la rédaction de cette réponse) sont les suivants KDiff3 , Kompare , tkdiff , Meld , xxdiff , emerge, vimdiff, gvimdiff, ecmerge, Diffuse y opendiff ; si l'outil que vous voulez utiliser ne figure pas dans cette liste, vous pouvez toujours utiliser ' difftool.<tool>.cmd L'option de configuration '.

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

1 votes

Araxis Merge est également configuré. araxis.com/merge/scm_integration.html

11 votes

Exemple d'utilisation : git difftool -t kdiff3 HEAD

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X