通过示例了解变基冲突与合并冲突

时间:2019-10-04 08:23:23

标签: git merge rebase

我正在尝试举一个例子,其中基准冲突与合并冲突不同

我了解各个术语(变基和合并)的含义。但是我不太了解他们如何造成不同的冲突。

有人可以举例说明我的正确方向吗?

2 个答案:

答案 0 :(得分:1)

这是一个简单且有些人为的示例。假设您根据此图从主分支分支出来:

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提交相同。因此,仅对功能进行一次更改(来自主分支),就不会有冲突。

重定基准与合并中合并冲突的经验法则是,通常它们可能并不相同。重定基础将在新的基础上重新引入您的工作(提交),并且每次重新提交都可能导致合并冲突。另一方面,合并一次将单个增量引入目标分支。

答案 1 :(得分:0)

在实践中,冲突差异通常应归因于这样的事实,即rebase一次应用一个提交补丁,而合并仅查看每个分支的最终状态(以及合并基础-分支共有的最后一次提交)。 / p>

如果有的话

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

,并且想要将featuremaster结合使用,即使o-A补丁没有,也可能o-x补丁与o-C发生冲突-在最简单的情况下,因为{ {1}}或B撤消C所做的事情。然后,重新设置基准将产生冲突,而合并将不会。

此外,有可能您在重新设置基准期间解决了A的冲突,并在应用AB时改变了重新确定基准的过程。可视化起来有点困难,因为这取决于您在重新解决冲突期间如何编辑工作树,但是从理论上讲,它可能会发生。

此外,合并还有几种方法可以使最终内容不同于重新定基。我想您可以将这些情况操纵成冲突不同的情况。

为什么内容不同?好吧,不应该,在我看来,这种情况是怪异的情况,是由于C过于努力以至于无法聪明而引起的,但无论它们几乎从未出现过在实践中。