Есть ли способ «взять оба» при использовании Vim в качестве инструмента слияния?

11

Я использую Vim как трехстороннее слияние с Git, и иногда мне нужно принимать изменения как из локальной, так и из удаленной веток. kdiff3можно сделать это несколькими нажатиями клавиш, есть ли способ сделать это в Vim?

синапс
источник

Ответы:

6

Не совсем то, что вы просили, но может оказаться полезным: плагин Splice: плагин Vim для разрешения конфликтов во время трехстороннего слияния . У этого есть хорошая демонстрационная демонстрация на Vimeo .

Если вы собираетесь придерживаться vimdiff по умолчанию, вы можете создать функцию для получения номера буфера для окружающих окон и использовать их для вызова :diffgetдважды:

                            *:diffg* *:diffget*
:[range]diffg[et] [bufspec]
        Modify the current buffer to undo difference with another
        buffer.  If [bufspec] is given, that buffer is used.  If
        [bufspec] refers to the current buffer then nothing happens.
        Otherwise this only works if there is one other buffer in diff

(...)

The [bufspec] argument above can be a buffer number, a pattern for a buffer
name or a part of a buffer name.  Examples:

    :diffget        Use the other buffer which is in diff mode
    :diffget 3      Use buffer 3
    :diffget v2     Use the buffer which matches "v2" and is in
                diff mode (e.g., "file.c.v2")

Вы можете использовать сопоставление, чтобы назначить вызов этой функции клавишам, в которых вы были использованы kdiff3.

Вы можете найти дополнительную информацию об этом vimcast .

mMontu
источник
3

yank и put могут работать без каких-либо плагинов или дополнительных функций, хотя это, возможно, немного менее удобно, чем dgилиdp

Просто скопируйте нужные биты из родительских буферов и вставьте их в правильное место в объединенном буфере. Это также полезно, если вам нужна только часть блока diff, а не все.

Иногда вам может понадобиться заставить Vim обновить подсветку diff с помощью :diffupdate.

8bittree
источник
1

Чтобы объединить изменения из целевой ветви и ветви слияния в одну команду:

Вы можете просто удалить строки с маркерами конфликта Git. Следующие два метода удаляют все строки, начинающиеся с:

<<<<<<<
=======
>>>>>>>

Способ 1: ввод и выполнение команды вручную

:g/^<\{7}\|^|\{7}\|^=\{7}\|^>\{7}/d

Способ 2: реализация пользовательской команды

"Delete all Git conflict markers
"Creates the command :GremoveConflictMarkers
function! RemoveConflictMarkers() range
  echom a:firstline.'-'.a:lastline
  execute a:firstline.','.a:lastline . ' g/^<\{7}\|^|\{7}\|^=\{7}\|^>\{7}/d'
endfunction
"-range=% default is whole file
command! -range=% GremoveConflictMarkers <line1>,<line2>call RemoveConflictMarkers()

Vim diffget и diffput выберет только одну ветку или другую. Таким образом, единственное реальное решение, отличное от приведенного выше, состоит в том, чтобы вручную извлечь и вставить оба файла в рабочую копию.

user3751385
источник
Укажите причину, если вы собираетесь понизить голос.
user3751385
Это все, что я делаю - просто удаляю маркеры.
Аарон Макмиллин