我们说我有主分支和功能分支A,B,C,D和E.
C,D和E合并为B,B合并为主
它们在开发过程中的不同时间都与--no-ff
合并。
有一次,客户决定要删除功能D和E.
我可以通过提交列表并亲自挑选我想要恢复的提交,但这需要花费太多时间和精力,因为它们可能有数百个。
是否可以恢复(在master或A中)所有来自分支D和E的提交?
答案 0 :(得分:3)
您可以通过还原合并提交来执行此操作。让我们说D在提交abc123
时被合并到B中;在这种情况下,做git revert -m 1 abc123
。对E合并到B的提交执行相同的操作。
请注意,如果您希望将来重新引入D和/或E的更改,您将无法再次合并它们;您将需要还原上述git revert
命令创建的提交。换句话说,您需要"还原还原"。
答案 1 :(得分:1)
如果您有两个合并的分支:
h : merge commit
|
v
---------*-* B
/
----* D
您可以使用以下命令列出来自D的提交:
git rev-list h^..D
# h^ means : the first parent of h
# x..D means : any commit reachable from D and not reachable from x
您可以首先直观地检查此列表是否仅包含您要还原的提交:
gitk h^..D # or gitg, or git log --oneline --graph ...
撤消此提交列表的众多方法之一可能是:
# example from branch A :
# create a working branch :
git checkout -b wip_removing_D
# revert the whole list of commits :
git revert --no-edit $(git rev-list h^..D)
# go back to the target branch :
git checkout A
# create a single commit which contains all of the reverts :
git merge --squash wip_removing_D
# delete working branch :
git branch -D wip_removing_D