Comment puis-je visualiser les différences par caractère dans un fichier diff unifié?

dites que je reçois un patch créé avec git format-patch . Le fichier est essentiellement un diff unifié avec quelques métadonnées. Si j'ouvre le fichier dans Vim, je peux voir quelles lignes ont été modifiées, mais je ne peux pas voir quels caractères dans les lignes modifiées diffèrent. Est-ce que quelqu'un connaît un moyen (en Vim, ou un autre logiciel libre qui fonctionne sur Ubuntu) de visualiser les différences par caractère?

un exemple de compteur où la différence par caractère est visualisée est lors de l'exécution vimdiff a b .

mise à jour Ven Nov 12 22: 36 :23 UTC 2010

diffpatch est utile pour le cas où vous travaillez avec un seul fichier.

mise à jour jeu Jun 16 17:56:10 UTC 2016

Check out diff-mettre en évidence dans git 2.9 . Ce script fait exactement ce que j'étais à l'origine chercher.

93
demandé sur Community 2010-07-12 23:52:13

7 réponses

étant donné vos références à Vim dans la question, Je ne suis pas sûr que ce soit la réponse que vous voulez :) mais Emacs peut le faire. Ouvrez le fichier contenant la diff, assurez-vous que vous êtes dans diff-mode (si le fichier s'appelle foo.diff ou foo.patch cela se produit automatiquement; sinon tapez M-x diff-mode RET ), allez dans le hunk qui vous intéresse et cliquez sur C-c C C C-B pour refine-hunk . Ou étape à travers le classer un morceau à la fois avec M-n ; qui fera le raffinage automatiquement.

12
répondu legoscia 2015-01-14 14:40:46

Dans git, vous pouvez fusionner sans commettre. Fusionnez d'abord votre patch, puis faites:

git diff --word-diff-regex=.

Notez le point après le signe égal.

134
répondu yingted 2012-04-13 02:59:42

(commentaires convertis en réponse par demande)

Versions avec une sortie moins bruyante que git diff --word-diff-regex=<re> et qui nécessitent moins de Dactylographie que, mais sont équivalentes, git diff --color-words --word-diff-regex=<re> .

Simple (ne souligne les changements d'espace):

git diff --color-words

Simple (souligne les changements de caractères individuels; ne souligne pas les changements d'espace):

git diff --color-words=.

plus complexe):

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

en général:

git diff --color-words=<re>

<re> est un regexp définissant des" mots " aux fins d'identifier des changements.

ceux-ci sont moins bruyants en ce qu'ils colorent les" mots "changé, alors qu'en utilisant juste --word-diff-regex=<re> entoure apparié" mots "avec coloré -/+ marqueurs.

101
répondu ntc2 2014-09-03 15:40:27
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

le regex ci-dessus ( de Thomas Rast ) fait un travail décent de séparation des fragments de diff au niveau de la ponctuation/caractère (tout en n'étant pas aussi bruyant que --word-diff-regex=. ).

j'ai posté une capture d'écran de la sortie résultante ici .


mise à jour:

cet article a quelque grande suggestion. Plus précisément, l'arbre contrib/ de la git repo a une écriture perl diff-highlight qui montre des reflets fins.

démarrage Rapide pour l'utiliser:

$ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight
$ chmod u+x diff-highlight
$ git diff --color=always HEAD~10 | diff-highlight | less -R
41
répondu Justin M. Keyes 2018-01-28 01:23:51

si vous n'avez rien contre l'installation de NodeJS, il y a un paquet appelé "diff-so-fancy" ( https://github.com/so-fancy/diff-so-fancy ), qui est très facile à installer et fonctionne parfaitement:

npm install -g diff-so-fancy
git diff --color | diff-so-fancy | less -R

Edit: je viens de découvrir que c'est en fait un papier d'emballage pour le diff-highlight officiel... Au moins c'est plus facile à installer pour les perlophobes comme moi et la page GitHub est bien documentée:)

4
répondu walnutz 2017-07-06 01:48:19

Je ne suis pas au courant de l'outil de différence par caractère, mais il y a un outil de différence par mot: wdiff.

consultez "exemples d'151930920" Top 4 Fichier Différence Outils UNIX / Linux – Diff, Colordiff, Wdiff, Vimdiff .

3
répondu thegeek 2010-07-13 08:05:46

après un peu de recherche, je remarque que cette question a été soulevée deux fois récemment sur la liste de diffusion principale Vim. Le nrrwrgn plugin a été mentionné tous les deux fois (faire deux régions étroites et les différencier). Utiliser NrrwRgn comme décrit par Christian Brabandt ressemble plus à une solution de contournement qu'à une solution, mais peut-être que c'est assez bon.

J'ai essayé NrrwRgn et il, avec: diffthis, était en effet utile pour illustrer les différences par caractère au sein de parties d'un même fichier. Mais ça a pris beaucoup de touches. Mon Vimscript est assez rouillé, mais il pourrait probablement être scripté. Peut-être que NrrwRgn pourrait être améliorée pour fournir la fonctionnalité désirée.

?

1
répondu Adam Monsen 2010-07-13 03:58:04