使用Vim作为合并工具时,有没有办法做到“两者兼而有之”?


11

我也将Vim与Git进行了三向合并,有时需要从本地和远程分支进行更改。kdiff3可以通过几次按键就能做到这一点,在Vim中有没有办法做到这一点?

Answers:


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上找到更多信息。


3

yank和put可以在没有任何插件或额外功能的情况下工作,尽管它可能不如dg或方便。dp

只需从父缓冲区复制所需的位,然后将其粘贴到合并缓冲区中的正确位置即可。如果您只需要diff块的一部分而不是整个块,这也很有用。

您可能有时需要强制Vim使用来更新diff高亮显示:diffupdate


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 diffgetdiffput将只选择一个分支或另一个分支。因此,除了上面给出的解决方案之外,唯一真正的解决方案是手动拉动两个文件并将其粘贴到工作副本中。


如果您要拒绝投票,请说明原因。
user3751385

这就是我要做的-删除标记即可。
亚伦·麦克米林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.