将分支向后还原为主分支?

时间:2019-04-01 22:40:51

标签: git branch git-rebase

我有一个由功能分支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上。

3 个答案:

答案 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到达,这里c7c8c9

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

然后,保存并退出,然后