我有一个由功能分支A组成的功能分支B。我想将分支B重新设置回主服务器,而无需分支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迁移到主服务器。那什么也没做,将分支B保留在分支A上。
答案 0 :(得分:5)
可以从B
追溯到master
,因此就Git而言,分支B
已经在master
上。换句话说,B
“包含” master
。
尝试明确要分支的分支和上游:
git rebase --onto master A B
答案 1 :(得分:4)
3行樱桃选择解决方案,虽然比Chris的出色答案简明扼要,但也许对某些人更清楚,可以这样:
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来说是一个轻负担;-)
答案 2 :(得分:2)
附带提供的解决方案,这是第三个解决方案。
您可以运行交互式变基。在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
然后,保存并退出,然后瞧。