Скажем, у меня есть патч, созданный с помощью git format-patch
. По сути, файл представляет собой унифицированный файл сравнения с некоторыми метаданными. Если я открываю файл в Vim, я вижу, какие строки были изменены, но я не вижу, какие символы в измененных строках отличаются. Кто-нибудь знает способ (в Vim или другом бесплатном программном обеспечении, работающем в Ubuntu) визуализировать посимвольные различия?
Пример счетчика, в котором визуализируется посимвольное различие, - это при выполнении vimdiff a b
.
обновить Пт, 12 ноября, 22:36:23 UTC 2010
diffpatch полезен для сценария, когда вы работаете с одним файлом.
обновить Чт, 16 июня, 17:56:10 UTC 2016
Посмотрите diff-highlight в git 2.9 . Этот сценарий делает именно то , что я изначально искал.
git diff --color-words
это очень полезно, чтобы просто увидеть, какие слова были изменены в строках, а не обычный унифицированный вывод diff. Однако он основан на словах, а не на символах, поэтому, если в контенте, который вы различаете, не так много пробелов, результат может быть менее четким. (Отредактировано: Ой, я вижу, что я неправильно понял то, о чем вы просите - тем не менее, может быть, этот комментарий будет кому-то полезен.)Ответы:
Учитывая ваши ссылки на Vim в вопросе, я не уверен, что это тот ответ, который вам нужен :) но Emacs может это сделать. Откройте файл , содержащий диф, убедитесь , что вы находитесь в
diff-mode
(если файл с именемfoo.diff
илиfoo.patch
это происходит автоматически, в противном случае типа M-xdiff-mode
RET), перейдите к ломтю вы заинтересованы в и ударили C-c C-bпоrefine-hunk
. Или пролистайте файл по одному фрагменту за раз M-n; это произведет уточнение автоматически.источник
git log master.. -p | emacs -
M-!
команду, чтобы запустить команду и записать вывод в буфер.В git вы можете выполнить слияние без фиксации. Сначала слейте свой патч, а затем выполните:
Обратите внимание на точку после знака равенства.
источник
git diff --color-words=.
.git diff --color-words=.
иgit diff --color-words .
работает иначе. Лучшеgit diff --color-words .
.git diff --color-words .
действительно то же самоеgit diff --color-words -- .
! Т.е..
интерпретируется как путь. Вы можете проверить с помощьюmkdir 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 -- .
.Вот некоторые версии с менее шумным , чем выходом
git diff --word-diff-regex=<re>
и требует меньше , чем печатать, но эквивалентны,git diff --color-words --word-diff-regex=<re>
.Простой (выделяет изменения пространства):
Простой (выделяет отдельные изменения символов; не выделяет изменения пробелов):
Более сложный (выделяет изменения пространства):
В основном:
где
<re>
- регулярное выражение, определяющее «слова» с целью идентификации изменений.Они менее шумны, так как окрашивают измененные «слова», тогда как при использовании только
--word-diff-regex=<re>
совпадающие «слова» окружаются цветными-/+
маркерами.источник
--color-words
, без=.
детали.git diff --color-words='\w'
будет лучше работать с диакритическими знаками (git v1.7.10.4)--word-diff=plain
чтобы дополнительно иметь[-
и-]
окружающие удаления{+
и+}
окружающие добавления. Как предупреждает руководство, однако, фактические вхождения этих разделителей в источнике не спасся каким - либо образомВышеупомянутое регулярное выражение ( от Томаса Раста ) неплохо справляется с разделением фрагментов diff на уровне знаков препинания / знаков (хотя и не так шумно, как
--word-diff-regex=.
).Я разместил снимок экрана с полученным результатом здесь .
Обновить:
В этой статье есть несколько отличных предложений. В частности, в
contrib/
дереве репозитория git естьdiff-highlight
скрипт на Perl, который показывает мелкие детали.Быстрый старт в использовании:
источник
--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
'
туда значение в начале. в противном случае я получил ошибку. Кроме того, я просто использую,--color-words
я получаю то же поведение, что и при использовании этого регулярного выражения.foo.bar
чтобыfoo.qux
вы увидите разницу.git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
./usr/local/share/git-core/contrib/diff-highlight/diff-highlight
. Это позволяет предположить , что мерзавец доморощенного в это установить весь вно в/usr/local/share/git-core/contrib/
. Итак, наконец, у меня сработало следующееgit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
Если вы ничего не имеете против установки NodeJS, есть пакет под названием "diff-so-fancy" ( https://github.com/so-fancy/diff-so-fancy ), который очень легко установить и отлично работает:
Изменить: только что узнал, что на самом деле это оболочка для официального diff-highlight ... По крайней мере, его проще установить для таких перлофобов, как я, и страница GitHub хорошо документирована :)
источник
Мне неизвестен инструмент для разницы в символах, но есть инструмент для разницы в словах: wdiff.
см. примеры Лучшие 4 инструмента для различения файлов в UNIX / Linux - Diff, Colordiff, Wdiff, Vimdiff .
источник
wdiff old_file new_file | cdiff
*vimdiff
, затем внутри vim:windo wincmd K
, чтобы переключиться на вертикальную компоновку окна (один под другим) сбоку один. Такой макет лучше подходит для файлов с длинными строками.wdiff2
,mdiff
и в онлайн - инструмент от Google .После небольшого исследования я заметил, что этот вопрос в последнее время дважды поднимался в основном списке рассылки Vim. Плагин NrrwRgn был упомянут как раз (сделать две узкие области и дифф их). Использование NrrwRgn, описанное Кристианом Брабандтом, больше похоже на обходной путь, чем решение, но, возможно, этого достаточно.
Я попробовал NrrwRgn, и он вместе с: diffthis действительно был полезен для иллюстрации посимвольных различий в частях одного файла. Но для этого потребовалось много нажатий клавиш. Мой Vimscript довольно ржавый, но, скорее всего, это скрипт. Возможно, NrrwRgn можно улучшить, чтобы обеспечить желаемую функциональность.
Мысли?
источник