运行以下命令,检查 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:恢复丢失的对象

如果你 必须保留本地改动,可以尝试从远程或备份中恢复。

  1. 查看丢失的 commit 树

    git log --graph --oneline --all
    

    找出 e16e661f... 所属的 commit。

  2. 尝试从远程恢复

    git fetch --all
    git fsck --full
    

    如果远程有完整对象,这一步可能会修复缺失对象。


方法 3:手动删除损坏提交

如果某次提交的树对象永远丢失,Git 无法读取,你可以 回退到之前的可用 commit

# 找出最后一个正常的 commit
git reflog

# 假设正常 commit 是 abc123
git reset --hard abc123

然后重新提交。


4. 预防措施

  1. 定期备份 .git 文件夹

    tar -czf git-backup.tar.gz .git
    
  2. 提交前运行 git fsck 检查完整性

  3. 避免断电或硬盘损坏
    Git 对象文件非常依赖文件系统的完整性。

  4. 使用远程仓库做备份
    多 push 到 GitHub、Gitee 等平台,防止本地仓库损坏。