如何解决Git中的合并冲突

如何解决Git中的合并冲突?

解决办法

尝试一下。git mergetool

它打开一个GUI,让你浏览每个冲突,你可以选择如何合并。 有时它需要在事后进行一些手工编辑,但通常它本身就足够了。 这当然比手工操作要好得多。

根据@JoshGlover的评论。

该命令不一定会打开GUI,除非你安装了一个。我运行git mergetool的结果是使用vimdiff。你可以安装以下工具来代替它。meldopendiffkdiff3tkdiffxxdifftortoisemergegvimdiffdiffuseecmergep4mergearaxisvimdiffemerge

下面是使用vimdiff解决合并冲突的示例程序。基于此链接

第1步。在你的终端运行以下命令

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

这将设置vimdiff为默认的合并工具。

第2步。在终端运行以下命令

git mergetool

第3步:你会看到如下格式的vimdiff显示

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

这4个视图是

LOCAL - 这是当前分支的文件

BASE - 共同的祖先,文件在两次修改之前的样子

REMOTE - 你要合并到你的分支的文件

MERGED - 合并的结果,这就是被保存在repo中的内容。

你可以使用ctrl+w在这些视图中导航。你可以用ctrl+w接着用j直接到达MERGED视图。

关于vimdiff导航的更多信息这里这里

第4步。你可以通过以下方式编辑MERGED视图

如果你想从REMOTE获取变化

:diffg RE  

如果您想从BASE获取更改

:diffg BA  

如果您想获得来自LOCAL的更改

:diffg LO 

第5步。保存、退出、提交和清理

:wqa保存并退出vi

git commit -m "message"

git clean 删除由diff工具创建的额外文件(例如*.orig)。

评论(20)

1.识别哪些文件是冲突的(Git应该会告诉你)。

1.打开每个文件并检查差异;Git 会将它们划分开来。 希望能明显看出每个区块的哪个版本应该保留。 你可能需要与提交代码的同事讨论。

1.一旦你解决了一个文件中的冲突,git add the_file

1.一旦你解决了所有**的冲突,请执行git rebase --continue或其他命令。 当你完成时,Git说要做。

评论(7)

如果你经常做一些小的提交,那么可以先用git log --merge看一下提交注释。然后git diff会显示冲突。

对于涉及到几行以上的冲突,用外部GUI工具更容易看到发生了什么。我喜欢opendiff -- Git也支持vimdiff、gvimdiff、kdiff3、tkdiff、meld、xxdiff,emerge开箱即用,你也可以安装其他工具。git config merge.tool "your.tool"会设置你选择的工具,然后git mergetool在合并失败后会显示上下文中的差异。

每次你编辑一个文件以解决冲突,git add filename将更新索引,你的diff将不再显示它。当所有的冲突都处理完毕,并且它们的文件都被git added了,git commit将完成你的合并。

评论(1)