Comment puis-je avoir un différentiel côte à côte lorsque je diffère de «git diff»?

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:

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

Voir également:

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)

  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 l’emplacement de votre script d’encapsulation:

     git config --global diff.external ~/scripts/my_diff.sh 
  3. 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 

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) 

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:

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

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

vue de contrôle de version vue diff

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