2012-02-01 156 views
4

我只是合并后的不同分支一起设定功能的一部分,并推动的结果,使资源库树目前看起来如下:如何从git中的多分支合并中删除分支?

 
--- A --- A1 --- A2 --- A3 -- 
    |       \ 
    + --- B1 --- B2 --- B3 --- B4- 
    |        \ 
    + --- C1 --- C2 --- C3 ---------C4 

但是,我刚才被告知,B分支不准备好黄金时间,所以我需要撤消这些提交。我如何回滚我的更改,以便我的新主管C5将合并C3A3提交?当我做我想要的库看起来像以下:

 
    + --- B1 --- B2 --- B3 --- B4 --- B5 
    |      /
--- A --- A1 --- A2 --- A3 -- 
    |       \ 
    + --- C1 --- C2 --- C3 --- C4 --- C5 
+0

你为什么不只是硬所有分支重置为第三状态,做一个从B和C合并吗?你是否意味着在失败合并之后你已经做了一些额外的工作,并且希望在保留以下工作的同时解决这个合并问题? – 2012-02-07 00:44:33

+0

@ the.malkolm - 在某些情况下,我认为可能是这种情况,其中一位开发人员询问如何删除某些不会发布的功能代码。 – rjzii 2012-02-08 17:11:13

回答

1
# checkout before merge 
git checkout C3 
# make merge we want 
git merge A3 
# rebase any work on top of the new merge 
git rebase --onto HEAD C4 branch_C 
# use fixed version as branch_C 
git branch -f branch_C HEAD 
# aha! now you on the fixed branch_C 
git checkout branch_C 

比做同样的用B.我想你没有C路& B之后再“坏”的合并。

2

还原C4(并提交即逆转),然后合并成A3刚刚创建的C5。

--- A --- A1 --- A2 --- A3 ----------------------------- 
    |       \       \ 
    + --- B1 --- B2 --- B3 --- B4-      \ 
    |        \      \ 
    + --- C1 --- C2 --- C3 ---------C4--- C5(reverts C4) -- C6 

您最终得到含有B3 + A3的B4和含有C3 + A3的C6。

我想你可以通过衍合也做了这一切,但我宁愿让我的曲目时,我已经做了一些凌乱的,所以我可以看到我的两个错误,我做了什么来解决这个问题。重建取消了历史,这让我抽搐。

+0

如果需要的话,会不会只是回到'B3'并承诺撤消'B4'提交的问题? – rjzii 2012-02-01 20:29:08

+1

恢复不会“完全”撤销提交。你不会“回复”更早的一个。还原提交创建一个新的提交是的逆指定提交,回退变化,而在时间上向前移动。所以:撤消B4提交,你会回复B4,然后在那个分支上提交。见http://gitready.com/intermediate/2009/03/16/rolling-back-changes-with-revert.html'git的reset'向后移动你的时候,有点像底垫中,但我更愿意恢复和保持记录我的错误和我的修复。 – 2012-02-01 20:35:07

+0

恢复合并是有趣的。请阅读'-m'选项下的联机帮助页面,其中包括后续合并不会恢复更改的警告。 – Cascabel 2012-02-02 01:40:54

3

我从只要它没有被按下,喜重做误事UPS 营,我要离开一个更简洁的历史和我平时做这样的:

# go back to commit C3 
git checkout C3 

# redo the merge with only A 
git merge branch_A 

# make sure you've gotten the desired alteration 
# git diff --stat branch_C 
# git diff branch 

# switch your C branch over to your redone version 
git checkout -B branch_C 

# otherwise if you change your mind, just go back to C4 
# git checkout branch_C 

编辑:评论#4完全正确,因为之前的版本没有任何结果。此编辑会更改git merge一行,该行是以前合并的B4。如果参数C3不是分支名称,则初始结帐中的--detach选项也会被删除,因为它是多余的。

+1

真的没有理由期待C3有分支。事实上,一切都表明:在图片中,C3表示提交。所以你使用'--detach'是不必要的分心。 – Cascabel 2012-02-02 01:46:15

+0

的确如此。但是我用的'--detach'更多的是明确地在我的意见,我认为高于其使用具有以下优点:1,提示使用分离状态的概念,这是类似的,但使用'混帐checkout'微妙的不同在一个分支上。 2.如果我没有明确说出这些内容,那么不太熟悉的人可能会认为指定分支名称是同义词,然后在移动后最终会混淆。 (虽然在第二个想法,这些人可能不会创建任意分支..) – antak 2012-02-02 02:52:21

+0

重点是,虽然这是一件好事,要知道,这不是一个真正的好方法来显示它的含义或为什么你需要使用它,因为你在没有任何操作的情况下使用它。 – Cascabel 2012-02-02 03:05:50

0

假设您还没有共享此存储库与其他任何人尚未,您可以尝试git rebase --onto

git rebase --onto <to> <from> <what> 

我会假设你的分支被命名为A(在A3),B(在B4)和C(C4处):

git rebase --onto B3 A3 C 

如果B3和A3实际上是提交自己的SHA 。

强烈建议备份您的存储库,然后执行此命令在安全的一边播放它。