git-undolisted
Install: claude install-skill YuAICode/ai-skills
# git-undo — git 撤销安全向导
把用户用中文描述的"出了什么事",变成**安全的恢复命令 + 清晰解释 + 风险提示**。
能用非破坏性方式就不用破坏性;拿不准意图先问;reflog 是后悔药要善用。
## 何时触发
- 用户说"帮我撤销"、"我 commit 错了"、"怎么恢复"、"误删分支"、"push 错了"、"git 救命"
- 用户说"git 怎么回退"、"我把改动搞丢了"、"想反悔"、"提交错了"
- 用户遇到 git 操作失误,不知道怎么恢复
## 工作流
### 1. 采集当前 git 状态
先跑 state.sh 了解现状,再结合用户描述判断:
```bash
bash <skill>/bin/state.sh
```
state.sh 会输出(纯只读):
- 当前分支名
- `git status -s`(工作区/暂存区状态)
- 最近 5 条 `git log --oneline`
- `git reflog` 最近 10 条
- 上游分支信息(有无、是否领先/落后)
- 是否有未暂存改动、是否有未提交改动
### 2. 确认用户意图(拿不准先问)
读完状态后,**先理解用户想达成什么目标**,再给命令。
常见误解:用户说"撤销 commit"可能是要:
- 保留改动但取消提交(`--soft`)
- 完全丢掉(`--hard`,破坏性)
- 保留提交历史但反转内容(`git revert`)
**意图不明时直接追问,不臆测。**
### 3. 按场景给���全恢复命令
#### 场景 A:误 commit,还没 push
```bash
# 保留改动、取消提交(最安全,推荐)
git reset --soft HEAD~1
# 取消提交并取消暂存(改动还在工作区)
git reset HEAD~1
# ⚠️ 破坏性:取消提交 + 丢弃改动(不可恢复)
git reset --hard HEAD~1
```
> 建议:先问用户是否要保留改动。默认推荐 `--soft`。
#### 场景 B:想丢弃工作区的未提交改动
```bash
# 丢弃单个文件的改动
git restore <file>
# 或(旧版 git)
git checkout -- <file>
# ⚠️ 破坏性:丢弃所有未暂存改动
git restore .
# ⚠️ 破坏性:同时清掉未跟踪文件
git clean -fd
```
> 警告:工作区改动一旦丢弃无法找回,执行前建议 `git stash` 兜底。
#### 场景 C:误执行了 `reset --hard`,想找回丢失的提交
reflog 是后悔药:
```bash
# 1. 查看 reflog 找到误操作前的 SHA
git reflog
# 2. 恢复到那个状态
git reset --hard <sha>
# 或只切到那个提交建新分支
git branch recover-branch <sha>
```
> reflog 默认保留 90 天,所以大部分情况都能找回。
#### 场景 D:push 错了分支
```bash
# 非破坏性(推荐):在目标分支上 revert
git revert <sha>
git push
# ⚠️ 破坏性(需上游配合,有协作者时极危险):
git push --force-with-lease origin <branch>
```
> 强烈建议先用 `revert`。`pus