ClawSkills logoClawSkills

Unfuck My Git State

通过分阶段的低风险恢复流程诊断并恢复损坏的 Git 状态和工作树元数据。当 Git 报告分离或矛盾的 HEAD 状态、ph

介绍

# unfuck-my-git-state

在不扩大影响范围的情况下恢复代码仓库。

## 核心规则

1. 先做快照。不要“随便试试”。 2. 在执行强制操作之前,优先选择非破坏性修复。 3. 在备份之前,将 `.git/` 视为生产数据。 4. 在手动编辑 `.git/HEAD` 之前使用 `git symbolic-ref`。 5. 每次修复后,在继续操作前运行验证。

## 快速工作流

1. 捕获诊断信息: ```bash bash scripts/snapshot_git_state.sh . ``` 2. 使用 `references/symptom-map.md` 根据症状进行路由。 3. 生成非破坏性命令计划: ```bash bash scripts/guided_repair_plan.sh --repo . ``` 4. 应用匹配度最小的操作手册。 5. 运行 `references/recovery-checklist.md` 验证关卡。 6. 仅当验证失败时才进行升级处理。

用于显式路由: ```bash bash scripts/guided_repair_plan.sh --list bash scripts/guided_repair_plan.sh --symptom phantom-branch-lock ```

## 回归测试套件

在更改脚本逻辑之前,使用一次性模拟测试:

```bash bash scripts/regression_harness.sh ```

运行一个场景:

```bash bash scripts/regression_harness.sh --scenario orphaned-worktree ```

## 操作手册 A:孤立的工作区元数据

症状: - `git worktree list` 显示了一个不存在的路径。 - 工作区条目包含无效或哈希为零的内容。

步骤: ```bash git worktree list --porcelain git worktree prune -v git worktree list --porcelain ``` 如果仍有陈旧条目,请备份 `.git/` 并删除 `.git/worktrees/<name>` 下的特定陈旧文件夹,然后重新运行 prune 命令。

## 操作手册 B:幽灵分支锁定

症状: - `git branch -d` 或 `git branch -D` 失败,提示“已被 worktree 使用”。 - `git worktree list` 似乎与分支归属不一致。

步骤: ```bash git worktree list --porcelain ``` 找到使用该分支的工作区,将那个工作区切换到另一个分支或在此处分离 HEAD,然后在主仓库中重试分支操作。

## 操作手册 C:分离或矛盾的 HEAD

症状: - `git status` 意外地提示分离的 HEAD (detached HEAD)。 - `git branch --show-current` 和 `git symbolic-ref -q HEAD` 的结果不一致。

步骤: ```bash git symbolic-ref -q HEAD || true git reflog --date=iso -n 20 git switch <known-good-branch> ``` 如果分支上下文未知,请从当前提交创建一个救援分支: ```bash git switch -c rescue/$(date +%Y%m%d-%H%M%S) ``` 然后在调查后重新连接到预期的分支。

## 操作手册 D:丢失或损坏的引用 (Refs)

症状: - `unknown revision`(未知修订)、`not a valid object name`(不是有效的对象名)或 `cannot lock ref`(无法锁定引用)。

步骤: ```bash git fetch --all --prune git show-ref --verify refs/remotes/origin/<branch> git branch -f <branch> origin/<branch> git switch <branch> ``` 在强制移动分支指针之前,使用 `reflog` 恢复仅本地的提交。

## 最后手段:手动修复 HEAD

仅在备份 `.git/` 之后执行。

首选方式: ```bash git show-ref --verify refs/heads/<branch> git symbolic-ref HEAD refs/heads/<branch> ``` 当无法使用 `symbolic-ref` 时的后备方案: ```bash 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` 没有新的关键错误。

## 升级路径

1. 归档 `.git`: ```bash tar -czf git-metadata-backup-$(date +%Y%m%d-%H%M%S).tar.gz .git ``` 2. 从远程重新克隆。 3. 使用 reflog 和从旧克隆中 cherry-pick 来恢复未推送的工作。 4. 记录失败模式并向自动化流程添加防护措施。

## 自动化钩子

在构建工作区工具(iMi、脚本、机器人)时,强制执行: - 预检快照和状态验证 - 操作后验证关卡 - 在 HEAD/引用不一致时强制停止 - 在执行破坏性命令前需要用户明确确认

## 资源

- 症状路由器:`references/symptom-map.md` - 验证检查清单:`references/recovery-checklist.md` - 诊断快照脚本:`scripts/snapshot_git_state.sh` - 引导式计划生成器:`scripts/guided_repair_plan.sh` - 一次性回归测试套件:`scripts/regression_harness.sh`

更多产品