运行以下命令,检查 Git 仓库是否损坏:
git fsck --full
可能的输出:
干净:
Checking object directories: 100% (256/256), done.
表示 Git 仓库完整,问题可能是权限或文件系统问题。
有损坏对象:
error: unable to read tree e16e661ff6011eec83cb422aeaf02957602e5547 fatal: object e16e661ff6011eec83cb422aeaf02957602e5547 is missing
如果报错,说明该对象确实丢失了。
修复方法
方法 1:从远程仓库强制同步(最简单)
如果本地改动不重要,直接删除 .git
并重新克隆。
# 备份本地文件(除 .git)
mv .git ../git-backup
# 重新初始化 git
git init
git remote add origin <远程仓库地址>
git fetch --all
git reset --hard origin/main # 或者 master
适合场景:
本地改动少,不介意丢失提交历史。
方法 2:恢复丢失的对象
如果你 必须保留本地改动,可以尝试从远程或备份中恢复。
查看丢失的 commit 树
git log --graph --oneline --all
找出
e16e661f...
所属的 commit。尝试从远程恢复
git fetch --all git fsck --full
如果远程有完整对象,这一步可能会修复缺失对象。
方法 3:手动删除损坏提交
如果某次提交的树对象永远丢失,Git 无法读取,你可以 回退到之前的可用 commit。
# 找出最后一个正常的 commit
git reflog
# 假设正常 commit 是 abc123
git reset --hard abc123
然后重新提交。
4. 预防措施
定期备份
.git
文件夹tar -czf git-backup.tar.gz .git
提交前运行
git fsck
检查完整性避免断电或硬盘损坏
Git 对象文件非常依赖文件系统的完整性。使用远程仓库做备份
多 push 到 GitHub、Gitee 等平台,防止本地仓库损坏。