我如何接受vimdiff hunk的两个变化?

时间:2016-04-18 18:41:52

标签: vim merge-conflict-resolution vimdiff

在解决合并冲突时,一个相当常见的模式是我和另一个人都修改了一个列表或通常被附加到的其他代码段。如:

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

当我在vimdiff中查看这样的合并冲突时,vim为我提供了选择其中一个的选项。但我想要做的是应用两个差异。我通常只是直接编辑合并文件(只是删除合并标记);但是在vimdiff中有更简单的方法吗?

2 个答案:

答案 0 :(得分: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 只会选择一个分支或另一个分支。所以除了上面给出的唯一真正的解决方案是手动从两个文件中抽取并粘贴到工作副本中。

答案 1 :(得分:-1)

我不确定您使用的是哪种版本控制系统,但这里是使用Vim与Mercurial合并的指南:https://www.mercurial-scm.org/wiki/MergingWithVim

你应该可以使用你正在使用的任何东西做类似的事情,但请记住,vimdiff并不是真正意义上的复杂合并,所以它会有点笨拙。同一页面链接到splice插件,这应该有助于进行复杂的合并。