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?
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:
GIT_EXTERNAL_DIFF
et GIT_DIFF_OPTS
.git config
Voir également:
git diff --help
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)
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 où se trouve votre script wrapper:
git config --global diff.external ~/scripts/my_diff.sh
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
Utilisez git difftool
au lieu de git diff
. Vous ne reviendrez jamais.
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
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.
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 ydiff
du référentiel GitHub pour plus de détails et une démonstration.
Vous pouvez effectuer une diff
côte à côte en utilisant sdiff
comme suit:
$ git difftool -y -x sdiff HEAD^ | less
où 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.
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 .
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)
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
alors simplement:
git diff
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)
où REF1
et REF2
sont des références git - balises, branches ou hachages.
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 "$@"
}
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
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.
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:
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.
Si vous êtes sur un Mac, GitUp http://gitup.co/ est un très bon choix.
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
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