web-dev-qa-db-fra.com

Comment puis-je obtenir un diff côte à côte quand je fais "git diff"?

Quand je tape "git diff", j'aimerais voir un diff côte à côte, comme avec "diff -y", ou aimer afficher le diff dans un outil de diff interactif comme "kdiff3". Comment cela peut-il être fait?

121
user783774

Bien que Git ait une implémentation interne de diff, vous pouvez configurer un outil externe à la place. 

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

  1. définir les variables d'environnement GIT_EXTERNAL_DIFF et GIT_DIFF_OPTS.
  2. configuration de l'outil de diff externe via git config

Voir également:

Lors de l'exécution d'un git diff, Git vérifie les paramètres des variables d'environnement ci-dessus et son fichier .gitconfig.

Par défaut, Git transmet les sept arguments suivants au programme diff:

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

Généralement, vous n’avez besoin que des paramètres ancien-fichier et nouveau-fichier. Bien sûr, la plupart des outils diff prennent seulement deux noms de fichier en argument. Cela signifie que vous devez écrire un petit script wrapper, qui prend les arguments fournis par Git au script et les transmet au programme git externe de votre choix.

Supposons que vous mettiez votre script wrapper sous ~/scripts/my_diff.sh:

#!/bin/bash
# un-comment one diff tool you'd like to use

# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5" 

# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"

# using Meld 
/usr/bin/meld "$2" "$5"

# using VIM
# /usr/bin/vim -d "$2" "$5"

vous devez ensuite rendre ce script exécutable:

chmod a+x ~/scripts/my_diff.sh

vous devez ensuite dire à Git comment et où trouver votre script de wrapper de diff personnalisé . Vous avez trois choix pour le faire: (Je préfère éditer le fichier .gitconfig)

  1. Utilisation de GIT_EXTERNAL_DIFF, GIT_DIFF_OPTS

    par exemple. Dans votre fichier .bashrc ou .bash_profile, vous pouvez définir:

    GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
    export GIT_EXTERNAL_DIFF
    
  2. Utiliser git config

    utilisez "git config" pour définir où se trouve votre script wrapper:

    git config --global diff.external ~/scripts/my_diff.sh
    
  3. Modification de votre fichier ~/.gitconfig

    vous pouvez éditer votre fichier ~/.gitconfig pour ajouter ces lignes:

    [diff]
      external = ~/scripts/my_diff.sh
    

Remarque:

De manière similaire à l'installation de votre outil de différenciation personnalisé, vous pouvez également installer un outil de fusion personnalisé, qui pourrait être un outil de fusion visuel pour une meilleure visualisation de la fusion. (voir la page progit.org)

Voir: http://fredpalma.com/518/visual-diff-and-merge-tool/ et https://git-scm.com/book/fr/v2/Customizing-Git-Git -Configuration

79
Tilo

Essayez git difftool

Utilisez git difftool au lieu de git diff. Vous ne reviendrez jamais.

UPDATE pour ajouter un exemple d'utilisation:

Voici un lien vers un autre stackoverflow qui parle de git difftool: Comment afficher la sortie 'git diff' avec mon outil de diff/visualiseur préféré?

Pour les versions plus récentes de git, la commande difftool prend en charge de nombreux outils de différenciation externes prédéfinis. Par exemple, vimdiff est automatiquement pris en charge et peut être ouvert à partir de la ligne de commande par: 

cd /path/to/git/repo
git difftool --tool=vimdiff

D'autres outils de diff externes pris en charge sont répertoriés via git difftool --tool-help. Voici un exemple de sortie:

'git difftool --tool=<tool>' may be set to one of the following:
        araxis
        kompare
        vimdiff
        vimdiff2

The following tools are valid, but not currently available:
        bc3
        codecompare
        deltawalker
        diffuse
        ecmerge
        emerge
        gvimdiff
        gvimdiff2
        kdiff3
        meld
        opendiff
        tkdiff
        xxdiff
112
Matt Ball

Vous pouvez également essayer git diff --Word-diff. Ce n'est pas exactement côte à côte, mais en quelque sorte meilleur, vous pourriez donc le préférer à vos besoins actuels.

37
mb14

ydiff (anciennement appelé cdiff) peut afficher côte à côte, incrémental et colourful diff.

Avec cela, vous pouvez utiliser:

git difftool -y -x "ydiff -s"

Ceci lancera ydiff en mode d’affichage côte à côte pour chacun des fichiers avec des différences.

Voir la page ydiffdu référentiel GitHub pour plus de détails et une démonstration.

29
ymattw

Vous pouvez effectuer une diff côte à côte en utilisant sdiff comme suit:

$ git difftool -y -x sdiff  HEAD^ | less

HEAD^ est un exemple que vous devez remplacer par ce que vous souhaitez comparer.

J'ai trouvé cette solution ici où il y a quelques autres suggestions également. Cependant, cette réponse est la question du PO, succinctement et clairement.

Voir le man git-difftool pour une explication des arguments.

10
starfry

Si vous souhaitez voir des différences côte à côte dans un navigateur sans faire intervenir GitHub, vous pouvez utiliser git webdiff , un remplacement immédiat pour git diff:

$ pip install webdiff
$ git webdiff

Cela offre un certain nombre d'avantages par rapport aux outils de traitement graphiques traditionnels tels que tkdiff, en ce sens qu'il peut vous permettre de mettre en évidence la syntaxe et d'afficher les différences d'image.

En savoir plus à ce sujet ici .

7
danvk

J'utilise colordiff

Sur Mac OS X, installez-le avec 

$ Sudo port install colordiff

Sous Linux, il est possible que apt get install colordiff ou quelque chose comme ça, dépend de votre distribution.

Ensuite:

$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD

Ou créer un alias

$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""

Ensuite, vous pouvez l'utiliser

$ git diffy HEAD^ HEAD

Je l'ai appelé "diffy" parce que diff -y est le diff côte à côte dans Unix. Colordiff ajoute également des couleurs plus agréables . Dans l'option -ydw, la y est pour le côte à côte, la w consiste à ignorer les espaces, et la d est destinée à produire le diff minimal (habituellement, vous obtenez une meilleure résultat comme diff)

6
Luigi R. Viggiano
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'

alors simplement:

git diff
5
krzych

Pour unix, combinez juste git et la diff intégrée:

git show HEAD:path/to/file | diff -y - path/to/file

Bien sûr, vous pouvez remplacer HEAD par une autre référence git, et vous voudrez probablement ajouter quelque chose comme -W 170 à la commande diff.

Cela suppose que vous ne faites que comparer le contenu de votre répertoire avec une validation passée. La comparaison entre deux commits est plus complexe. Si votre Shell est bash, vous pouvez utiliser "substitution de processus":

diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)

REF1 et REF2 sont des références git - balises, branches ou hachages.

3
Walker Hale IV

Voici une approche. Si vous passez par moins, la largeur xterm est définie sur 80, ce qui n’est pas si chaud Mais si vous continuez la commande avec, par exemple, COLS = 210, vous pouvez utiliser votre xterm étendu.

gitdiff()
{
    local width=${COLS:-$(tput cols)}
    GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
2
Thomas Mellman

Personnellement, j'aime beaucoup icdiff !

Si vous êtes sur Mac OS X avec HomeBrew, faites simplement brew install icdiff.

Pour obtenir les étiquettes de fichier correctement, ainsi que d'autres fonctionnalités intéressantes, j'ai dans mon ~/.gitconfig:

[pager]
    difftool = true
[diff]
    tool = icdiff
[difftool "icdiff"]
    cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"

Et je l'utilise comme: git difftool

2
Jose Alban

Plusieurs autres ont déjà mentionné cdiff pour une différence côte à côte, mais personne n’en a donné une mise en œuvre complète. 

Setup cdiff:

git clone https://github.com/ymattw/cdiff.git
cd cdiff
ln -s `pwd`/cdiff ~/bin/cdiff
hash -r # refresh your PATH executable in bash (or 'rehash' if you use tcsh)
        # or just create a new terminal

Éditez ~/.gitconfig en insérant ces lignes:

[pager]
        diff = false
        show = false

[diff]
        tool = cdiff
        external = "cdiff -s $2 $5 #"

[difftool "cdiff"]
        cmd = cdiff -s \"$LOCAL\" \"$REMOTE\"

[alias]
        showw = show --ext-dif

Le pager off est nécessaire pour que cdiff fonctionne avec Diff, c’est essentiellement un pager de toute façon, donc c’est parfait. Difftool fonctionnera indépendamment de ces paramètres.

L'émission show est nécessaire car git show ne supporte que les outils de diff externes via un argument.

Le '#' à la fin de la commande externe diff est important. La commande diff de Git ajoute un $ @ (toutes les variables disponibles) à la commande diff, mais nous ne voulons que les deux noms de fichiers. Nous appelons donc ces deux personnes explicitement avec $ 2 et $ 5, puis nous cachons le $ @ derrière un commentaire qui autrement confondre sdiff. Résultat en une erreur qui ressemble à:

fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.

Les commandes Git qui produisent maintenant des différences côte à côte:

git diff <SHA1> <SHA2> 
git difftool <SHA1> <SHA2>
git showw <SHA>

Cdiff utilisation:

'SPACEBAR' - Advances the page of the current file.
'Q'        - Quits current file, thus advancing you to the next file.

Vous avez maintenant un diff côte à côte via git diff et difftool. Et vous avez le code source cdiff python pour la personnalisation des utilisateurs avancés si vous en avez besoin.

2
Eric

Cette question est apparue lorsque je cherchais un moyen rapide d'utiliser le moyen intégré à git pour localiser les différences. Mes critères de solution: 

  • Démarrage rapide, options intégrées nécessaires
  • Peut gérer plusieurs formats facilement, XML, différents langages de programmation
  • Identifiez rapidement les petites modifications de code dans les gros fichiers texte

J'ai trouvé cette réponse pour obtenir de la couleur dans git.

Pour obtenir côte à côte diff au lieu ligne diff, j'ai modifié l'excellent mb14 de answer avec les paramètres suivants:

$ git diff --Word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"

Si vous n'aimez pas le supplément [- ou {+, l'option --Word-diff=color peut être utilisée. 

$ git diff --Word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --Word-diff=color

Cela a permis d’obtenir une comparaison appropriée avec le texte json et xml et le code Java. 

En résumé, les options --Word-diff-regex offrent une visibilité utile ainsi que des paramètres de couleur pour obtenir une expérience colorisée du code source côte à côte par rapport au diff de ligne standard, lorsque vous parcourez des fichiers volumineux avec de petites modifications de ligne.

1
Mike

Si vous êtes sur un Mac, GitUp http://gitup.co/ est un très bon choix.

0
Xuan

Il y a beaucoup de bonnes réponses sur ce fil. Ma solution à ce problème était d'écrire un script.

Nommez ce 'git-scriptname' (et rendez-le exécutable et mettez-le dans votre PATH, comme n'importe quel script), et vous pourrez l'invoquer comme une commande git normale

$ git scriptname

La fonctionnalité réelle n'est que la dernière ligne. Voici la source:

#!/usr/bin/env zsh
#
#   Show a side-by-side diff of a particular file how it currently exists between:
#       * the file system
#       * in HEAD (latest committed changes)

function usage() {
    cat <<-HERE
    USAGE

    $(basename $1) <file>

    Show a side-by-side diff of a particular file between the current versions:

        * on the file system (latest edited changes)
        * in HEAD (latest committed changes)

HERE
}

if [[ $# = 0 ]]; then
    usage $0
    exit
fi

file=$1
diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R
0
Jon Carter

Ouvrez Intellij IDEA , sélectionnez un ou plusieurs commits dans la fenêtre "Contrôle de version", parcourez les fichiers modifiés et double-cliquez dessus pour examiner les modifications côte à côte pour chaque fichier.

Avec le programme de lancement de ligne de commande fourni, vous pouvez afficher IDEA n’importe où avec un simple idea some/path

 version control view  diff view

0
Holger Brandl