当你错误地在 main 分支上执行了 git merge 并触发了 Fast-forward(快进)合并,随后又推送到了远程仓库,可以通过以下步骤将本地和远程的 main 分支恢复至合并前的状态。请根据你的具体情况(例如,错误的提交是否已经与他人共享)选择合适的方法。

下面的表格对比了两种主要的恢复方法:

特性 git reset (彻底回退) git revert (安全撤销)
操作本质 将分支指针强行移动到之前的提交,移除错误合并的提交 新建一个提交,其内容恰好抵消错误合并的更改
历史记录 重写历史,错误合并的提交将从分支历史中消失 追加历史,错误合并的记录依然存在,但新增了撤销它的记录
风险程度 ,特别是强制推送覆盖远程仓库时 ,不改变既有历史
适用场景 错误合并尚未被其他同事在其工作中引用;或个人分支 错误合并可能已被他人拉取;或团队协作的公共分支(如 main
后续推送 需要强制推送 git push -f 只需普通推送 git push

1、使用 git reset (彻底回退)

此方法会丢弃自目标提交之后的所有提交,将分支历史重置到合并前的状态。

  1. 找到合并前的提交
    在终端中执行 git log --oneline,找到合并前 main 分支最新的那个提交的哈希值(例如 5b23503)。记下这个哈希值。

  2. 执行本地重置
    确保你当前在 main 分支上,然后执行重置命令:

    git reset --hard 5b23503
    

    请将 5b23503 替换为你第一步中找到的实际提交哈希。--hard 选项会同时将你的工作目录和暂存区恢复到该提交点的状态。

  3. 强制推送到远程仓库
    由于你本地的历史已经改变,必须使用强制推送来覆盖远程仓库的 main 分支:

    git push -f origin main
    

    ⚠️ :此操作会覆盖远程历史

2、使用 git revert (安全撤销)

此方法通过创建一个新的提交来撤销之前错误合并的所有更改,是更安全的选择,尤其适用于团队协作的环境。

  1. 找到要撤销的合并提交
    执行 git log --oneline,找到代表错误合并的那个提交的哈希值(例如 a1daaad)。

  2. 执行撤销操作
    确保你当前在 main 分支上,然后执行撤销命令:

    git revert -m 1 a1daaad
    

    请将 a1daaad 替换为实际的错误合并提交哈希。

    • -m 1 选项是必须的,它告诉 Git 你希望保留在合并操作中主线(通常是 main 分支)的更改状态。
    • 执行后 Git 会打开默认编辑器让你编辑撤销提交的信息,保存并退出即可。
  3. 推送到远程仓库
    由于 revert 是添加新的提交,所以只需要常规推送即可:

    git push origin main
    

补充:

正常公司项目为protected,不允许强制推送,需把下图开关打开:
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐