误删.git/objects/pack后,如何恢复特定分支的Git提交?
针对你遇到的情况,核心是优先抢救目标分支的提交内容,之后重新克隆仓库即可,具体步骤如下:
先尝试获取目标分支的提交哈希:
执行git log --oneline your-target-branch,如果命令能输出部分内容,记下目标提交的哈希值(比如a1b2c3)。如果直接报错,跳过这步,直接看后续方法。尝试导出目标提交的内容:
如果能拿到提交哈希,执行git format-patch -1 a1b2c3生成单个提交的补丁文件,或者用git archive a1b2c3 > target-content.tar把提交的所有文件打包成归档,这两个命令能绕过部分对象损坏问题。
如果git命令报错无法读取对象,手动检查.git/objects下的松散对象:提交哈希的前两位是文件夹名,后38位是文件名(比如哈希a1b2c3d4...对应.git/objects/a1/b2c3d4...),如果这个文件存在,说明提交对象还在;再用git cat-file -p a1b2c3查看提交对应的tree哈希,继续检查tree对象是否存在,递归确认blob对象,能导出多少内容就先保存多少。借助远程仓库抢救:
如果本地残留对象不足以恢复完整提交,新建一个临时文件夹,执行git clone --branch your-target-branch --depth 1 <远程仓库地址> temp-repo,只拉取目标分支的最新提交到临时仓库。之后把临时仓库里的代码文件复制到你需要的地方,或者直接在临时仓库里处理提交内容。收尾操作:
确认拿到目标分支的内容后,直接删除当前损坏的本地仓库,重新克隆完整仓库,再把恢复的内容导入新仓库提交即可。
注意:别再执行git gc、git prune这类清理命令,避免剩余的松散对象被彻底删除;如果有未stash的内容,试试git stash show -p stash@{0}查看补丁内容,手动复制到对应文件里。
内容的提问来源于stack exchange,提问作者Jacks

