2016-01-21 112 views
15

我有两个分支(和主)。分支2是基于分支1是基于主分支的。我提交了分支1进行审查,它有一些变化,我将其中一些更改重新编入历史记录,并将结果合并到主数据库中。只重建部分分支

现在我需要在master上重新分支分支2以准备审查/合并。

问题是分支2仍然包含分支1的原始提交,它不再存在,所以git变得困惑。我尝试了rebase -i删除了分支1的原始提交,但分支2的提交不基于master-before-branch-1的提交。

我需要做的是采取分支2,放弃一些提交,并在一次操作中将剩下的提交放在master之上。但我只知道如何在两个不同的步骤中完成这两个操作。

如何将我的分支的一部分重新绑定到另一个分支上,删除所有不是共同祖先的提交,除了我指定的提交(例如,从HEAD〜2起)?

这里的当前状态:

master      new branch 1 
- - - - - - - - - - - | - - - - - - - - - 
    \ 
    \ branch 1 
     \ _ _ _ _ _ _ _ 
        \ 
         \  branch 2 
         \ _ _ _ _ _ _ _ 

我想落得什么:

master   new branch 1  
- - - - - - - | - - - - - - - - - - 
            \ 
            \ 
            \ 
             \ branch 2 
             - - - - - - - - - 
+4

代表您的回购状态的ASCII图将有所帮助。乍一看,我会说你正在寻找['git rebase --onto'](https://git-scm.com/docs/git-rebase)。看看是否有帮助:http://stackoverflow.com/questions/28715619/how-can-i-rebase-part-of-a-branch-to-the-master-branch/28715930#28715930 – Jubobs

+0

更好!另请参见http://stackoverflow.com/questions/25488138/move-initial-commits-off-master-to-another-branch-in-git/25490288#25490288 – Jubobs

+0

git rebase --onto几乎为我工作。我做了'git rebase - 主人 - 根HEAD〜1',但由于某种原因,它选择了三次提交,而不是只有'HEAD〜1'以上。此外,我现在处于独立HEAD状态,而不是重新装订我的分支。 – Puppy

回答

11

解决的办法是比我预想的要简单得多。事实证明,你可以提供-i更大范围的rebase命令(我认为这只是为了改变历史记录来重新分支自己)。所以我只是跑git rebase -i master并放弃了那些额外的提交。

+0

为了阐明@Puppy做的是从分支2到新分支1(分支2上的'git rebase -i new_branch_1')进行交互式分配,并使用交互式控制台移除所有分支1提交,以便仅分支2的提交被执行。 – theannouncer

19

实际的命令是:

git rebase --onto newbranch1 branch1 branch2 

这将重播上的new_branch1所有顶级branch1高达branch2 HEAD提交。

+0

它确实(即将发布相同的我自己)。顺便提一句,'git help rebase'涵盖了这种情况。 –

+0

@TomFenech甚至比'git help rebase'更好:http://stackoverflow.com/a/2369516/6309(我的旧2010年答案);) – VonC