如何撤销 AI 编程智能体所做的修改
安全地撤销 AI 编程智能体的修改:恢复单个文件、丢弃它留下的未提交改动,或还原它的提交,同时不丢失你自己的工作。
要撤销 AI 编程智能体的修改,先查看改了什么,再用对应的 Git 命令:修改过的文件用 git restore,新文件用 git clean,提交用 git revert。动手之前先用 git stash 保存一份安全副本。Claude Code 自带的 /rewind 也能恢复代码,但它不会记录每一处改动。
本文从你决定放弃这些工作之后讲起;如何审查 AI 编程改动可以帮你做出这个决定。Mono 会显示改了什么,但不会帮你撤销,所以在 Mono 里用的也是同样的命令。
1. 停下智能体,查看改了什么
首先,让智能体停下来。在 Mono 中,智能体工作时,发送按钮会变成取消按钮。在项目文件夹中打开终端,运行:
git status
git log --oneline -5第一条命令列出修改、删除、已暂存和新建的文件。第二条显示最近的提交,包括智能体做的提交。记下哪些改动是你自己的:撤销命令不知道某一行是谁写的。
| 你看到的情况 | 如何撤销 |
|---|---|
| 已修改或已删除的文件,未暂存 | git restore <path> |
| 已暂存的改动 | git restore --staged <path>,然后撤销文件中的修改 |
| 新建的未跟踪文件 | git clean -n <path>,然后 git clean -f <path> |
| 你不想要的提交 | git revert <commit> |
在 Mono 中,“显示变更”列出自上次提交以来修改过的文件和新文件,所以不会显示智能体已经做出的提交。
2. 先保存一份安全副本
restore 和 clean 命令会永久丢弃未提交的工作,所以先把所有内容保存下来:
git stash push --include-untracked -m "before undo"
git stash apply --index第一条命令保存你修改过的文件和新文件,并清理工作区;第二条把它们放回原处,同时保留暂存状态。表面上什么都没变,但 git stash list 里现在多了一份名为“before undo”的副本。
如果撤销过头了,可以用 git restore --source "stash@{0}" <path> 从最新的 stash 中找回某个修改过的文件。
3. 撤销单个文件或其中一部分
选择影响范围最小的命令:
git restore <path>丢弃该文件中未暂存的修改。git restore --staged <path>取消暂存,但保留文件中的修改。git restore -p <path>会逐个询问每一处改动(hunk),适合你和智能体修改了同一个文件的情况。git clean -n <path>列出git clean -f <path>会删除的未跟踪文件。一定要指定路径。
git restore 文档解释了每个选项。
4. 撤销智能体留下的所有未提交改动
如果这些改动都不是你的,可以在项目根目录运行 git restore --staged --worktree . 全部丢弃,再用 git clean -n . 和 git clean -f . 处理新文件。否则就按路径逐个处理。
举个虚构的例子:你让智能体在“tidy-recipes”项目中把 CSS 类 .btn-primary 重命名为 .button-main。在这之前,它已经提交过一次没人要求的锁文件更新。这一次,它在 3 个文件中改了类名,重新格式化了 12 个无关文件,还新建了 styles/tokens.css。与此同时,你手动编辑了 README.md,并且想保留这些修改。
保存安全副本后,恢复智能体改动的文件(这里是 src/ 和 styles/main.css),并删除它新建的文件:
git restore src/ styles/main.css
git clean -n styles/tokens.css
git clean -f styles/tokens.css这里不要用 git restore .:它会把你对 README 的修改也一起丢掉。如果你在 src/ 里也有修改,就逐个写出智能体改动的文件。
现在 git status 只列出 README.md,git diff 也只显示你写的内容。那次锁文件提交仍然存在。
5. 撤销智能体已经做出的提交
git revert 会记录一个新提交,用来抵消之前的某个提交。根据 git revert 文档,它要求工作区是干净的,所以先把你对 README 的修改放到一边:
git stash push -m "readme" README.md
git revert <lockfile commit>
git stash pop使用 git log 中的哈希值,加上 --no-edit 可以跳过提交信息编辑器。git stash pop 会恢复“readme”,并把“before undo”留在列表里。现在 git status 只列出 README.md,git log --oneline 最上面显示的是 Revert "Update lockfile"。
对于已经推送的提交,用 revert 比用 git reset 更稳妥,因为后者会改写别人可能已经拿到的历史。如果 reset 或 rebase 之后某个提交似乎不见了,git reflog 会列出你最近停留过的提交及其哈希值。
6. 使用智能体的检查点,以 Git 兜底
Claude Code 会在每次发出提示前保存一个检查点:运行 /rewind,或在输入框为空时连按两次 Esc,即可恢复代码、对话或两者。它的检查点文档列出了限制:shell 命令造成的改动不会被记录,外部编辑通常也不会被捕获,检查点也不能取代版本控制。能否使用这项功能,还取决于你在哪个应用里运行智能体。
所以要把 Git 作为后备:
- 每个任务开始前先提交或新建分支,这样“上一次提交”就等于“智能体动手之前”。
- 告诉智能体未经询问不要提交,例如写在你的 AGENTS.md 文件里。
- 保持审批开启。Mono 的“YOLO模式”会接受智能体的所有请求,默认是关闭的。请看允许之前要检查什么。
在 Mono 中,项目卡片可以在你电脑上的项目文件夹里打开终端,在手机上也能这样做(见远程编程指南)。Mono 还没有正式推出,你可以加入候补名单。
