【问题标题】:Git merge alogithmGit合并算法
【发布时间】:2019-12-30 11:23:20
【问题描述】:

当我合并两个分支时,(据我所知)会发生以下情况之一:

  1. 快进远去
  2. 冲突
  3. 自动合并

另外,git 如何决定它是需要快进还是自动合并还是需要手动解决冲突?

【问题讨论】:

标签: git


【解决方案1】:

快进

虽然快进是合并命令可以做的事情之一,但我通常认为“快进”操作是执行合并操作的替代 - 一种快捷方式。

当两件事都成立时,git 会执行快进:

1) 你没有告诉它不要通过提供--no-ff 选项

2) 签出的分支从被合并的提交中是“可达的”(通过父指针)。也就是说,如果 git 由于提交图而知道当前分支中的每个更改也在目标分支中,那么快进会产生正确的结果,因此如果允许的话会这样做。

例如,如果我有

x -- x - O <--(master)
          \
           A -- B -- C <--(feature)

masterO)可以从featureC)访问,这意味着对master所做的每一项更改都已经在C中“解释”了。合并的结果将与C 具有相同的内容,因此“快进”是一个有效的解决方案。但如果在O 之后对master 进行了其他更改,如

x -- x - O -- D <--(master)
          \
           A -- B -- C <--(feature)

现在有两行互斥的变化,所以需要真正的合并。

合并和冲突

如果快进不是一个选项(因为用户说--no-ff,或者因为分支已经分歧,如上面第二个示例中所述),那么 git 会尝试自动合并。

此时它并没有“决定”是否需要解决冲突;它要么遇到冲突,要么没有。如果是,它告诉用户解决它;如果没有,它会自动完成合并。

那么什么是冲突?

合并是尝试合并两个(或更多,但由于不尝试解决冲突,因此暂时不考虑章鱼合并)补丁:

A) 从合并基础到当前签出的补丁 (ours)

B) 从合并基础到合并内容的补丁 (theirs)

如果这两个补丁都将更改同一块代码,则该块会发生冲突。

通常这意味着两个补丁都尝试添加、删除或修改同一行。 (也可以表示相邻的行。)

【讨论】:

    【解决方案2】:
    • 快进

    您正在与一个只有前面提交而后面没有提交的分支合并。

    • 自动合并

    Git 成功应用了(补丁构成了提交引入的更改)合并每个提交的所有更改。

    这意味着两个分支中的更改并未在同一文件中的相同位置进行。

    • 冲突

    Git 尝试过,但没有成功应用每个合并提交的所有更改。

    这意味着 2 个分支中的更改已在相同文件的相同位置进行,git 询问您合并在同一文件的相同行上进行的 2 个更改的好方法是什么。

    【讨论】:

    • 感谢@Philippe,我想我一开始没有正确提出我的问题,你能告诉我git如何决定它是需要自动合并还是需要手动解决冲突?
    • 它总是尝试“自动合并”,如果失败是因为冲突。
    • 不合并就无法解决冲突。它只是尝试合并分支之间的每个文件。如果由于合并冲突而导致一个或多个文件失败,则不会提交合并,而是将状态标记为冲突,用户必须使用冲突解决手动解决此问题。
    • 就像@LasseVågsætherKarlsen 所说的正确,Git 总是尝试逐个文件应用提交更改/补丁。那是失败的时候,你必须自己解决冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多