名称: 修复 Git 状态
描述: 通过分阶段、低风险的恢复流程,诊断并修复损坏的 Git 状态和工作树元数据。适用于 Git 报告 HEAD 分离或状态矛盾、幽灵工作树锁、孤立工作树条目、引用缺失、全零哈希值,或分支操作失败并出现诸如“已检出”、“未知版本”、“非有效对象名”或“无法锁定引用”等错误的情况。
在不扩大影响范围的前提下恢复仓库。
.git/ 目录视为生产数据。.git/HEAD 之前,优先使用 git symbolic-ref。bash
bash scripts/snapshot_git_state.sh .references/symptom-map.md 中的症状进行路由。bash
bash scripts/guided_repair_plan.sh --repo .references/recovery-checklist.md 中的验证检查点。如需显式路由:
bash scripts/guided_repair_plan.sh --list
bash scripts/guided_repair_plan.sh --symptom phantom-branch-lock
在更改脚本逻辑前,先使用可丢弃的模拟测试:
bash scripts/regression_harness.sh
运行单个场景:
bash scripts/regression_harness.sh --scenario orphaned-worktree
症状:
- git worktree list 显示一个不存在的路径。
- 工作树条目包含无效或全零哈希值。
步骤:
git worktree list --porcelain
git worktree prune -v
git worktree list --porcelain
如果仍有残留条目,请备份 .git/ 目录,然后删除 .git/worktrees/<name> 下特定的残留文件夹,并重新运行 prune。
症状:
- git branch -d 或 git branch -D 失败,提示“已由工作树使用”。
- git worktree list 显示的分支归属信息似乎矛盾。
步骤:
git worktree list --porcelain
找到使用该分支的工作树,在该工作树中切换到另一个分支或分离 HEAD,然后在主仓库中重试分支操作。
症状:
- git status 意外报告 HEAD 处于分离状态。
- git branch --show-current 和 git symbolic-ref -q HEAD 的结果不一致。
步骤:
git symbolic-ref -q HEAD || true
git reflog --date=iso -n 20
git switch <known-good-branch>
如果分支上下文未知,则从当前提交创建一个救援分支:
git switch -c rescue/$(date +%Y%m%d-%H%M%S)
然后在调查后重新连接到目标分支。
症状:
- unknown revision、not a valid object name 或 cannot lock ref。
步骤:
git fetch --all --prune
git show-ref --verify refs/remotes/origin/<branch>
git branch -f <branch> origin/<branch>
git switch <branch>
在强制移动分支指针之前,使用 reflog 恢复仅本地的提交。
仅在对 .git/ 进行备份后使用。
首选方法:
git show-ref --verify refs/heads/<branch>
git symbolic-ref HEAD refs/heads/<branch>
当无法使用 symbolic-ref 时的备选方案:
echo "ref: refs/heads/<branch>" > .git/HEAD
立即运行验证检查点。
运行 references/recovery-checklist.md 中的检查。最低要求:
- git status 正常退出,无致命错误。
- git symbolic-ref -q HEAD 与预期分支匹配。
- git worktree list --porcelain 没有缺失的路径和全零哈希值。
- git fsck --no-reflogs --full 没有新的关键错误。
.git:bash
tar -czf git-metadata-backup-$(date +%Y%m%d-%H%M%S).tar.gz .git在构建工作树工具(iMi、脚本、机器人)时,强制执行:
- 操作前快照和状态验证
- 操作后验证检查点
- 在 HEAD/引用不一致时强制停止
- 在执行破坏性命令前需要明确的用户确认
references/symptom-map.mdreferences/recovery-checklist.mdscripts/snapshot_git_state.shscripts/guided_repair_plan.shscripts/regression_harness.sh