恢复源自各种特定分支的提交

时间:2016-02-09 12:23:21

标签: git

我们说我有主分支和功能分支A,B,C,D和E.

C,D和E合并为B,B合并为主 它们在开发过程中的不同时间都与--no-ff合并。

有一次,客户决定要删除功能D和E. 我可以通过提交列表并亲自挑选我想要恢复的提交,但这需要花费太多时间和精力,因为它们可能有数百个。
是否可以恢复(在master或A中)所有来自分支D和E的提交?

2 个答案:

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