Как принять оба изменения в vimdiff hunk?

При разрешении конфликтов слияния довольно распространена ситуация, когда и я, и другой человек изменили список или какой-либо другой раздел кода, к которому обычно добавляются. Такие как:

global.registerFeature(fc);
global.registerFeature(fb);
global.registerFeature(fa);
<<<<<<< 
global.registerFeature(aNewFeature);
=======
global.registerFeature(anotherNewFeature);
>>>>>>> 

Когда я смотрю на подобный конфликт слияния в vimdiff, vim дает мне возможность выбрать тот или иной вариант. Но то, что я хочу сделать, это применить оба diff. Обычно я просто прибегаю к редактированию объединенного файла напрямую (просто удаляя маркеры слияния); но есть ли более простой способ сделать это в vimdiff?


person Gabe Moothart    schedule 18.04.2016    source источник
comment
Vim позволяет вам делать только :diffget или :diffput.   -  person romainl    schedule 18.04.2016
comment
Разве один из разделов не должен отображаться как diff, поскольку он уже зафиксирован? Затем в diff вы можете просто сохранить свои изменения и удалить другие блоки, отображаемые как diff.   -  person ronakg    schedule 18.04.2016


Ответы (2)


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

Вы можете просто удалить строки с маркерами конфликтов 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 будут выбирать только ту или иную ветку. Таким образом, единственным реальным решением, кроме приведенного выше, является ручное копирование и вставка из обоих файлов в рабочую копию.

person user3751385    schedule 30.04.2018

Я точно не знаю, какую систему управления версиями вы используете, но вот руководство по использованию Vim для слияния с Mercurial: https://www.mercurial-scm.org/wiki/MergingWithVim

Вы должны быть в состоянии сделать что-то подобное с тем, что вы используете, хотя имейте в виду, что vimdiff на самом деле не предназначен для сложных слияний, поэтому он будет немного неуклюжим. На той же странице есть ссылка на плагин для сплайсинга, который должен помочь в сложных слияниях.

person DrEsperanto    schedule 19.04.2016
comment
OP ничего не говорит о Mercurial. Не имеющий отношения. Кроме того, vim поддерживает 3-сторонние различия с использованием Gdiff, о чем и говорит OP. См.: vimcasts.org/episodes/ - person user3751385; 27.04.2018
comment
Хм, я согласен, что mercurial не имеет прямого отношения, но ОП не говорит, какой vcs используется. Если бы я не знал лучше, я бы сказал, что кто-то другой использовал мою учетную запись, чтобы сделать этот ответ. Память странная. - person DrEsperanto; 28.04.2018