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

Posted

技术标签:

【中文标题】如何恢复从一个分支合并的所有提交【英文标题】:How to revert all commits merged from one branch 【发布时间】:2021-10-31 03:01:53 【问题描述】:

我有一个发布分支,例如 release/4.0.1,我们用来将所有更改添加到此版本并将其合并到我们的 QA 分支。我们进行了多次提交并多次合并到我们的QA 分支。现在,我们要删除 QA 中由 release/4.0.1 所做的所有更改。分支上还有其他合并和提交。

最简单的方法是什么?仅恢复与该分支相关的更改和提交。

【问题讨论】:

合并release/4.0.1分支时是否有“合并提交”? 【参考方案1】:

让我们可视化您的场景:

o---o---o------o (some-other-branch)
                \
o---o---o---M1---N---M2 (QA)
     \     /        /
      A---B---C----D (release/4.0.1)

为了撤消来自ABCD 提交的QA 中的更改,您需要还原合并提交M1M2

首先,您需要找到在release/4.0.1 为forked 之后发生在QA 上的合并提交:

git log --format='%h %s' --right-only --merges releases/4.0.1...QA

这将返回 M1NM21 的 ID 和提交消息。例如:

18abe3e Merge branch 'release/4.0.1'
2db6c39 Merge branch 'some-other-branch'
b49ea3f Merge branch 'release/4.0.1'

此时,您可以从release/4.0.1 中的QA 从最新的一个开始还原合并提交:

git switch QA
git revert -m 1 b49ea3f # Reverts M2
git revert -m 1 18abe3e # Reverts M1

或者,您可以在单个提交中还原所有合并提交:

git switch QA
git revert -m 1 --no-commit b49ea3f # Reverts M2
git revert -m 1 --no-commit 18abe3e # Reverts M1
# Verify that everything works
git commit -m "Revert merge commits M2 and M1"

请注意:还原合并提交会删除更改,但不会更改分支的历史记录。如果您想再次将 release/4.0.1 合并到 QA 中,这会使事情变得复杂。有关the consequences of reverting a merge 的更多信息,请阅读文档。


    很遗憾,无法从发生在之间的其他分支中过滤掉合并提交。在这个例子中,N 发生在 M1M2 之间,所以它会成功。

【讨论】:

@TTT 谢谢。不幸的是,N 确实会出现在列表中,因为它发生在两者之间。我更新了我的答案以澄清这一点。 好的,这很有道理。另外,我认为您想以相反的顺序还原? @EnricoCampidoglio 如果你想将它重新合并回来,你可以恢复它

以上是关于如何恢复从一个分支合并的所有提交的主要内容,如果未能解决你的问题,请参考以下文章

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

重新提交在 git 中恢复的提交

如何恢复已经推送到远程分支的合并提交?

恢复合并时如何找出分支号?

恢复旧的合并提交文件而不影响后续提交

从 GitHub.com 上的受保护分支恢复合并提交