如何在不使用重置的情况下撤消 git 中的快进合并

How to undo a fast-forward merge in git without using reset

想象一下这个场景:

master:            M
release-candidate:  \     A--B'--C'
feature-A:           \-A-/  /   /
feature-B:            \-B--/   /
feature-C:             \--C---/

候选版本是使用以下命令创建的:

git co master
git co -b release-candidate
git merge feature-A (FAST FORWARD)
git merge feature-B (REGULAR MERGE)
git merge feature-C (REGULAR MERGE)

假设在预发布测试期间我们发现了功能 A 的问题。我们如何撤消将此功能分支快速合并到发布候选分支中所引入的更改?

我们可能会将候选版本重置回其主状态并再次开始合并所有有效功能,但这将意味着重复大量合并冲突解决并引入错误的可能性。

另请注意,我只在每个功能分支上显示了一个提交,但是在有多个提交要撤消的情况下,解决方案应该有效。

因为你不想重写已发布的历史,所以 git revert 是你的朋友。

在这种情况下:

git revert M..A -n
git commit -m "revert feature-A"

如果你想在一次提交中恢复,或者

git revert M..A

如果您希望每个原始提交都以相反的顺序还原提交。