将分支向后重新设置为 master 分支?

Rebase a branch backwards to master branch?

我有一个由功能分支 A 组成的功能分支 B。我想在没有分支 A 的提交的情况下将分支 B 变基回到 master。

我的存储库如下所示:

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 到 master 进行变基。那没有做任何事情并将分支 B 保留在分支 A 上。

可以从 B 追溯到 master,所以就 Git 而言,分支 B 已经是 "on" master.换句话说,B "contains" master.

尝试明确说明要变基的分支和上游:

git rebase --onto master A B

一个 3 行的精选解决方案,不如 Chris 的出色答案简洁,但对某些人来说可能更清晰,可以像这样:

git branch backup-B B
git checkout -B B master
git cherry-pick A..backup-B

步骤说明:

1) 做好备份(也作为后面cherry-pick的参考)

git branch backup-B B

c1---c2---c3  <<< master
            \
             c4---c5---c6  <<< A
                        \
                        c7---c8---c9  <<< backup-B, B <<< HEAD

2) master的B点(同时查看)

git checkout -B B master

c1---c2---c3  <<< master, B <<< HEAD
            \
             c4---c5---c6  <<< A
                        \
                        c7---c8---c9  <<< backup-B

3) "copy" 缺失的提交(无法从 A 访问但可以从 "old" B 访问,此处 c7c8, 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 drop backup 来获得你想要的准确结果。但是,这样的救生衣是轻gititanic 的负担 ;-)

除提供的解决方案外,还有第三个。

您可以 运行 交互式变基。在 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

然后,保存退出,.