我只是将三个不同的分支合并为一个功能集的一部分并推送结果,以便存储库树当前如下所示:
--- A --- A1 --- A2 --- A3 -- | \ + --- B1 --- B2 --- B3 --- B4- | \ + --- C1 --- C2 --- C3 ---------C4
但是,我刚刚被告知B
分支尚未准备好进入黄金时段,因此我需要撤消这些提交。如何回滚我的更改,以便我的新主管C5
成为C3
和A3
提交的合并?当我完成后,我希望存储库看起来如下所示:
+ --- B1 --- B2 --- B3 --- B4 --- B5 | / --- A --- A1 --- A2 --- A3 -- | \ + --- C1 --- C2 --- C3 --- C4 --- C5
答案 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本身。
我强烈建议在执行此命令之前备份您的存储库,以便在安全方面进行播放。