You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gerrit使用-f强制推送后部分提交丢失,如何恢复缺失的提交记录?

Gerrit 强制推送后丢失提交的恢复方案

前置说明

你执行git filter-branch重写了所有提交的哈希值,随后git push --force --all直接用重写后的分支覆盖了远程所有分支,才会导致原有提交丢失。只要原提交未被Git垃圾回收,均可通过以下方案恢复。

方案1:本地仍保留执行filter-branch前的项目克隆(恢复最快)

  • 进入未执行过filter操作的本地项目仓库目录
  • 执行git reflog查看仓库操作历史,找到执行filter-branch之前master分支对应的提交哈希,一般对应HEAD@{n}: commit: [提交说明]格式的条目
  • 执行git reset --hard <原master提交哈希>,将本地master分支恢复到强制推送前的正常状态
  • 确认本地提交记录完整后,执行git push origin master --force,用正常的本地分支覆盖有问题的远程分支
  • 其余分支如有丢失,按照相同逻辑找到对应分支的原哈希,恢复后推送即可

方案2:本地无原有克隆,从Gerrit端恢复

  • Gerrit默认会保留所有推送过的提交记录,不会立即清理未被分支引用的提交
  • 联系Gerrit项目管理员,或自行登录Gerrit服务器进入对应项目的仓库目录,执行git reflog找到强制推送前master分支对应的提交哈希
  • 管理员可直接在服务器端执行git update-ref refs/heads/master <原master提交哈希>,将远程master分支直接回滚到正常状态
  • 如果你没有服务器权限,先在本地新建项目克隆:git clone <Gerrit项目仓库地址>
  • 拿到管理员提供的原master哈希后,本地执行git fetch origin <原master提交哈希>拉取该提交到本地
  • 执行git checkout -b recover_master FETCH_HEAD,基于该提交新建恢复分支
  • 确认提交记录无误后,执行git push origin recover_master:master --force覆盖有问题的远程master分支

后续操作建议

  • 恢复操作执行前,先通知所有项目成员暂停提交,避免产生额外的提交冲突
  • 后续如需清理仓库大文件,建议使用更安全的git-filter-repo工具,操作前先备份所有分支的当前哈希,仅针对存在大文件的分支做重写,不要直接强制推送所有分支

内容的提问来源于stack exchange,提问作者user4948798

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:06:02