通过示例了解变基冲突与合并冲突
Understanding rebase conflict vs merge conflict with an example
我想举一个例子,其中变基冲突与合并冲突不同。
我理解各个术语(变基和合并)的含义。但是我不太明白他们怎么会产生不同的冲突。
有人可以举例说明正确的方向吗?
这是一个简单但有些做作的例子。假设您根据此图从主分支分支:
main: .. A -- D
\
feature: B -- C
并且你在某个源代码文件中有一个函数:
function foo() {
int a = 3;
return a;
}
假设,无论出于何种原因,您决定在提交 B 中添加一行:
function foo() {
int a = 3;
int b = 10;
return a;
}
在第二次提交 C 中,您删除了添加的行,保留了从主分支分支出来时的代码。
同时,在主分支中,其他人现在做了一个新的提交 D,它也添加了一个新行:
function foo() {
int a = 3;
int c = 5;
return a;
}
如果您要将功能分支变基到主分支,代码将从上面的 D 提交中的 int c = 5
行开始。但是然后重新应用您的第一个 B 提交会产生合并冲突,因为两个父项都试图在同一个函数中的同一个位置添加一个新行。您将解决该冲突,然后选择您想要的版本。
但是,如果您改为合并主分支到您的分支中,就不会有冲突。这样做的原因是您的功能分支从 C 提交开始,其源代码与主分支中的 A 提交相同。因此,只会对功能进行一次更改,来自主分支,并且可能不会发生冲突。
变基与合并中合并冲突的经验法则是,通常它们可能不相同。变基会在新基础上重新引入您的工作(提交),并且每次重新提交都可能导致合并冲突。另一方面,合并会一次性将单个增量引入目标分支。
在实践中,冲突差异通常应该是由于 rebase 一次应用一个提交补丁,而 merge 只查看每个分支的最终状态(以及合并基础 - 分支共有的最后一次提交) .
所以如果你有
o --- x <--(master)
\
A - B - C <-(feature)
并想将 feature
与 master
组合,也许 o-A
补丁与 o-x
冲突,即使 o-C
补丁不冲突 - 在最简单的情况下因为 B
或 C
撤消了 A
所做的事情。然后 rebase 会产生合并不会产生的冲突。
此外,您可以在变基期间解决 A
的冲突,这会改变变基过程,因为它适用于 B
和 C
。这有点难以想象,因为它取决于您在 rebaase 冲突解决期间如何编辑工作树,但理论上它可能会发生。
此外,合并可以通过多种方式产生与变基不同的最终内容。我想您可以将这些场景处理成冲突不同的情况。
为什么内容会有所不同?好吧,它 不应该 ,而它确实存在的情况是奇怪的边缘情况,在我看来,这些情况是由于 rebase
太过努力地想变得聪明而引起的——但不管它们几乎从来没有在实践中出现过。
我想举一个例子,其中变基冲突与合并冲突不同。
我理解各个术语(变基和合并)的含义。但是我不太明白他们怎么会产生不同的冲突。
有人可以举例说明正确的方向吗?
这是一个简单但有些做作的例子。假设您根据此图从主分支分支:
main: .. A -- D
\
feature: B -- C
并且你在某个源代码文件中有一个函数:
function foo() {
int a = 3;
return a;
}
假设,无论出于何种原因,您决定在提交 B 中添加一行:
function foo() {
int a = 3;
int b = 10;
return a;
}
在第二次提交 C 中,您删除了添加的行,保留了从主分支分支出来时的代码。
同时,在主分支中,其他人现在做了一个新的提交 D,它也添加了一个新行:
function foo() {
int a = 3;
int c = 5;
return a;
}
如果您要将功能分支变基到主分支,代码将从上面的 D 提交中的 int c = 5
行开始。但是然后重新应用您的第一个 B 提交会产生合并冲突,因为两个父项都试图在同一个函数中的同一个位置添加一个新行。您将解决该冲突,然后选择您想要的版本。
但是,如果您改为合并主分支到您的分支中,就不会有冲突。这样做的原因是您的功能分支从 C 提交开始,其源代码与主分支中的 A 提交相同。因此,只会对功能进行一次更改,来自主分支,并且可能不会发生冲突。
变基与合并中合并冲突的经验法则是,通常它们可能不相同。变基会在新基础上重新引入您的工作(提交),并且每次重新提交都可能导致合并冲突。另一方面,合并会一次性将单个增量引入目标分支。
在实践中,冲突差异通常应该是由于 rebase 一次应用一个提交补丁,而 merge 只查看每个分支的最终状态(以及合并基础 - 分支共有的最后一次提交) .
所以如果你有
o --- x <--(master)
\
A - B - C <-(feature)
并想将 feature
与 master
组合,也许 o-A
补丁与 o-x
冲突,即使 o-C
补丁不冲突 - 在最简单的情况下因为 B
或 C
撤消了 A
所做的事情。然后 rebase 会产生合并不会产生的冲突。
此外,您可以在变基期间解决 A
的冲突,这会改变变基过程,因为它适用于 B
和 C
。这有点难以想象,因为它取决于您在 rebaase 冲突解决期间如何编辑工作树,但理论上它可能会发生。
此外,合并可以通过多种方式产生与变基不同的最终内容。我想您可以将这些场景处理成冲突不同的情况。
为什么内容会有所不同?好吧,它 不应该 ,而它确实存在的情况是奇怪的边缘情况,在我看来,这些情况是由于 rebase
太过努力地想变得聪明而引起的——但不管它们几乎从来没有在实践中出现过。