Lorsque je tape “git diff“, j’aimerais voir un diff côte à côte, comme avec “diff -y”, ou afficher le diff dans un outil de diffusion interactif tel que “kdiff3”. Comment cela peut-il être fait?
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 externe:
GIT_EXTERNAL_DIFF
et GIT_DIFF_OPTS
. git config
Voir également:
git diff --help
Lorsque vous faites un git diff
, Git vérifie les parameters 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
Vous n’avez généralement besoin que des parameters d’ancien fichier et de nouveau fichier. Bien sûr, la plupart des outils diff ne prennent que deux noms de fichiers en argument. Cela signifie que vous devez écrire un petit script d’encapsulation, qui prend les arguments fournis par Git au script, et les transmet au programme git externe de votre choix.
Disons que vous mettez 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 indiquer à Git comment et où trouver votre script de wrapper personnalisé. Vous avez trois choix pour faire cela: (je préfère éditer le fichier .gitconfig)
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
Utiliser git config
utilisez “git config” pour définir l’emplacement de votre script d’encapsulation:
git config --global diff.external ~/scripts/my_diff.sh
Modifier votre fichier ~/.gitconfig
vous pouvez éditer votre fichier ~/.gitconfig
pour append ces lignes:
[diff] external = ~/scripts/my_diff.sh
Remarque:
De même que pour l’installation de votre outil de personnalisation, vous pouvez également installer un outil de fusion personnalisé, qui pourrait être un outil de fusion visuelle pour vous aider à mieux visualiser la fusion. (voir la page progit.org)
Voir: http://fredpalma.com/518/visual-diff-and-merge-tool/ et https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
Utilisez git difftool
au lieu de git diff
. Tu ne reviendras jamais.
UPDATE pour append 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 / visualiseur de diff préféré?
Pour les nouvelles versions de git
, la commande difftool
prend en charge de nombreux outils de diff externes difftool
l’ difftool
. Par exemple, vimdiff
est supporté automatiquement et peut être ouvert à partir de la ligne de commande par:
cd /path/to/git/repo git difftool --tool=vimdiff
Les autres outils de diff externes supportés sont listés via git difftool --tool-help
Voici un exemple de sortie:
'git difftool --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
Vous pouvez également essayer git diff --word-diff
. Ce n’est pas exactement côte à côte, mais d’une certaine manière mieux, de sorte que vous pourriez le préférer à votre besoin réel.
cdiff
peut afficher côte à côte , incrémentiel et coloré , voir sa page d’accueil pour plus de détails et de démonstration sur https://github.com/ymattw/cdiff
Vous pouvez faire un diff
side-by-side en utilisant sdiff
comme suit:
$ git difftool -y -x sdiff HEAD^ | less
où HEAD^
est un exemple que vous devriez remplacer par tout ce que vous voulez modifier.
J’ai trouvé cette solution ici où il y a quelques autres suggestions également. Cependant, cette réponse est la question du PO de manière succincte et claire.
Voir l’ homme git-difftool pour une explication des arguments.
J’utilise colordiff .
Sous Mac OS X, installez-le avec
$ sudo port install colordiff
Sous Linux, il est possible que apt get install colordiff
ou quelque chose du genre, en fonction de votre dissortingbution.
Alors:
$ 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” car diff -y
est le diff côte à côte dans unix. Colordiff ajoute également des couleurs, qui sont plus agréables. Dans l’option -ydw
, le y
est pour le side-by-side, le w
doit ignorer les espaces blancs, et le d
doit produire le diff minimal (généralement vous obtenez un meilleur résultat que diff)
Si vous souhaitez voir les diffs côte à côte dans un navigateur sans impliquer GitHub, vous pouvez profiter de git webdiff , un remplaçant pour git diff
:
$ pip install webdiff $ git webdiff
Cela offre un certain nombre d’avantages par rapport aux outils d’interface graphique traditionnels, tels que tkdiff
en ce sens qu’ils peuvent vous permettre de mettre en évidence la syntaxe et d’afficher les différences d’image.
En savoir plus à ce sujet ici .
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
alors simplement:
git diff
Pour unix, combiner juste git
et le diff
intégré:
git show HEAD:path/to/file | diff -y - path/to/file
Bien sûr, vous pouvez remplacer HEAD par toute autre référence git, et vous voudrez probablement append quelque chose comme -W 170
à la commande diff.
Cela suppose que vous comparez simplement le contenu de votre répertoire avec un commit passé. 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)
où REF1
et REF2
sont des références git - balises, twigs ou hachages.
Personnellement, j’aime vraiment icdiff !
Si vous êtes sur Mac OS X
avec HomeBrew
, il suffit de faire l’ 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
Voici une approche. Si vous utilisez moins, la largeur de xterm est définie à 80, ce qui n’est pas si chaud. Mais si vous continuez la commande avec, par exemple, COLS = 210, vous pouvez utiliser votre xterm développé.
gitdiff() { local width=${COLS:-$(tput cols)} GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@" }
Plusieurs autres ont déjà mentionné cdiff pour git side-by-side, mais personne ne l’a pleinement mis en œuvre.
Installez 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
Editez ~ / .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 pagineur est nécessaire pour que cdiff fonctionne avec Diff, c’est essentiellement un pager, donc ça va. Difftool fonctionnera indépendamment de ces parameters.
L’alias de show est nécessaire car git show ne supporte que les outils de diff externes via l’argument.
Le “#” à la fin de la commande externe diff est important. La commande diff de Git ajoute un $ @ (toutes les variables diff disponibles) à la commande diff, mais nous ne voulons que les deux noms de fichiers. Nous appelons donc ces deux explicitement avec $ 2 et $ 5, puis cachons le $ @ derrière un commentaire qui confondre autrement sdiff. Résultant en une erreur qui ressemble à:
fatal: : no such path in the working tree Use 'git -- ...' to specify paths that do not exist locally.
Commandes Git qui produisent maintenant des différences côte à côte:
git diff git difftool git showw
Utilisation de Cdiff:
'SPACEBAR' - Advances the page of the current file. 'Q' - Quits current file, thus advancing you to the next file.
Vous avez maintenant des différences côte à côte via diff et difftool. Et vous avez le code source cdiff python pour la personnalisation des utilisateurs expérimentés si vous en avez besoin.
Cette question est apparue lorsque je cherchais un moyen rapide d’utiliser la méthode intégrée de git pour localiser les différences. Mes critères de solution:
J’ai trouvé cette réponse pour obtenir de la couleur dans git.
Pour obtenir des différences côte à côte plutôt que des différences de lignes, j’ai modifié l’excellente réponse de mb14 sur cette question avec les parameters 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 aidé à obtenir une comparaison correcte avec le texte json et xml et le code java.
En résumé, les --word-diff-regex
une visibilité utile avec les parameters de couleur pour obtenir une expérience colorée du code source côte à côte par rapport à la ligne standard, lors de la navigation dans de gros fichiers avec des modifications de lignes minuscules.
Il y a beaucoup de bonnes réponses sur ce sujet. Ma solution pour ce problème était d’écrire un script.
Nommez-le ‘git-scriptname’ (et rendez-le exécutable et placez-le dans votre PATH, comme n’importe quel script), et vous pouvez l’invoquer comme une commande git normale en exécutant
$ git scriptname
La fonctionnalité actuelle 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) 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
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 lanceur de ligne de commande fourni, vous pouvez apporter IDEA partout avec une idea some/path
simple idea some/path
Si vous êtes sur un Mac, GitUp http://gitup.co/ est un bon choix.