假设我的 git 存储库中有以下结构:
C'---D'---E'---F' (dev)
/
A---B---C---D---E---F (master)
我想C'
拉入主分支并将分支点更改为C'
,即我想将上述内容变成
D'---E'---F' (dev)
/
A---B---C---C'---D---E---F (master)
我认为我应该使用樱桃采摘和重新定位的组合,但我对如何做到这一点感到困惑。 我应该执行哪个操作序列?
评论后的建议以获得更清晰的架构(因为原始中的同字母提交实际上是不必要的(
G---H---I---J (dev)
/
A---B---C---D---E---F (master)
与相关的预期结果:
H---I---J (dev)
/
A---B---C---G---D---E---F (master)
对于您的新图表,简短的回答是您将G
重新设置为基准:
git checkout master
git rebase <commit_id_G>
更长的答案是,你很难看到这一点,因为你认为master
是"主要"分支,而dev
是"分支"。但是,当然,这些分支名称只是标签,您可以将它们中的任何一个视为"主"分支。
而且,由于master
是我们实际想要更改的分支,我们可以像这样重新绘制图表:
H---I---J (master)
/
A---B---C---D---E---F---G (dev)
与相关的预期结果:
H'--I'--J' (master)
/
A---B---C---D---E---F---G (dev)
希望在这里更容易看到,我们只需要将master
从这个新D
而不是C
.
你只需要将master
变基到G
:
git checkout master
git rebase <id-of-G>
这将重写在master
中找到的所有提交,这些提交在G
之上的G
中找不到。没有必要采摘樱桃。您的dev
分支将保持不变。
您需要执行以下操作:
不要考虑这些提交的哈希引用:C
、C'
、D
、E
、F
。然后:
git checkout master
git reset --hard C
git cherry-pick C'
git checkout dev
git rebase -i master
(交互式变基以摆脱C'(git checkout master
git cherry-pick D
git cherry-pick E
git cherry-pick F
用--force
推动两个分支完成。
如果你对git
不满意,我不建议这样做,但如果绝对需要这样做,我会这样做。
你总是可以走这条路
D'---E'---F' (dev)
/
A---B---C---D---E---F---C' (master)
然后cherry-pick C'
将您的dev
分支重新定位以对抗master
.这将是最简单的解决方案。