我如何使用vimdiff解决冲突?

我刚刚在git中合并了一个分支到我的主分支,并且我得到了Automatic merge failed; fix conflicts and then commit the result. Automatic merge failed; fix conflicts and then commit the result. 现在我运行了git mergetool ,vimdiff打开了下面的图片。 我不知道如何使用vimdiff。 这里的每个小组意味着什么?我应该如何着手解决合并冲突?

在这里输入图像描述


所有四个缓冲区都提供了同一个文件的不同视图。 左上角的缓冲区(LOCAL)是文件在目标分支中的显示方式(您正在合并的内容)。 右上角的缓冲区(REMOTE)是文件在源分支中的显示方式(您正在合并的位置)。 中间缓冲区(BASE)是两者的共同祖先(因此您可以比较左右版本之间的差异)。

我可能会误以下几点。 我认为合并冲突的根源在于,自BASE以来,这两个文件都改变了文件的相同部分; LOCAL将引号从双改为单引号,REMOTE进行了相同的更改,但也将背景值从一个颜色更改为一个URL。 (我认为合并不够聪明以至于所有对LOCAL的改变都存在于REMOTE中;它只知道LOCAL自BASE以来已经在与REMOTE相同的地方进行了更改)。

在任何情况下,底部缓冲区都包含您可以实际编辑的文件 - 位于工作目录中的文件。 你可以做任何你喜欢的改变; vim向您展示了它与每个顶视图的不同之处,它们是自动合并无法处理的区域。 如果您不想要REMOTE更改,请从LOCAL提取更改。 如果您希望更改LOCAL更改,请从REMOTE中进行更改。 如果您认为REMOTE和LOCAL都是错误的,请从BASE中拔出。 如果你有更好的主意,做一些完全不同的事情! 最后,您在这里所做的更改将会实际承诺。


@ chepner的答案很好,我想补充一些关于“我应该如何着手解决合并冲突”部分的问题。 如果你看看如何在这种情况下真正使用vimdiff,它会在下面。


首先,解决“中止一切”选项 - 如果您不想使用“vimdiff”并想中止合并:按Esc,然后键入:qa! 并按Enter键。 (另请参阅如何退出Vim编辑器?)。 然后Git会问你是否合并完成,用n回复。


如果你想使用vimdiff,这里有一些有用的快捷方式。 这假设你知道Vim的基本知识(导航和插入/普通模式):

  • 导航到底部缓冲区(合并结果):Ctrl-W j
  • 用j / k导航到下一个diff; 或者更好地使用] c和[c分别导航到下一个和上一个diff
  • 如果要查看更多上下文,请在折叠上使用zo以打开它
  • 对于每个差异,根据@ chepner的回答,您可以从本地,远程或基本版本获取代码版本,或者根据您的需要进行编辑并重做
  • 要从本地版本获取它,请使用:diffget LO
  • 从远程:diffget RE
  • 从基地:diffget BA
  • 或者,如果要编辑自己,请先从本地/远程/基本版本获取版本,然后再进入插入模式并编辑其余
  • 一旦完成,保存合并结果,并退出所有窗口:wqa
  • 通常,git检测到合并完成并完成合并提交
  • 您可以在Internet上搜索其他vimdiff快捷方式。 我发现这个例子很有用:https://gist.github.com/hyamamoto/7783966

    链接地址: http://www.djcxy.com/p/22589.html

    上一篇: How do I use vimdiff to resolve a conflict?

    下一篇: How to abort a git rebase in interactive editor