Disons 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. Quelqu'un connaît-il un moyen (dans Vim, ou dans un autre logiciel gratuit 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 12 novembre 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.
git diff --color-words
c'est très utile pour simplement voir quels mots ont changé dans les lignes, plutôt que la sortie diff unifiée habituelle. Il est basé sur des mots plutôt que sur des caractères, donc s'il n'y a pas beaucoup d'espaces dans le contenu que vous différez, la sortie peut être moins soignée. (Modifié: Oups, je vois que j'ai mal compris ce que vous demandez - néanmoins peut-être que ce commentaire serait utile à quelqu'un.)Réponses:
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 quefoo.patch
cela se produit automatiquement; sinon tapez M-xdiff-mode
RET), accédez au morceau qui vous intéresse et cliquez C-c C-bsurrefine-hunk
. Ou parcourez le fichier un morceau à la fois avec M-n; cela fera le raffinage automatiquement.la source
git log master.. -p | emacs -
M-!
pour exécuter la commande et capturer la sortie dans un tampon.Dans git, vous pouvez fusionner sans valider. Fusionnez d'abord votre patch, puis faites:
Notez le point après le signe égal.
la source
git diff --color-words=.
.git diff --color-words=.
etgit diff --color-words .
fonctionne différemment. Mieux vautgit diff --color-words .
.git diff --color-words .
c'est vraiment le même quegit diff --color-words -- .
! Ie, le.
est interprété comme un chemin. Vous pouvez vérifier avecmkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .
.Voici quelques versions avec une sortie moins bruyante que
git diff --word-diff-regex=<re>
et qui nécessitent moins de frappe que, mais sont équivalentes à,git diff --color-words --word-diff-regex=<re>
.Simple (met en évidence les changements d'espace):
Simple (met en évidence les changements de caractères individuels; ne met pas en évidence les changements d'espace):
Plus complexe (met en évidence les changements d'espace):
En général:
où
<re>
est une expression rationnelle définissant des «mots» dans le but d'identifier les changements.Ceux-ci sont moins bruyants dans la mesure où ils colorent les "mots" modifiés, alors qu'ils n'utilisent que
--word-diff-regex=<re>
des "mots" assortis entourant les-/+
marqueurs colorés .la source
--color-words
, sans la=.
partie.git diff --color-words='\w'
fonctionnerait mieux avec les signes diacritiques (git v1.7.10.4)--word-diff=plain
pour avoir[-
et-]
entourer des suppressions{+
et+}
des ajouts entourant. Comme le manuel avertit, cependant, les occurrences réelles de ces délimiteurs dans la source ne sont en aucun cas échappéesLe 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 (sans être aussi bruyant que
--word-diff-regex=.
).J'ai posté une capture d'écran de la sortie résultante ici .
Mettre à jour:
Cet article contient de bonnes suggestions. Plus précisément, l'
contrib/
arborescence du repo git a undiff-highlight
script perl qui montre des surlignages fins.Démarrage rapide pour l'utiliser:
la source
--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
'
au début de la valeur là-bas. sinon j'ai une erreur. En outre, j'utilise simplement--color-words
j'obtiens exactement le même comportement que l'utilisation de cette expression rationnelle.foo.bar
à,foo.qux
vous verrez la différence.git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
./usr/local/share/git-core/contrib/diff-highlight/diff-highlight
. Cela semble suggérer que git de Homebrew installe la totalité de la contribution dans/usr/local/share/git-core/contrib/
. Donc finalement, ce qui suit a fonctionné pour moigit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
Si vous n'avez rien contre l'installation de NodeJS, il existe un package appelé "diff-so-fancy" ( https://github.com/so-fancy/diff-so-fancy ), qui est très facile à installer et fonctionne parfaitement:
Edit: Je viens de découvrir que c'est en fait un wrapper 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 :)
la source
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 les exemples Les 4 principaux outils de différence de fichiers sous UNIX / Linux - Diff, Colordiff, Wdiff, Vimdiff .
la source
wdiff old_file new_file | cdiff
*vimdiff
, puis à l'intérieur de vim:windo wincmd K
afin de passer à la disposition de la fenêtre verticale (l'un en dessous de l'autre) côte à côte. Cette disposition est bien meilleure pour les fichiers avec de longues lignes.wdiff2
,mdiff
et l' outil en ligne de Google .Après quelques recherches, je remarque que cette question a été soulevée deux fois récemment sur la liste de diffusion principale de Vim. Le plugin NrrwRgn a été mentionné les deux fois (créer 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 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 des parties d'un seul 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?
la source