我有一个功能分支B,它是由一个功能分支A组成的。我想将分支B重新绑定到master上,而不需要分支A的提交。
我的存储库看起来像这样:
c1---c2---c3 master
\
c4---c5---c6 A
\
c7---c8---c9 B
我想要的是这个:
c7---c8---c9 B
/
c1---c2---c3 master
\
c4---c5---c6 A
我尝试从分支B到主人做一个rebase。这没有做任何事情,并将分支B保留在分支A.
有可能追溯从B
到master
,所以就Git而言,分支B
已经“开启”master
。换句话说,B
“包含”master
。
尝试明确要重新分支的分支和上游:
git rebase --onto master A B
一个3行樱桃挑选解决方案,比克里斯的优秀答案简洁,但可能更清楚一些,可以这样:
git branch backup-B B
git checkout -B B master
git cherry-pick A..backup-B
步骤说明:
1)备份(也作为后来樱桃选择的参考)
git branch backup-B B
c1---c2---c3 <<< master
\
c4---c5---c6 <<< A
\
c7---c8---c9 <<< backup-B, B <<< HEAD
2)主人的B点(并在同一时间检查出来)
git checkout -B B master
c1---c2---c3 <<< master, B <<< HEAD
\
c4---c5---c6 <<< A
\
c7---c8---c9 <<< backup-B
3)“复制”丢失的提交(不能从A到达,但可以从“旧”B,这里c7
,c8
,c9
)
git cherry-pick A..backup-B
c7'---c8'---c9' <<< B <<< HEAD
/
c1---c2---c3 <<< master
\
c4---c5---c6 <<< A
\
c7---c8---c9 <<< backup-B
(当然在这一点上,尽管没有必要,你可以用git branch -D backup-B
删除备份以获得你要求的确切结果。但是,这样的救生衣对gititanic来说是轻负担;-)
除了提供的解决方案,这里还有第三个。
您可以运行交互式rebase。当在B
检查时,运行git rebase --interactive master
。您的$EDITOR
将打开以下内容:
pick c4 Message of c4
pick c5 Message of c5
pick c6 Message of c6
pick c7 Message of c7
pick c8 Message of c8
pick c9 Message of c9
在这里,您需要删除属于A
的提交,因此您需要使文件看起来像:
pick c7 Message of c7
pick c8 Message of c8
pick c9 Message of c9
然后,保存并退出,瞧。