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
相关产品推荐
相关产品推荐

