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

Posted

技术标签:

【中文标题】如何恢复到几个较旧的提交,包括合并,但在恢复提交的头部有一个提交? [关闭]【英文标题】:How to revert to several older commits including merge but have one commit on top of the head of reverted commit? [closed] 【发布时间】:2021-10-06 10:12:06 【问题描述】:

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

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>,但它没有按预期工作。此外,我有一长串要做的恢复工作,手动完成是一项繁琐的任务。有没有更简单的方法来做到这一点?

【问题讨论】:

这能回答你的问题吗? How do I revert a Git repository to a previous commit? 它只是恢复到较旧的提交,但我希望 A git revert 接受范围。我认为,不要将revert 与“在reverted commit 的头部有一个提交”结合起来使其复杂化。我会在“旧提交”上恢复或创建一个新分支,然后挑选“修复问题”提交。 【参考方案1】:

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

来自your comment:

我希望 A

与其尝试通过git revert 找到解决方案,我们更愿意这样做:

    D 上创建一个新分支 见How do I create a new Git branch from an old commit? 如果 B 是单个或一小组提交,只需 git cherry-pick it/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]

请注意,这里并没有真正恢复,因为带有您不再需要的提交的 old-branch 仍然存在。但至少在这里,人们的本地副本被搞砸的机会更少,因为他们只需要签出这个 new-branch。 (我们通常会保留 old-branch 一段时间作为参考,因为有时人们会改变主意......)。

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

【讨论】:

以上是关于如何恢复到几个较旧的提交,包括合并,但在恢复提交的头部有一个提交? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

你如何恢复到 Git 中的特定标签?

如何恢复从一个分支合并的所有提交

如何在 Git 中标记较旧的提交?

你如何恢复错误的 git 合并提交

如何中止mercurial中的合并?

您如何合并已恢复的提交?