Rebase功能分支到另一个功能分支

Arj*_*jen 270 git git-rebase feature-branch

我有两个(私人)功能分支,我正在努力.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2
Run Code Online (Sandbox Code Playgroud)

在这些分支上工作一段时间后,我发现我需要Branch1中Branch2的更改.我想将Branch2中的更改重新绑定到Branch1上.我想最终得到以下结论:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1
Run Code Online (Sandbox Code Playgroud)

我很确定我需要将第二个分支重新绑定第一个分支,但我不完全确定正确的语法以及我应该检查哪个分支.

这个命令会产生预期的结果吗?

(Branch1)$ git rebase --onto Branch1 Branch2
Run Code Online (Sandbox Code Playgroud)

sas*_*ikt 315

  1. 切换到Branch2

    git checkout Branch2
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在Branch1更改之上应用当前(Branch2)更改,保留在Branch2中:

    git rebase Branch1
    
    Run Code Online (Sandbox Code Playgroud)

哪个会在Branch2中留下您想要的结果:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2
Run Code Online (Sandbox Code Playgroud)

您可以删除Branch1.

  • 他不想在Branch1中进行所有更改吗? (8认同)
  • 这看起来与他想要的相反,不是吗? (4认同)
  • @tomasz_kusmierczyk 和 1252748,这与他想要的并不相反,这正是他想要的。分支名称并不重要,您可以随时更改它们。 (4认同)
  • 事实上,@tomasz_kusmierczyk 和@1252748,我自己也很困惑。但是后来我意识到,在 Branch1 中执行 `git rebase` 将重写 Branch1 历史记录,以便在从 Branch2 复制的那些更改之上添加 Branch1 的更改。这将导致以下提交顺序,`a - b - f - g - c' - d' - e'`。 (3认同)
  • @a3y3 分支名称确实很重要。如果您想对具有开放 PR 的分支进行变基怎么办?你不能用这个方法来做到这一点,对吗? (3认同)

Von*_*onC 53

注意:如果你在Branch1,你将使用Git 2.0(2014年第二季度)能够输入:

git checkout Branch2
git rebase -
Run Code Online (Sandbox Code Playgroud)

提交4f40740布莱恩Gesiakmodocache:

rebase:允许" -"为前一个分支的简写

教导rebase使用相同的简写,checkout并将merge分支命名rebase为当前分支; 也就是说," -"表示"我们之前所在的分支".

  • 不错,但也有点危险.有时候冗长的胜利.但话说回来,我也喜欢Java ...( - : (21认同)

Asf*_*azi 24

该解决方案应该完全按照要求执行(将 Branch2 的提交添加到 Branch1 之上,同时保留在 Branch1 上):

git checkout Branch1
git cherry-pick master..Branch2
Run Code Online (Sandbox Code Playgroud)

你最终会得到这个。

a -- b -- c                      <-- Master
           \
            d -- e -- f' -- g'   <-- Branch1 (current)
           \
            f -- g               <-- Branch2
Run Code Online (Sandbox Code Playgroud)

这将按照顺序挑选 Branch2 上的每个提交到 Branch1。然后就可以删除Branch2了。


pki*_*ini 7

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

git rebase --onto branch1 master branch2
Run Code Online (Sandbox Code Playgroud)

变基前:

* 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
Run Code Online (Sandbox Code Playgroud)

变基后:

* 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
Run Code Online (Sandbox Code Playgroud)

这使得它变得明确并且清楚哪些提交集正在重新基于什么


Cra*_*igo 6

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

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Run Code Online (Sandbox Code Playgroud)