Git 在父分支合并到 master 后,将一个分支重新设置为另一个分支

Git rebase a branch on another after parent branch is merged to master

如果我 branch_1master 中分叉出来,假设有 2 次提交。

接下来,我从 branch_1 中创建了 branch_2
branch_2 上,我进行了不在区域 branch_1 中的更改。我当然在此处包含 branch_1 的更改,但我没有触及这些更改。

现在假设 branch_1 合并到 master。

接下来,在 branch_2git pull upstream master --rebasebranch_2 变基到 master 之上,以便 branch_1 的提交从 branch_2 的提交历史中消失.我不应该在这里遇到合并冲突。正确的?但是我使用在 branch_1 上更改的相同代码行。这很奇怪!这是预期的吗?

我已经重现了您的情况,如下面第一张图片所示。

注意这里我有以下命名:

大师==>主要

branch_1 ==> br1

branch_2 ==> br2

并且br1合并到main

而头在主枝(*)

要将 br2 变基为 main,您应该:

git checkout br2
git rebase main

如果 git 知道 branch_1branch_2 之间的关系,您关于 rebase 将做什么的假设是有效的,。你的问题是你 通过变基或压缩 branch_1 抛弃了这种关系

使用真正的合并,您的提交图将如下所示(其中“M”是您将 branch_1 合并到 branch_2 时的合并提交):

            master
              |
              v
... <- A <--- M
        \    /
         <- B <- C
            ^    ^
            |    |
       branch_1 branch_2

然后,当您将 branch_2 重新定位到 master 时,git 会发现提交 B 已经可以从 master 访问(作为提交 M 的父级),因此不会将其包含在要重播的提交列表。

但是,当您压缩 branch_1 时,您创建了这个(其中“BS”是压缩 branch_1 的结果):

            master
              |
              v
... <- A <--- BS
        \    
         <- B <- C
            ^    ^
            |    |
       branch_1 branch_2

现在,当您要求在 master 上变基 branch_2 时,它发现提交 B not 无法从 master(提交 BS)访问,因此 包括 它在要重播的提交列表中。如果提交 B 实际上是多次提交,它将一个接一个地应用它们,并且由于更改已经在 BS 中发生,因此这样做时您会遇到冲突。

解决方案(除了从现在开始使用真正的合并之外)是通过以下任一方式更明确地说明您想要变基的内容:

  • 使用交互式变基 (git rebase -i upstream/master) 并从待办事项列表中手动删除来自 branch_1 的提交
  • 使用 git rebase 的 three-argument 形式,“rebase old_base old_tip --onto new_base”:git rebase branch_1 branch_2 --onto upstream/master