git误合并两分支如何回退
当你错误地在 main 分支上执行了 git merge 并触发了 Fast-forward(快进)合并,随后又推送到了远程仓库,可以通过以下步骤将本地和远程的 main 分支恢复至合并前的状态。请根据你的具体情况(例如,错误的提交是否已经与他人共享)选择合适的方法。
下面的表格对比了两种主要的恢复方法:
| 特性 | git reset (彻底回退) | git revert (安全撤销) |
|---|---|---|
| 操作本质 | 将分支指针强行移动到之前的提交,移除错误合并的提交 | 新建一个提交,其内容恰好抵消错误合并的更改 |
| 历史记录 | 重写历史,错误合并的提交将从分支历史中消失 | 追加历史,错误合并的记录依然存在,但新增了撤销它的记录 |
| 风险程度 | 高,特别是强制推送覆盖远程仓库时 | 低,不改变既有历史 |
| 适用场景 | 错误合并尚未被其他同事在其工作中引用;或个人分支 | 错误合并可能已被他人拉取;或团队协作的公共分支(如 main) |
| 后续推送 | 需要强制推送 git push -f | 只需普通推送 git push |
1、使用 git reset (彻底回退)
此方法会丢弃自目标提交之后的所有提交,将分支历史重置到合并前的状态。
-
找到合并前的提交
在终端中执行git log --oneline,找到合并前main分支最新的那个提交的哈希值(例如5b23503)。记下这个哈希值。 -
执行本地重置
确保你当前在main分支上,然后执行重置命令:git reset --hard 5b23503请将
5b23503替换为你第一步中找到的实际提交哈希。--hard选项会同时将你的工作目录和暂存区恢复到该提交点的状态。 -
强制推送到远程仓库
由于你本地的历史已经改变,必须使用强制推送来覆盖远程仓库的main分支:git push -f origin main⚠️ :此操作会覆盖远程历史。
2、使用 git revert (安全撤销)
此方法通过创建一个新的提交来撤销之前错误合并的所有更改,是更安全的选择,尤其适用于团队协作的环境。
-
找到要撤销的合并提交
执行git log --oneline,找到代表错误合并的那个提交的哈希值(例如a1daaad)。 -
执行撤销操作
确保你当前在main分支上,然后执行撤销命令:git revert -m 1 a1daaad请将
a1daaad替换为实际的错误合并提交哈希。-m 1选项是必须的,它告诉 Git 你希望保留在合并操作中主线(通常是main分支)的更改状态。- 执行后 Git 会打开默认编辑器让你编辑撤销提交的信息,保存并退出即可。
-
推送到远程仓库
由于revert是添加新的提交,所以只需要常规推送即可:git push origin main
补充:
正常公司项目为protected,不允许强制推送,需把下图开关打开:

