【问题标题】:What exactly is a merge conflict?究竟什么是合并冲突?
【发布时间】:2014-09-11 04:36:39
【问题描述】:

我已经创建了一个 git 存储库并向其中添加了一个文本文件。这是100%用于学习目的。

  1. 我在文本文件中添加了“1”并将其提交给 master。

  2. 从 master 创建了一个新分支并附加了“2”。

  3. 最后,从 master 创建了一个分支并附加了“3”。

您能否解释一下在这种情况或任何其他情况下如何发生冲突?

【问题讨论】:

    标签: git git-merge


    【解决方案1】:

    合并会有冲突:

    • branch2master(无冲突)
    • branch3master(冲突):

    那是因为:

    • 共同祖先是master(第二行为空)
    • 源内容为branch3(第二行包含“3”)
    • 目标内容是最新的master(第二行包含“2”,从branch2master的合并)

    Git 会要求您选择要保留的内容(“3”、“2”或两者都保留)。

    首先,在之后进行合并:

    git config merge.conflictstyle diff3
    

    见“Fix merge conflicts in Git?”。

    【讨论】:

    • 我试过了。谢谢你。那么,如果我添加一些新的东西,它添加的东西没有任何混淆/冲突,但如果我要替换一些东西,它会导致替换它或保持原来的混乱吗?
    • @user3693167 是的,因为相同的行被修改了两次,这会触发手动解决合并(冲突)。
    • @user3693167 是的,就内容重叠块而言 (help.github.com/articles/…) 另见 gitguys.com/topics/…
    • @Dumoko 是的,是三路合并(stackoverflow.com/a/4130766/6309),同样显示在stackoverflow.com/a/31227165/6309
    • @Vin 这不是关于顺序,而是关于自最后一个共同祖先以来所做的并发修改。因此发生冲突。
    【解决方案2】:

    当两个分支都修改文件的同一区域并随后合并时,就会发生合并冲突。 Git 不知道要保留哪些更改,因此需要人工干预来解决冲突。

    在这种情况下,您的第 2 步和第 3 步会创建两个具有冲突更改的分支。

    【讨论】:

    • “区域”是什么意思?这些有多大?
    • @GuillaumeF。对于文本文件,当两个提交更改文件中的同一行时会发生冲突。我不确定它如何处理二进制文件(例如图像、声音等)。
    • @GuillaumeF。无限大
    【解决方案3】:

    我知道这是一个老问题,但如果您想以直观的方式了解 Git 用于比较两个文件的算法。它将澄清关于重叠区域如何与差异一起工作的疑问。

    这里解释了 Eugene W. Myers 开发的一种流行算法。在这种方法中,寻找最短编辑脚本 (SES) 被建模为图形搜索。 这是 James Coglan 撰写的非常好的文章,并附有示例 - The Myers diff algorithm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2021-11-13
      • 2018-05-23
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      相关资源
      最近更新 更多