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

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

切换到Branch2 git checkout 将当前(Branch2)更改应用于Branch1更改之上,保持不变 在Branch2: git rebase Branch1

这会让你在Branch2中得到想要的结果:

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

可以删除Branch1。


注意:如果你使用的是Branch1,你可以使用Git 2.0(2014年第二季度)输入:

git checkout Branch2
git rebase -

参见Brian Gesiak modocache的commit 4f40740:

Rebase:允许“-”作为前一个分支的简写

教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's -on flag,就像这样:

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

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