将分支向后合并到主分支(master branch)?

6

我有一个功能分支B,它是基于功能分支A创建的。我想将分支B重新基于主分支进行变基,但不包括分支A的提交记录。

我的代码仓库如下:

c1---c2---c3  master
            \
             c4---c5---c6  A
                        \
                        c7---c8---c9  B

What I want is this:

             c7---c8---c9 B
            /
c1---c2---c3  master
            \
             c4---c5---c6  A

我尝试将分支B从主分支上变基。这并没有起到任何作用,分支B还停留在分支A上。
3个回答

10

可以从B追溯到master,因此就Git而言,分支B已经“在”master上。换句话说,B“包含”master

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

git rebase --onto master A B

rebase 改变了我的大脑哈希值 :-s 每次我认为我终于掌握了要点,我就会遇到另一种模式,让我感到困惑。我想现在我只需要多读一些文献了... 阅读 - Romain Valeri

5
一种三行樱桃挑选的解决方案,不如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删除备份,以获得您要求的确切结果。然而,这种救生衣对于Git来说只是轻微的负担。

4

除了提供的解决方案,这里还有第三种。

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

然后保存并退出,就这样

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接