【问题标题】:Merge conflict resolution合并冲突解决
【发布时间】:2012-03-01 17:03:54
【问题描述】:

当 Git 中出现合并冲突时,会在冲突文件中插入如下垃圾。三个问题:

  1. 您如何阅读这些注释?
  2. 在解决这些合并冲突时可以使用哪些策略?
  3. 是否有适用于 Mac 的 GUI 工具知道如何读取这些文件并并排显示两个版本以更轻松地解决问题?

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

【问题讨论】:

标签: git user-interface merge-conflict-resolution


【解决方案1】:

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

文件的冲突行将用视觉指示器标记​​: <<<<< - 冲突在此行之后开始。 ===== - 包含 HEAD 和 merging_branch 的更改。 >>>>> - 冲突行结束。

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

当您修复冲突文件并准备好合并时,您所要做的就是运行git addgit commit 以生成合并提交。一旦提交,git push 对分支的更改。

参考文章:Git merge.

【讨论】:

    【解决方案2】:

    现在有一个比尝试读取 Git 插入到文件中的乱码标记更好的解决方案。 Kaleidoscope 2,Black Pixel 的第二版差异工具,现在也是一个合并工具。它不是免费的,但效果很好。

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

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

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

    【讨论】:

    • @FrankFang 您只需要在解决所有冲突后关闭窗口。然后会询问您合并是否正常。
    • 如果更好是主观的,这是一个替代解决方案。如果您在 macOS 上,您也可以尝试内置合并工具 opendiff(Xcode 工具的一部分);将“opendiff”设置为全局默认合并工具:git config --global merge.tool opendiff,另见stackoverflow.com/a/25625663/880188 编辑:或见下文;)
    【解决方案3】:

    您可以配置(图形)合并工具并使用该工具来解决冲突。

    还可以查看git mergetool 命令 - 如果您安装了预定义工具之一或配置了其他工具,它将打开解决http://schacon.github.com/git/git-mergetool.html 的工具

    如果您对 GUI 工具感兴趣,则不必担心这些符号的真正含义,因为 GUI 工具将帮助您轻松做出决议。只要明白标有=====&gt;&gt;&gt;&gt;&gt;的部分就是冲突部分。

    【讨论】:

    • 你能给我一个可以读取这些文件并解释如何打开它们的 Mac GUI 应用程序的例子吗?我尝试在不同的差异和合并工具中打开这些文件,它们只是作为单个文本文件打开,而不是被解释为两个文件。 (这是冲突标记的全部目的。)
    【解决方案4】:
    <<<< 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

    【讨论】:

    • 如果#Things 没有任何变化,但我仍然遇到冲突,这意味着什么?
    • git mergetool -t opendiff 是我的答案。谢谢。
    【解决方案5】:

    &lt;&lt;&lt;&lt;&lt;&lt;====== 之间的所有内容都来自HEAD 修订版,这是开始合并操作之前的已提交状态(git merge 会抱怨树是否脏,所以它应该相当于你的工作目录)。

    ======&gt;&gt;&gt;&gt;&gt;&gt; 之间的部分来自正在合并的版本。 &gt;&gt;&gt;&gt;&gt;&gt; 之后的文本是引入冲突更改的提交的注释。

    存在冲突标记意味着这部分文件的基本版本与两个“新”版本都不同。基本版本(最后一个共同祖先)未显示。

    如果你想要一个更舒适的合并并且有一个可用的 GUI,我建议你看看 kdiff3。

    【讨论】:

    • 谢谢,西蒙。是否有一些 GUI 应用程序可以打开这些文件并并排显示 HEAD 和合并版本?
    • 您能否指出该链接中的哪些信息有用?我无法访问 git 手册。
    • @ChristopherJamesCalo,kdiff3 是一个 GUI 工具。
    猜你喜欢
    • 2015-10-15
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2018-04-19
    • 2018-08-04
    • 2017-05-10
    相关资源
    最近更新 更多