web-dev-qa-db-fra.com

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

Supposons que j'obtienne 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 lesquelles caractères dans les lignes modifiées diffèrent. Quelqu'un connaît-il un moyen (dans Vim, ou un autre logiciel gratuit qui fonctionne sur Ubuntu) pour visualiser les différences par caractère?

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

mise à jour ven 12 nov 22:36:23 UTC 2010

diffpatch est utile pour le scénario où vous travaillez avec un seul fichier.

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

Découvrez diff-highlight dans git 2.9 . Ce script fait exactement ce que je cherchais à l'origine.

110
Adam Monsen

Compte tenu de vos références à Vim dans la question, je ne sais pas si c'est la réponse que vous voulez :) mais Emacs peut le faire. Ouvrez le fichier contenant le diff, assurez-vous que vous êtes dans diff-mode (si le fichier est nommé foo.diff ou foo.patch cela se produit automatiquement; sinon tapez M-x diff-mode RET), allez sur le morceau qui vous intéresse et appuyez sur C-c C-b pour refine-hunk. Ou parcourez le fichier un morceau à la fois avec M-n; cela fera le raffinage automatiquement.

12
legoscia

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

git diff --Word-diff-regex=.

Notez le point après le signe égal.

159
yingted

Voici quelques versions avec une sortie moins bruyante que git diff --Word-diff-regex=<re> et qui nécessitent moins de saisie que, mais sont équivalents à git diff --color-words --Word-diff-regex=<re>.

Simple (met en évidence les changements d'espace):

git diff --color-words

Simple (met en évidence les changements de caractères individuels; ne met pas en évidence les changements d'espace):

git diff --color-words=.

Plus complexe (met en évidence les changements d'espace):

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

En général:

git diff --color-words=<re>

<re> est une expression rationnelle définissant les "mots" dans le but d'identifier les changements.

Celles-ci sont moins bruyantes en ce qu'elles colorent les "mots" modifiés, alors qu'en utilisant simplement --Word-diff-regex=<re> entoure les "mots" assortis de -/+ Marqueurs.

125
ntc2
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 de bonnes suggestions. Plus précisément, le contrib/ l'arborescence du dépôt git a un diff-highlight Script Perl qui affiche 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
44
Justin M. Keyes

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 ), ce 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 wrapper pour le diff-highlight officiel ... Au moins, il est plus facile à installer pour les perlophobes comme moi et la page GitHub est bien documentée :)

6
walnutz

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

voir des exemples Les 4 meilleurs outils de différence de fichiers sous UNIX/Linux - Diff, Colordiff, Wdiff, Vimdiff .

2
thegeek

Après quelques recherches, je remarque que cette question a été posée deux fois récemment sur la liste de diffusion principale de Vim. Le plugin NrrwRgn a été mentionné les deuxfois (créez deux régions étroites et différez-les). Utiliser NrrwRgn comme décrit par Christian Brabandt ressemble plus à une solution de contournement qu'à une solution, mais c'est peut-être suffisant.

J'ai essayé NrrwRgn et cela, avec: diffthis, était en effet utile pour illustrer les différences par caractère dans certaines parties d'un même fichier. Mais il a fallu de nombreuses frappes. Mon Vimscript est assez rouillé, mais il pourrait probablement être scripté. Peut-être que NrrwRgn pourrait être amélioré pour fournir la fonctionnalité souhaitée.

Pensées?

1
Adam Monsen