【发布时间】:2019-12-30 11:23:20
【问题描述】:
当我合并两个分支时,(据我所知)会发生以下情况之一:
- 快进远去
- 冲突
- 自动合并
另外,git 如何决定它是需要快进还是自动合并还是需要手动解决冲突?
【问题讨论】:
-
@rb612 我不认为这是该问题的重复。它不是询问合并策略,而是 Git 如何做出选择以及何时做出选择。
标签: git
当我合并两个分支时,(据我所知)会发生以下情况之一:
另外,git 如何决定它是需要快进还是自动合并还是需要手动解决冲突?
【问题讨论】:
标签: git
快进
虽然快进是合并命令可以做的事情之一,但我通常认为“快进”操作是执行合并操作的替代 - 一种快捷方式。
当两件事都成立时,git 会执行快进:
1) 你没有告诉它不要通过提供--no-ff 选项
2) 签出的分支从被合并的提交中是“可达的”(通过父指针)。也就是说,如果 git 由于提交图而知道当前分支中的每个更改也在目标分支中,那么快进会产生正确的结果,因此如果允许的话会这样做。
例如,如果我有
x -- x - O <--(master)
\
A -- B -- C <--(feature)
master(O)可以从feature(C)访问,这意味着对master所做的每一项更改都已经在C中“解释”了。合并的结果将与C 具有相同的内容,因此“快进”是一个有效的解决方案。但如果在O 之后对master 进行了其他更改,如
x -- x - O -- D <--(master)
\
A -- B -- C <--(feature)
现在有两行互斥的变化,所以需要真正的合并。
合并和冲突
如果快进不是一个选项(因为用户说--no-ff,或者因为分支已经分歧,如上面第二个示例中所述),那么 git 会尝试自动合并。
此时它并没有“决定”是否需要解决冲突;它要么遇到冲突,要么没有。如果是,它告诉用户解决它;如果没有,它会自动完成合并。
那么什么是冲突?
合并是尝试合并两个(或更多,但由于不尝试解决冲突,因此暂时不考虑章鱼合并)补丁:
A) 从合并基础到当前签出的补丁 (ours)
B) 从合并基础到合并内容的补丁 (theirs)
如果这两个补丁都将更改同一块代码,则该块会发生冲突。
通常这意味着两个补丁都尝试添加、删除或修改同一行。 (也可以表示相邻的行。)
【讨论】:
您正在与一个只有前面提交而后面没有提交的分支合并。
Git 成功应用了(补丁构成了提交引入的更改)合并每个提交的所有更改。
这意味着两个分支中的更改并未在同一文件中的相同位置进行。
Git 尝试过,但没有成功应用每个合并提交的所有更改。
这意味着 2 个分支中的更改已在相同文件的相同位置进行,git 询问您合并在同一文件的相同行上进行的 2 个更改的好方法是什么。
【讨论】: