首页 > 解决方案 > 如何恢复从一个分支合并的所有提交

问题描述

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

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

标签: gitversion-controlgit-mergegit-revert

解决方案


让我们可视化您的场景:

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

为了撤消QA来自提交A、和的更改B,您需要还原合并提交和。CDM1M2

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

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

这将返回M1,NM21的 ID 和提交消息。例如:

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

此时,您可以从最新release/4.0.1QA开始恢复合并提交:

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。阅读文档以获取有关还原合并后果的更多信息。


  1. 不幸的是,不可能过滤掉其他分支中发生合并提交。在这个例子中,N发生在M1和之间M2,所以它会成功。

推荐阅读