给定答案的更多解释,包括一个图形表示和一个逐步示例:
git revert -m 1 <merge commit id>
。
撤销合并提交不像
git revert <commit-hash>
那样直观,因为Git在查找合并提交时会混淆其两个父提交。为了指定所需的父提交,请使用
-m
标志。由于Git无法自动确定哪个父提交是主干线,哪个是要取消合并的分支,因此必须指定。
![git commit graph](https://istack.dev59.com/67teW.webp)
在 master
分支中合并了 iss53
分支,创建了一个 Merge Commit
,即 C6
。 C6
有两个父级,即 C5
和 C4
。
需要还原 C6
并将存储库返回到其在 C4
处的状态。因此必须指定用于还原命令的父级。
请检查 git log
,(这里用图表中的代码名称代表实际提交哈希值)
> git log
commit C6
Merge: C4 C5
Author: Mozz <mozz@example.com>
Date: Wed Feb 29 23:59:59 2020 +0100
Merge branch 'iss53' to master
...
从 git log
输出中,记录下与 Merge: - -
相关的父级 ID。它将以 Merge: parent1 parent2
的格式出现,这里是 Merge: C4 C5
。
C4
提交在 master
分支上,我们需要还原到该提交,即需要使用父级 1 和 -m 1
(使用 git log C4
确认之前的提交以确认父分支)。
切换到进行合并的分支(这里是 master
分支,我们的目标是从中删除 iss53
分支)
使用 -m 1
标志执行 git 还原。
git revert C6 -m 1
对于其他情况,如果需要,请恢复到C5
。
git revert C6 -m 2
git revert <merge commit id> -m 1 (reverts to parent1)
git revert <merge commit id> -m 2 (reverts to parent2)
实际例子
在一个只有main
分支的现有项目上创建了一个名为revert-test
的新分支,现在提交图看起来像这样。
![git tree before](https://istack.dev59.com/ZDvqf.webp)
(为了以图形方式查看提交,请在git log
后使用 --graph
[SO ans ref] 或使用这个更加交互式的 VS Code 扩展 - git graph)
现在,我添加了一些新文件,修改了现有文件,并在每个分支上创建了单独的提交,然后将它们推送到了源。现在的图形如下所示:
![git tree after commit](https://istack.dev59.com/5kjNv.webp)
然后,从GitHub创建了一个拉取请求,并将revert-test
分支合并到main
分支。
![git tree after merge](https://istack.dev59.com/cL2Ti.webp)
我想撤销合并提交并返回到main
分支中的上一个提交 - 即12a7327
请注意,合并提交 - 2ec06d9
现在有两个父提交 - main
中的12a7327
和revert-test
中的15bde47
,现在检查git log
,
> git log
commit 2ec06d9d315a3f7919ffe4ad2c2d7cec8c8f9aa3 (HEAD -> main, origin/main, origin/HEAD)
Merge: 12a7327 15bde47
Author: Akshay <63786863+akshay@users.noreply.github.com>
Date: Sun Feb 5 00:41:13 2023 +0530
Merge pull request
Revert test
要撤销合并提交并返回到 12a7327
,需要执行以下操作:
git revert 2ec06d9 -m 1
现在,提交消息将显示在编辑器中,指定详细信息,请检查和验证。
![git revert commit verify message](https://istack.dev59.com/8AZ9f.webp)
这样就创建了一个还原提交,它会执行合并提交的相反更改。
![revert commit](https://istack.dev59.com/isQ4d.webp)
最后推送更改,现在合并提交的更改已经消失,日志将会像这样。
![final git tree](https://istack.dev59.com/w5e9s.webp)