如何从git中的多分支合并中删除分支?

时间:2012-02-01 19:43:19

标签: git merge revert

我只是将三个不同的分支合并为一个功能集的一部分并推送结果,以便存储库树当前如下所示:

--- 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

4 个答案:

答案 0 :(得分:3)

我来自营地,只要没有被推动,就更喜欢重做,留下一个不那么冗长的历史,我通常会这样做:

# 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的{​​{1}}行。如果参数B4不是分支名称,则初始签出中的--detach选项也会被删除,因为它是多余的。

答案 1 :(得分:2)

恢复C4(并提交该回复),然后将A3合并到刚刚创建的C5中。

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

最终B4含有B3 + A3,C6含有C3 + A3。

我想你也可以通过变调来做这一切,但是当我做了一些凌乱的事情时,我更愿意离开我的轨道,所以我可以看到我的错误以及我做了什么来解决它。 Rebase撤消历史,这让我抽搐。

答案 2 :(得分: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'''合并之后的进一步发展。

答案 3 :(得分: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本身。

强烈建议在执行此命令之前备份您的存储库,以便在安全方面进行播放。