如何在vimdiff中接受两个更改?

3

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

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

当我在vimdiff中查看像这样的合并冲突时,vim会给我选择一个或另一个的选项。但我想做的是应用两个差异。通常我只能直接编辑合并后的文件(删除合并标记); 但是在vimdiff中有没有更简单的方法?


Vim 只允许你执行 :diffget:diffput - romainl
难道其中一个部分不应该显示为差异,因为它已经提交了吗?然后在差异中,您可以保留您的更改并删除其他显示为差异的块。 - ronakg
2个回答

4

将目标分支和合并分支的更改合并为一个命令:

您可以删除带有Git冲突标记的行。以下两种方法将删除所有以以下内容开头的行:

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

方法一:手动输入和执行命令

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

方法二:

实现用户定义的命令

"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的diffgetdiffput只会选择一个分支。因此,除了上面提到的方法之外,唯一的解决方案就是手动从两个文件中复制并粘贴到工作副本中。


-1

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

您应该能够在使用任何其他工具时做类似的操作,但请记住,vimdiff并不真正适用于复杂的合并,因此它可能会有些笨拙。同一页中链接到了splice插件,该插件可以帮助您完成复杂的合并。


OP没有提到Mercurial,与此无关。另外,vim确实支持使用Gdiff进行三方差异比较,这正是OP所指的。请参见:http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/。 - user3751385
嗯,我同意Mercurial并不直接相关,但是OP没有说使用了什么版本控制系统。如果我不知道更好的话,我会说有人使用我的帐户来回答这个问题。记忆很奇怪。 - DrEsperanto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接