如何恢复到几个旧的提交,包括合并,但有一个提交在恢复提交的头部?



我有一个这样的提交列表:

Author: xyz
Date:   Fri Jul 30 11:48:40 2021 -0700
update tests
commit 76810c2bdf91cd84661fabb06f00f37fc0e6b264
Author: abc
Date:   Thu Jul 29 16:38:33 2021 -0700
fix for issue
commit b9a1642c3d778524291c98895425aa0248ed5766
Merge: baeb6428 6b722171
Author: abc
Date:   Thu Jul 29 16:36:58 2021 -0700
Merge branch
commit 6b722171718f7aa70236613c544d8ca9f6cdeea9
Author: abc
Date:   Thu Jul 29 17:15:02 2021 +0000
Use new type
commit baeb642886c19135c6057fba94849768b5ffc5a3
Author: abc
Date:   Wed Jul 28 16:24:10 2021 -0700
old commit 

我想回到旧的提交,但有一个提交76810c2bdf91cd84661fabb06f00f37fc0e6b264包括在内。我该怎么做呢?

我为每个提交手动尝试git revert <hash>git revert -m 1 <merge hash>合并提交,但它没有像预期的那样工作。此外,我有一长串的恢复要做,这是一个繁琐的任务,手动去做。有更简单的方法吗?

这种情况有时会发生在我们团队的发布/集成分支中,某些特性的发布将被中止/取消,但这些特性已经在发布/集成分支上提交或合并了。

从你的评论:

我希望A <- B <- C <- D像B <- D

与其试图找到git revert的解决方案,我们宁愿这样做:

  1. D上创建一个新的分支
    • 查看如何从旧提交创建新的Git分支?
  2. 如果B是一个单一或小的提交集,只需git cherry-pickit/them

在您的示例中,它将是:

# git checkout -b <new-branch-name> <old commit>
$ git checkout -b new-branch baeb642886c19135c6057fba94849768b5ffc5a3
# git cherry-pick <specific commit>
$ git cherry-pick 76810c2bdf91cd84661fabb06f00f37fc0e6b264
# make new branch available to rest of team
$ git push -u origin new-branch

现在我们有new-branch,它是基于旧的提交+在它上面的一个提交。如果您选择的提交依赖于C的更改,则cherry-pick上可能存在冲突。这里不再包含

D -> C -> B -> A [old-branch]

-> B [new-branch]

注意,这里没有真正的还原,因为包含您不再需要的提交的旧分支仍然在那里。但至少在这里,人们的本地副本被弄乱的机会更少,因为他们只需要签出这个new-branch。(我们通常保留old-branch一段时间作为参考,因为有时人们会改变主意…)

要完成一个恢复操作,我们可以简单地删除old-branch,这将删除所有你不再包含在new-branch中的提交。这与git revert具有相同的破坏性效果,因此请注意确实不再需要任何这些提交,特别是合并的分支(您可能想要重新创建这些分支)。

最新更新