将特性分支重新建立到另一个特性分支上

我有两个(私有)功能分支正在开发中。

a -- b -- c                  <-- Master
\     \
\     d -- e           <-- Branch1
\
f -- g               <-- Branch2

在这些分支工作了一段时间后,我发现我需要在Branch1中从Branch2中进行更改。我想将Branch2中的更改重新基于Branch1。最后,我想谈几点:

a -- b -- c                  <-- Master
\
d -- e -- f -- g <-- Branch1

我非常确定我需要将第二个分支重新赋基于第一个分支,但我不完全确定正确的语法以及我应该签出哪个分支。

这个命令会产生想要的结果吗?

(Branch1)$ git rebase --onto Branch1 Branch2
310953 次浏览
  1. 切换到Branch2

    git checkout Branch2
    
  2. Apply the current (Branch2) changes on top of the Branch1 changes, staying in Branch2:

    git rebase Branch1
    

Which would leave you with the desired result in Branch2:

a -- b -- c                      <-- Master
\
d -- e               <-- Branch1
\
d -- e -- f' -- g'   <-- Branch2

可以删除Branch1。

注意:如果你在Branch1上,你将能够在Git 2.0(2014年Q2)中键入:

git checkout Branch2
git rebase -

参见提交4 f40740 by Brian Gesiak modocache:

rebase:允许“-”用于前一个分支

教授rebase与checkoutmerge相同的简写,将分支命名为当前分支上的rebase;也就是说,“-”表示“我们之前在的分支”。

我知道你要求Rebase,但我会选择我想要从Branch2移动到Branch1的提交。这样,我就不需要关心什么时候从master创建了哪个分支,而且我对合并有更多的控制。

a -- b -- c                  <-- Master
\     \
\     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
\
f -- g               <-- Branch2

我知道你已经接受了答案,但如果你想做你所要求的(将Branch2的提交添加到Branch1之上,同时保持在Branch1上),你可以这样做:

git checkout Branch1
git cherry-pick master..Branch2

你会得到这个。

a -- b -- c                      <-- Master
\
d -- e -- f' -- g'   <-- Branch1 (current)
\
f -- g               <-- Branch2

这将选择Branch2上的每个提交,按顺序转移到Branch1上。然后删除Branch2。

我是否误解了这个问题?我的直觉是像这样使用rebase--onto标志:

git rebase --onto branch1 master branch2

之前变基:

* 6263580 (HEAD -> branch2) add g
* c802c88 add f
| * c80cfb0 (branch1) add e
| * aea5708 add d
| * 2e522fe (master) add c
|/
* 0613527 add b
* e2a0c4d add a

后变基:

* 7f6a363 (HEAD -> branch2) add g
* 4cbab60 add f
* c80cfb0 (branch1) add e
* aea5708 add d
* 2e522fe (master) add c
* 0613527 add b
* e2a0c4d add a

这使得哪组提交被基于什么进行重设变得明确而明确