检查点:
改坏了也能退回去
你每发一条消息,Claude Code 都会先自动存一个档。Claude 改错了、方向走偏了,按两下 Esc,就能回到任意一条消息之前,代码和对话都可以一起退回去。
时间紧就先看"入门"和"实战";"原理"讲清楚哪些改动退不回去,这决定了你敢不敢放心让 Claude 大胆改。
什么是检查点?
就像游戏的自动存档:你不用记得保存,它在每个关键时刻替你存好了。
让 Claude 改代码,难免有改坏的时候:重构把别的功能弄坏了,或者试了一个方案才发现走不通。没有检查点,你只能让 Claude 再改回去,或者自己一个个文件去翻。
有了检查点,你发出的每条消息都是一个存档点。Claude Code 会在这条消息开始处理之前,记下当时的状态。之后不管 Claude 改了多少文件,你都能回到那一刻。
| 存档里有什么 | 存档里没有什么 |
|---|---|
| 那一刻之前的对话 | Claude 用 Bash 命令改的文件(rm、mv、pnpm add……) |
| Claude 用编辑工具改过的文件,改之前的样子 | 你自己在编辑器里改的文件 |
| Claude 新建了哪些文件(恢复时会把它们删掉) | 子代理改的文件(大多数情况) |
右边那一列很重要,第 6 节专门讲。先记住一句话:检查点只管 Claude 用编辑工具改的文件。
检查点默认就是开着的,你什么都不用做。本课要学的,是怎么退回去,以及什么情况下退不回去。
打开回退菜单
两种方法:输入 /rewind,或者在输入框为空时连按两下 Esc。
/rewind:最直接。它还有两个别名/checkpoint和/undo,效果一样。- 连按两下 Esc:更快,但有个前提:输入框必须是空的。输入框里有字时,双击 Esc 会先把字清掉;清掉的内容存进了输入历史,按 ↑ 能找回来。
试一试
点进下面的输入框,快速按两下 Esc。手机上没有 Esc 键,就连点两下"按 Esc"按钮。
先选消息,再选怎么退
回退菜单分两步:先选回到哪条消息之前,再选退回什么。对话和代码是两条独立的线,可以一起退,也可以只退一条。
菜单里列出了这次对话中你发过的每条消息。选中一条后,会出现下面这些选项。点菜单里的选项,看对话和代码两条线怎么变:
你选中了第 3 条消息 「换成内存缓存」,也就是回到它发出之前
- 选项是英文的,第 8 节的沙盒里会反复用到,前三个一定要分清:代码和对话一起退、只退对话、只退代码。
- 恢复对话、或者选"从这里压缩"之后,你当时发的那条消息会放回输入框,可以改一改再发。
- 如果选中的消息之后,Claude 没有用编辑工具改过任何文件,菜单里就不会出现两个恢复代码的选项,因为没有可退的代码。
/compact 把整段对话压成摘要;这里的两个 Summarize 只压你指定的那一段,另一段原样保留,更精准。这两个 Summarize 选项都不改硬盘上的文件,原始消息也还留在会话记录里,Claude 需要时仍能查到细节。
练一练:这时候该选哪个?
每个场景选一个最合适的做法。
什么时候存档,存了什么
存档发生在"你发消息"的那一刻;文件备份发生在"Claude 动手改之前"的那一刻。
拿一轮对话来看。你发出一条消息,Claude 连着做了好几件事:
src/api/products.ts只读,不用备份src/api/products.ts改之前先备份src/cache/redis.ts(新文件)记下"原来没有"rm src/cache/legacy.ts不备份- 每条开启新一轮的消息,都会生成一个检查点。Claude 工作时你插进去的话,如果并入了当前这一轮,就不单独存档,回退菜单里也看不到它。
- 文件是改之前备份的。Claude 用编辑工具(Edit、Write 等)碰一个文件之前,先存一份原样;新建的文件记下"原来没有",恢复时会被删掉。
- Bash 命令改的文件没有备份。Claude Code 不知道一条命令会动哪些文件,所以没法替你留底。
存档能留多久
| 规则 | 意思 |
|---|---|
| 每个会话最多 100 个 | 一段对话里只保留最近 100 个检查点的文件备份,更早的会被清掉 |
| 跟着会话一起保存 | 关掉终端、第二天用 /resume 回到这段对话,照样能 /rewind |
| 大约 30 天后清理 | 会话最后一次存备份约 30 天后,备份文件会被自动删除。天数由设置 cleanupPeriodDays 控制 |
| 存在你的电脑上 | ~/.claude/file-history/<会话 id>/,不上传、不同步 |
哪些改动退不回去
检查点只认 Claude 在这次会话里用编辑工具做的改动。下面这几种,它管不到。
| 情况 | 为什么退不回去 | 怎么补救 |
|---|---|---|
Bash 命令rm mv cp pnpm add | 命令改了哪些文件,Claude Code 事先不知道,没有备份 | 用 git 找回,或让 Claude 反向操作 |
| 你自己改的,或另一个会话改的 | 检查点只追踪本次会话里 Claude 编辑过的文件。反过来要小心:你改的如果正好是 Claude 这次也改过的文件,Restore code 会把整个文件退回存档时的样子,你手改的内容也一起没了 | git;编辑器自己的撤销 |
| 子代理改的(第 8 课) | 子代理的改动一般不进你的检查点。例外是在前台运行的 context: fork 技能(设了 background: false 的,第 5 课) | git |
| 软链接、硬链接的文件 | 为了安全,恢复时会跳过它们,并提示跳过了几个。pnpm 装进项目的文件、dotfile 管理器链接进来的配置都属于这类 | 让 Claude 改回来,或手动改 |
练一练:退得回去吗?
假设你选了 Restore code,下面这些改动能不能被撤回?
检查点是"会话里的后悔药":快、自动,但只在你的电脑上、只保留一段时间、还有管不到的地方。要长期保存、要和同事协作,还是得 git commit。
检查点、git、/branch、/clear 怎么分工
四样东西都和"回到之前"有关,但管的范围完全不同。
| 管什么 | 能退回代码吗 | 保存多久 | 什么时候用 | |
|---|---|---|---|---|
检查点/rewind | 这次会话的对话 + Claude 编辑过的文件 | 能(Bash、子代理改的等除外,见第 6 节) | 约 30 天 | 刚刚走错了一步,马上退回 |
| git | 整个项目的所有文件 | 能,任何改动 | 永久,可以推送给同事 | 一个阶段做完了,存个正式版本 |
/branch | 复制一份对话,切过去接着聊 | 不能,它不碰文件 | 和普通会话一样 | 想试另一条路,又想保留现在这条 |
/clear | 开始一段新对话 | 不能 | 旧对话还能 /resume | 换一个不相关的新任务 |
放心让 Claude 大胆试:四步
git commit,留一个干净的起点/rewind 退回;Bash 改的用 git 恢复git commit可以。在同一个 Claude Code 进程里 /clear 过,回退菜单最上面会多一条 /resume <会话 id> (previous session),选它就回到清空之前的那段对话(v2.1.191 起)。退出 Claude Code,或者用 /resume 切到别的会话之后,这一条就没了。这时用 /resume 从列表里找。
回退沙盒:亲手退一次
下面这段对话已经进行了 5 轮,中间有两轮用了 Bash 命令。在菜单里选一条消息、再选一个选项,面板里会显示退完之后的样子。
对话
文件现在 → 退完之后
菜单和提示文字是示意;哪些文件能退、哪些退不了,与真实的 Claude Code 一致。
① 选第 1 条 + Restore code:看看 package.json 和 legacy.ts 为什么没回来。② 选第 5 条:菜单里为什么只剩四个选项?③ 选第 3 条 + Summarize up to here:输入框为什么是空的?
终端演练:换一条路重来
Redis 缓存测试跑不通,退回去改用内存缓存。点"下一步"回放,放完可以自己输入。
终端画面为教学示意,与真实 Claude Code 的界面细节可能略有不同,但回退的工作方式一致。
进阶与避坑
回退失败、存档不见了、想指定摘要重点……这些情况怎么处理。
提示 "No files were restored"
cleanupPeriodDays 调大(最小 1,不能设 0;想长期保留就设成 3650 这类大数)。提示 "Restored the code, but skipped N files"
/debug 打开调试日志,再恢复一次,日志 ~/.claude/debug/<会话 id>.txt 里会列出路径。不是你自己建的链接要小心:说明存档之后有东西替换了这个文件,先检查内容再用。压缩的时候,能指定摘要的重点吗?
想同时保留两种方案,方便对比
/rewind 退回去就回不来了。想两条路都留着,用 /branch 名字:它复制一份当前对话并切过去,原来的对话原封不动,用 /resume 能切回去。命令行里对应的是 claude --continue --fork-session。注意 /branch 只分对话,不分文件,两边改的是同一份代码;要连文件都隔离开,得用 worktree(第 9B 课)。Claude 干活时我插了一句话,想撤回这句之后的改动
想关掉检查点
/config 里关掉 Rewind code (checkpoints),等于在设置里写 "fileCheckpointingEnabled": false。只想关这一次,启动前设置环境变量 CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING=1。关掉后 /rewind 还能回退对话,但恢复不了代码。一般没必要关。用 claude -p 跑脚本时,有检查点吗?
-p 模式也不看 fileCheckpointingEnabled 这个设置。需要的话设置环境变量 CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING=true;用 Agent SDK 写程序时,对应的是 enableFileCheckpointing 选项。-p 模式在第 4 课详细讲。老教程说菜单里能看到时间、改了哪些文件
小测验
8 道题,每题选完会立刻看到解析。
