Как отобразить изменения «на уровне слов» при разрешении конфликтов с помощью 3-way diff?

Разрешать конфликты с беглецами — это здорово. После прочтения Безболезненное разрешение конфликтов слияния в Git, я начал думать, как отображать изменения не только на уровне строк, но и на уровне слов.

Все примеры основаны на репозитории painless_git_conflicts_resolution. Hub использовался, чтобы сделать команду git clone более краткой.

Беглец с отключенным стилем конфликта diff3.

hub clone ryrych/painless_git_conflicts_resolution fugitive_no_diff3 cd fugitive_no_diff3/ git checkout beta git merge origin/master vim roses.txt :Gdiff

Результат следующий:

Разрешение конфликтов с беглецом без включения diff3

Проблема в том, что вы можете видеть только то, что все строки каким-то образом изменились. Этот пример очень короткий, но кто из вас заметил, что of добавлено в строке 3?

RubyMine может решить эту проблему, хотя и не всегда, оставляя вас более чем часто с отметками различий и без выделения различий. Хотя на этом снимке экрана нет меток различий, отсутствие «контраста» очень затрудняет решение этих конфликтов.

Разрешение конфликтов с помощью RubyMine

Беглец с включенным diff3 + отображением общего предка:

Показать базу в конфликте fugitive.vim diff вопрос stackoverflow заставил меня попробовать принятый ответ, но решение не было улучшением.

hub clone ryrych/painless_git_conflicts_resolution fugitive_with_diff3 cd fugitive_with_diff3/ git checkout beta git merge origin/master vim roses.txt :split :Gdiff [Ctrl][W][J] :Gedit :1

Разрешение конфликтов с беглецом без отключения diff3

opendiff как mergetool

hub clone ryrych/painless_git_conflicts_resolution opendiff cd opendiff/ git checkout beta git merge origin/master git mergetool

и вуаля!

Разрешение конфликтов с помощью opendiff

Это, конечно, решает проблему, но заставляет меня полагаться на внешний инструмент, который был разработан только для одной системы. Подводя итог: можно ли добиться в Vim чего-то похожего на opendiff?


person wryrych    schedule 15.02.2015    source источник


Ответы (1)


Я обнаружил, что на моей машине (под управлением vim 7.4) все различия выделяют различия внутри строк. Текст из :help view-diff подразумевает, что это стандартное поведение. В нем ничего не говорится о включении или отключении этой функции, только то, что группа выделения hl-DiffText используется для «Измененный текст внутри измененной строки».

Я бы попробовал другую цветовую схему или, по крайней мере, попробовал еще раз проверить, соответствует ли ваша текущая цветовая схема внешнему виду hl-DiffText.

EDIT: по-видимому, данный пример на самом деле очень плохо показывает различия на уровне слов. Каждая строка имеет изменения в нескольких местах, они очень короткие, и нет строк, которые остаются полностью неизменными для обеспечения контекста. Как вы можете видеть на снимках экрана, удаление маркера конфликта помещает все строки «все мои базовые» в один и тот же номер строки, а различия на уровне слов выделяются. Возможно, вы захотите попробовать более сложный конфликт репо/слияния.

:Gdiff в vim не показывает изменения на уровне слов

:Gdiff в vim, показывающий изменения на уровне слов

person Mike Gossmann    schedule 02.04.2015
comment
Не могли бы вы прикрепить скриншот? - person wryrych; 06.04.2015
comment
@wryrych Я обновил ответ. Это тестовое репо на самом деле довольно плохо для тестирования конфликтов на уровне слов. - person Mike Gossmann; 07.04.2015
comment
Спасибо за обновления. Я пробовал разные цветовые схемы, но ни одна из них не отображала разницу так, как я хотел. Тем временем я узнал, что сам git позволяет включать diff на уровне слов в выводе терминала (git diff --color-words). Вы правы, этот пример не очень хорош для демонстрации diff в действии. - person wryrych; 10.04.2015