Git 在父分支合并到 master 后,将一个分支重新设置为另一个分支
Git rebase a branch on another after parent branch is merged to master
如果我 branch_1
从 master
中分叉出来,假设有 2 次提交。
接下来,我从 branch_1
中创建了 branch_2
。
在 branch_2
上,我进行了不在区域 branch_1
中的更改。我当然在此处包含 branch_1
的更改,但我没有触及这些更改。
现在假设 branch_1
合并到 master。
接下来,在 branch_2
我 git pull upstream master --rebase
将 branch_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_1
和 branch_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
如果我 branch_1
从 master
中分叉出来,假设有 2 次提交。
接下来,我从 branch_1
中创建了 branch_2
。
在 branch_2
上,我进行了不在区域 branch_1
中的更改。我当然在此处包含 branch_1
的更改,但我没有触及这些更改。
现在假设 branch_1
合并到 master。
接下来,在 branch_2
我 git pull upstream master --rebase
将 branch_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_1
和 branch_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