我如何使用vimdiff解决冲突?

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

在这里输入图像说明

所有四个缓冲区都提供了同一个文件的不同视图。 左上angular的缓冲区(LOCAL)是文件在目标分支中的显示方式(正在合并的内容)。 右上angular的缓冲区(REMOTE)是文件在你的源代码分支(你正在合并的地方)中的样子。 中间缓冲区(BASE)是两者的共同祖先(所以你可以比较左右版本是如何相互分离的)。

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

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

@ chepner的回答非常好,我想补充一些关于“我应该如何着手解决合并冲突”部分的问题。 如果你看看如何在这种情况下实际使用vimdiff,那么下面将会介绍。


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


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

  • 导航到底部缓冲区(合并结果): Ctrl-W j
  • j / k导航到下一个diff; 或者更好地使用] c[ c分别导航到下一个和上一个diff
  • 如果要查看更多的上下文,请在折叠上使用z o打开它
  • 对于每一个差异,根据@ chepner的回答,你可以从本地,远程或基本版本获得代码的版本,或编辑和重做,如你所见
    • 从本地版本获取,请使用:diffget LO
    • 从远程:diffget RE
    • 从底部:diffget BA
    • 或者,如果要编辑自己,请先从本地/远程/基本版本获取版本,然后再进入插入模式并编辑其余
  • 一旦完成,保存合并结果,并退出所有窗口:wqa
  • 通常,git检测到合并完成并完成合并提交

您可以在Internet上search其他vimdiff快捷方式。 我发现这个例子有用: https : //gist.github.com/hyamamoto/7783966