合并冲突解决方案

60

当Git中存在合并冲突时,会向冲突的文件中插入以下类似的内容。以下是三个问题:

  1. 如何阅读这些注释?
  2. 修复这些合并冲突时有哪些策略可以使用?
  3. 是否有适用于Mac的GUI工具,可以读取这些文件并显示两个版本以便更容易地解决问题?

enter image description here

注意:如果相关的话,我正在使用GitHub的Mac GUI客户端。


1
可能是如何在Git中解决合并冲突?的重复问题 - 如果您在谷歌搜索“git merge conflicts”,这是排名第1的链接。 - Brian Roach
5个回答

36
< p>所有在<<<<<<======之间的内容来自于 HEAD 版本,它是合并操作 ( git merge ) 开始前提交的状态。应该等同于您的工作目录,因为如果树处于脏状态,则git merge会报错。

======>>>>>>之间的部分来自正在合并的版本。在>>>>>>之后的文本是引入冲突更改的提交评论。

冲突标记意味着此文件部分的基础版本不同于“新”版本。基础版本(最后的共同祖先)未显示。

如果您希望进行更舒适的合并,并且有GUI可用,请查看kdiff3。


谢谢,西蒙。难道没有一些GUI应用程序可以打开这些文件并将HEAD和合并版本并排显示吗? - Chris Calo
你能告诉我那个链接中哪些信息是有用的吗?Git手册对我来说无法访问。 - Chris Calo
@ChristopherJamesCalo,kdiff3是一个GUI工具。 - Simon Richter

22

现在有比试图阅读Git插入到您的文件中的无意义标记更好的解决方案。Black Pixel发布的第二个版本差异工具Kaleidoscope 2,现在也成为了合并工具。它不是免费的,但功能非常出色。

安装完Kaleidoscope 2后,将其与Git集成非常简单。打开Kaleidoscope,从菜单栏中选择Kaleidoscope > Integration…

Kaleidoscope's Integration menu option.

然后你会看到这个窗口。只需从左侧导航中选择Git,然后安装ksdiff命令行工具,接着把Kaleidoscope设置为Git的默认差异和合并工具。

Kaleidoscope's Git Integration dialog.

最后,在Git中出现合并冲突时,只需转到命令行并执行git mergetool。现在冲突很容易阅读。享受吧。

Kaleidoscope sane view for merge conflicts.


1
@FrankFang 当你解决了所有的冲突后,只需要关闭窗口即可。然后会询问你合并是否正常完成。 - angry_gopher
如果更好是主观的,那么这是一种替代方案。如果您使用的是 macOS,则还可以尝试内置的合并工具 opendiff(Xcode 工具的一部分);将 "opendiff" 设置为全局默认合并工具:git config --global merge.tool opendiff,另请参见 https://dev59.com/L2Yr5IYBdhLWcg3wYZSD#25625663 编辑:或者只需查看下面 ;) - LarS

17
<<<< HEAD #Where the conflict starts

#Previous Revision

========== # The point where things look iffy

#Things that changed

>>>>> New Commit # Point where the conflict ends

Mac的Xcode自带FileMerge,可以通过命令行访问opendiff

git mergetool -t opendiff


2
如果在“更改的内容”中没有发现任何内容,但仍然出现冲突,这是什么意思? - Ken
git mergetool -t opendiff 对我来说是个不错的选择。谢谢。 - Billy

4
您可以配置一个(图形化的)合并工具,并使用该工具进行冲突解决。
同时,查看一下git mergetool命令 - 如果您已安装预定义工具或已配置其他工具,则会打开该工具以进行解决http://schacon.github.com/git/git-mergetool.html
如果您对GUI工具感兴趣,那么您不需要担心符号的真正含义,因为GUI工具将帮助您轻松地进行解决。只需理解标记为=====>>>>>的部分是冲突部分即可。

1
你能给我一个可以读取这些文件并解释如何打开它们的Mac GUI应用程序的例子吗?我已经尝试在不同的diff和merge工具中打开这些文件,但它们只是作为单个文本文件打开,而不是被解释为两个文件。(这就是冲突标记的全部目的。) - Chris Calo

0

当你有两个分支对同一个文件进行更改并尝试合并它们时,会发生合并冲突。要查看冲突文件的列表,请在终端上运行git status

文件中的冲突行将用可视指示器标记: <<<<< - 冲突从此行开始。 ===== - 将HEAD和merging_branch的更改分开。 >>>>> - 冲突行的结束。

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

当你解决了冲突文件并准备合并时,你只需要运行git addgit commit来生成合并提交。一旦提交完成,使用git push将更改推送到分支。

参考文章:Git 合并


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