Как я могу визуализировать различия между символами в унифицированном файле сравнения? - PullRequest
110 голосов
/ 12 июля 2010

Скажем, я получил патч, созданный с помощью git format-patch.Файл представляет собой унифицированный diff с некоторыми метаданными.Если я открою файл в Vim, я увижу, какие строки были изменены, но не вижу, какие символы в измененных строках отличаются.Кто-нибудь знает способ (в Vim или каком-либо другом бесплатном программном обеспечении, работающем на Ubuntu) для визуализации различий между символами?

Пример счетчика, где визуализируется разность символов, - при выполнении vimdiff a b.

обновление пт 12 ноября 22:36:23 UTC 2010

diffpatch полезно для сценария, в котором вы работаете с одним файлом.

обновление: четверг, 16 июня, 17:56:10 UTC, 2016 г.

Проверьте diff-highlight в git 2.9 .Этот скрипт выполняет точно то, что я искал изначально.

Ответы [ 7 ]

157 голосов
/ 24 октября 2011

В git вы можете слить без фиксации. Сначала объедините ваш патч, затем выполните:

git diff --word-diff-regex=.

Обратите внимание на точку после знака равенства.

124 голосов
/ 03 сентября 2014

Вот некоторые версии с менее шумным выводом, чем git diff --word-diff-regex=<re>, которые требуют меньше ввода, чем, но эквивалентны, git diff --color-words --word-diff-regex=<re>.

Простой (выделяет изменения пробела):

git diff --color-words

Простой (выделяет изменения отдельных символов; не выделяет пробелы):

git diff --color-words=.

Более сложный (выделяет изменения пробела):

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

В целом:

git diff --color-words=<re>

где <re> - это регулярное выражение, определяющее "слова" с целью выявления изменений.

Они менее шумные, так как они окрашивают измененные "слова", тогда как используют просто --word-diff-regex=<re> окружает совпавшие "слова" цветными -/+ маркерами.

44 голосов
/ 15 апреля 2012
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

Приведенное выше регулярное выражение ( от Thomas Rast ) отлично справляется с разделением фрагментов различий на уровне знаков препинания / символов (хотя и не так шумно, как --word-diff-regex=.).

Я разместил скриншот с полученным результатом здесь .


Обновление:

В этой статье есть несколько замечательных предложений. В частности, в дереве contrib/ репозитория git есть perl-скрипт diff-highlight, который показывает мелкие детали.

Быстрый старт для использования:

$ 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
12 голосов
/ 18 августа 2010

Учитывая ваши ссылки на Vim в этом вопросе, я не уверен, что этот ответ вам нужен :), но Emacs может сделать это.Откройте файл, содержащий diff, убедитесь, что вы находитесь в diff-mode (если файл называется foo.diff или foo.patch, это происходит автоматически; в противном случае введите Mx diff-mode RET), зайдите в интересующий вас кусок и нажмите Cc Cb для refine-hunk.Или пошагово просматривайте файл с помощью Mn ;это будет делать уточнение автоматически.

5 голосов
/ 02 июля 2017

Если вы ничего не имеете против установки NodeJS, есть пакет «diff-so-fancy» (https://github.com/so-fancy/diff-so-fancy),, который очень прост в установке и отлично работает:

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

Редактировать:Только что обнаружил, что на самом деле это оболочка для официального diff-highlight ... По крайней мере, его легче установить для таких перлофобов, как я, и страница GitHub хорошо документирована:)

2 голосов
/ 13 июля 2010

Не знаю инструмент различий в символах, но есть инструмент различий в словах: wdiff.

см. Примеры Лучшие 4 инструмента различия файлов в UNIX / Linux - Diff, Colordiff, WdiffVimdiff .

1 голос
/ 13 июля 2010

После небольшого исследования я заметил, что этот вопрос в последнее время дважды поднимался в основном списке рассылки Vim. NrrwRgn плагин был упомянут оба раз (сделайте две узкие области и различайте их).Использование NrrwRgn, как описано Кристианом Брабандтом, больше похоже на обходной путь, чем на решение, но, возможно, это достаточно хорошо.

Я опробовал NrrwRgn, и он вместе с: diffthis действительно был полезен для иллюстрации различий между символамичасти одного файла.Но это заняло много нажатий клавиш.Мой Vimscript довольно ржавый, но он может быть написан на скрипте.Может быть, NrrwRgn может быть улучшен для обеспечения желаемой функциональности.

Мысли?

...