конфликты vimdiff и слияния

14

При слиянии веток под управлением исходного кода часто возникает проблема конфликта слияния с другими разработчиками.

Я знаю, что мы можем использовать vimdiff для сравнения изменений кода с контролем версий , но есть ли способ использовать vimdiff для разрешения конфликтов конфликтов слияния.

Лично меня больше интересует git, но было бы полезно понять, есть ли плагины / методы для других инструментов / систем контроля версий.

Мартин Йорк
источник
Вы когда-нибудь давали Мелду попытку?
Эрик Сабельхаус,
1
@EricSabelhaus: лучше ли vimdiff разрешать конфликты? Этот сайт о том, чтобы задавать / отвечать на вопросы о vim.
Мартин Йорк,
Я полагаю, это зависит от варианта использования. Если я работаю над кодом, который живет удаленно, я наверняка буду использовать vimdiff. Если я работаю локально на своем компьютере разработчика, я буду использовать Meld, поскольку он предоставляет многофункциональный пользовательский интерфейс, помогающий разработчику выполнять сложные 3-х полосные слияния.
Эрик Сабельхаус,
1
@EricSabelhaus: для меня термин feature rich UIвводит в заблуждение; У vimdiff может не быть хорошего пользовательского интерфейса, он, безусловно, многофункциональный. Я также считаю, что vim гораздо более производительная среда, чем все редакторы графического интерфейса, которые я использовал (но я использовал ее в течение длительного времени, и это было крутой кривой обучения). Мне более любопытно, если Мелд сделает что-то, чего не делает vim, что стоило бы даже посмотреть.
Мартин Йорк,
Я не могу конкретно сказать, имеет ли он более надежный набор функций, но он определенно находится в той же области, что и vimdiff.
Эрик Сабельхаус,

Ответы:

18

Я обычно использую git в командной строке.

Но когда возникает конфликт слияния, я использую Vim для их разрешения (лично я делаю это с помощью беглого плагина). Примечание: беглец хорош для большого количества мерзавцев из Vim. Моя любимая особенность - это трехсторонняя разница в конфликте слияний.

git поддерживает это в vimdiff через git mergetool. Я установил беглеца, но вы можете установить его вручную (спасибо @Jay Thompson).

Ручная настройка:

git config --global merge.tool vimdiff
git mergetool <file with conflicts>

Вывод немного отличается от того, что описано ниже (я лично не использовал это). Но принцип тот же, но у вас есть четвертое окно внизу, содержащее результат.

введите описание изображения здесь

Настроить с помощью Fugitive

vim-fugitive - плагин для git-оболочки / интеграции для Vim; он может делать много вещей, и разрешение конфликтов является одним из них.

<Install the Fugitive Plugin>
vim <file with conflicts>
:Gdiff
  1. Вид 2 (слева): код, который был в вашей ветке.
  2. Вид 1 (посередине): объединенный код (с конфликтами)
  3. Вид 3 (справа): код, который был объединен с вашим кодом.

Теперь вы можете вытащить и получить текст из двух других видов в центральный вид (который будет содержать все ручные исправления). После разрешения всех конфликтов вручную просто выйдите из vimdiff.

введите описание изображения здесь

Хотя вы можете использовать :diffget <view number>и :diffput <view number>тянуть и толкать вещи между взглядами. Лично я не нахожу это очень полезным. Весь код уже в среднем виде. Поэтому мне просто нравится редактировать это представление вручную, пока конфликт не будет разрешен. Возможность видеть обе версии кода по обе стороны окна моего редактора очень полезна.

Также очень хорошая демонстрация его использования здесь

Мартин Йорк
источник
1
Если вы по какой-то причине не хотите использовать или устанавливать Fugitive, вы можете просто установить git config --global merge.tool vimdiffи запустить приложение git mergetoolvim в режиме diff.
Джей Томпсон
Поддерживает ли это «diff3» стиль конфликтов слияний, где показаны «объединенные общие предки»?
alxndr
@alxndr: я не слышал о diff3 раньше. Но после быстрого Google. Вывод конфликта слияния в git (и других источниках управления, которые я использовал) такой же, как a diff3 -E. Таким образом, изображения выше генерируются из файлов, в которых есть эти маркеры.
Мартин Йорк,
Теперь, когда я посмотрю внимательно, на первом снимке экрана показан стиль слияния diff3; средняя верхняя панель "BASE" является общим предком, от которого отклонились левая и правая панели.
alxndr
1
Важно помнить, что каждое из этих 4 представлений является просто буфером. Это означает, что вы можете открыть другую вкладку (или даже остаться в том же окне) и выбрать только те буферы, которые вы хотите просмотреть в любой данный момент. Нет смысла держать все 4 окна открытыми одновременно, если вы не используете их все.
опрос Коди