如何恢复从一个分支合并的所有提交
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)
为了撤消来自A
、B
、C
和D
提交的QA
中的更改,您需要还原合并提交M1
和M2
。
首先,您需要找到在release/4.0.1
为forked 之后发生在QA
上的合并提交:
git log --format='%h %s' --right-only --merges releases/4.0.1...QA
这将返回 M1
、N
和 M2
1 的 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
发生在 M1
和 M2
之间,所以它会成功。
【讨论】:
@TTT 谢谢。不幸的是,N
确实会出现在列表中,因为它发生在两者之间。我更新了我的答案以澄清这一点。
好的,这很有道理。另外,我认为您想以相反的顺序还原?
@EnricoCampidoglio 如果你想将它重新合并回来,你可以恢复它以上是关于如何恢复从一个分支合并的所有提交的主要内容,如果未能解决你的问题,请参考以下文章