×−+
检查点与回退第 3 课 · Claude Code 教程
第 3 课 · CHECKPOINTS

检查点:
改坏了也能退回去

你每发一条消息,Claude Code 都会先自动存一个档。Claude 改错了、方向走偏了,按两下 Esc,就能回到任意一条消息之前,代码和对话都可以一起退回去。

约 35 分钟 11 节 · 7 个动手练习 章末测验 改编自 luongnv89/claude-howto(MIT)
点一个存档点试试
入门先用起来 原理弄懂为什么 实战动手练 深入进阶与避坑

时间紧就先看"入门"和"实战";"原理"讲清楚哪些改动退不回去,这决定了你敢不敢放心让 Claude 大胆改。

01入门

什么是检查点?

就像游戏的自动存档:你不用记得保存,它在每个关键时刻替你存好了。

让 Claude 改代码,难免有改坏的时候:重构把别的功能弄坏了,或者试了一个方案才发现走不通。没有检查点,你只能让 Claude 再改回去,或者自己一个个文件去翻。

有了检查点,你发出的每条消息都是一个存档点。Claude Code 会在这条消息开始处理之前,记下当时的状态。之后不管 Claude 改了多少文件,你都能回到那一刻。

存档里有什么存档里没有什么
那一刻之前的对话Claude 用 Bash 命令改的文件(rm、mv、pnpm add……)
Claude 用编辑工具改过的文件,改之前的样子你自己在编辑器里改的文件
Claude 新建了哪些文件(恢复时会把它们删掉)子代理改的文件(大多数情况)

右边那一列很重要,第 6 节专门讲。先记住一句话:检查点只管 Claude 用编辑工具改的文件。

不需要任何设置

检查点默认就是开着的,你什么都不用做。本课要学的,是怎么退回去,以及什么情况下退不回去。

02入门

打开回退菜单

两种方法:输入 /rewind,或者在输入框为空时连按两下 Esc。

  • /rewind:最直接。它还有两个别名 /checkpoint 和 /undo,效果一样。
  • 连按两下 Esc:更快,但有个前提:输入框必须是空的。输入框里有字时,双击 Esc 会先把字清掉;清掉的内容存进了输入历史,按 ↑ 能找回来。

试一试

点进下面的输入框,快速按两下 Esc。手机上没有 Esc 键,就连点两下"按 Esc"按钮。

my-app — claude
>
03入门

先选消息,再选怎么退

回退菜单分两步:先选回到哪条消息之前,再选退回什么。对话和代码是两条独立的线,可以一起退,也可以只退一条。

菜单里列出了这次对话中你发过的每条消息。选中一条后,会出现下面这些选项。点菜单里的选项,看对话和代码两条线怎么变:

/rewind
你选中了第 3 条消息 「换成内存缓存」,也就是回到它发出之前
对话
代码
输入框
  • 选项是英文的,第 8 节的沙盒里会反复用到,前三个一定要分清:代码和对话一起退、只退对话、只退代码。
  • 恢复对话、或者选"从这里压缩"之后,你当时发的那条消息会放回输入框,可以改一改再发。
  • 如果选中的消息之后,Claude 没有用编辑工具改过任何文件,菜单里就不会出现两个恢复代码的选项,因为没有可退的代码。
"压缩"和 /compact 有什么不同?

/compact 把整段对话压成摘要;这里的两个 Summarize 只压你指定的那一段,另一段原样保留,更精准。这两个 Summarize 选项都不改硬盘上的文件,原始消息也还留在会话记录里,Claude 需要时仍能查到细节。

04入门

练一练:这时候该选哪个?

每个场景选一个最合适的做法。

05原理

什么时候存档,存了什么

存档发生在"你发消息"的那一刻;文件备份发生在"Claude 动手改之前"的那一刻。

拿一轮对话来看。你发出一条消息,Claude 连着做了好几件事:

你给商品列表接口加 Redis 缓存存档 ①
ClaudeRead src/api/products.ts只读,不用备份
ClaudeEdit src/api/products.ts改之前先备份
ClaudeWrite src/cache/redis.ts(新文件)记下"原来没有"
ClaudeBash rm src/cache/legacy.ts不备份
你(Claude 还在干活时插了一句)顺便加个日志不单独存档
你跑一下测试存档 ②
  • 每条开启新一轮的消息,都会生成一个检查点。Claude 工作时你插进去的话,如果并入了当前这一轮,就不单独存档,回退菜单里也看不到它。
  • 文件是改之前备份的。Claude 用编辑工具(Edit、Write 等)碰一个文件之前,先存一份原样;新建的文件记下"原来没有",恢复时会被删掉。
  • Bash 命令改的文件没有备份。Claude Code 不知道一条命令会动哪些文件,所以没法替你留底。

存档能留多久

规则意思
每个会话最多 100 个一段对话里只保留最近 100 个检查点的文件备份,更早的会被清掉
跟着会话一起保存关掉终端、第二天用 /resume 回到这段对话,照样能 /rewind
大约 30 天后清理会话最后一次存备份约 30 天后,备份文件会被自动删除。天数由设置 cleanupPeriodDays 控制
存在你的电脑上~/.claude/file-history/<会话 id>/,不上传、不同步
06原理

哪些改动退不回去

检查点只认 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

检查点是"会话里的后悔药":快、自动,但只在你的电脑上、只保留一段时间、还有管不到的地方。要长期保存、要和同事协作,还是得 git commit。

07原理

检查点、git、/branch、/clear 怎么分工

四样东西都和"回到之前"有关,但管的范围完全不同。

管什么能退回代码吗保存多久什么时候用
检查点
/rewind
这次会话的对话 + Claude 编辑过的文件能(Bash、子代理改的等除外,见第 6 节)约 30 天刚刚走错了一步,马上退回
git整个项目的所有文件能,任何改动永久,可以推送给同事一个阶段做完了,存个正式版本
/branch复制一份对话,切过去接着聊不能,它不碰文件和普通会话一样想试另一条路,又想保留现在这条
/clear开始一段新对话不能旧对话还能 /resume换一个不相关的新任务

放心让 Claude 大胆试:四步

先提交开始大改之前 git commit,留一个干净的起点
放手让它改每条消息都会自动存档
不对就退/rewind 退回;Bash 改的用 git 恢复
满意再提交这一步做对了,再 git commit
/clear 之后还能退回去吗?

可以。在同一个 Claude Code 进程里 /clear 过,回退菜单最上面会多一条 /resume <会话 id> (previous session),选它就回到清空之前的那段对话(v2.1.191 起)。退出 Claude Code,或者用 /resume 切到别的会话之后,这一条就没了。这时用 /resume 从列表里找。

08实战

回退沙盒:亲手退一次

下面这段对话已经进行了 5 轮,中间有两轮用了 Bash 命令。在菜单里选一条消息、再选一个选项,面板里会显示退完之后的样子。

my-app — /rewind
对话
文件现在 → 退完之后
输入框

菜单和提示文字是示意;哪些文件能退、哪些退不了,与真实的 Claude Code 一致。

值得试的几种组合

① 选第 1 条 + Restore code:看看 package.json 和 legacy.ts 为什么没回来。② 选第 5 条:菜单里为什么只剩四个选项?③ 选第 3 条 + Summarize up to here:输入框为什么是空的?

09实战

终端演练:换一条路重来

Redis 缓存测试跑不通,退回去改用内存缓存。点"下一步"回放,放完可以自己输入。

my-app — claude — 90×28
>

终端画面为教学示意,与真实 Claude Code 的界面细节可能略有不同,但回退的工作方式一致。

10深入

进阶与避坑

回退失败、存档不见了、想指定摘要重点……这些情况怎么处理。

提示 "No files were restored"
一个文件都没恢复。最常见的原因是备份已经被清理了:会话最后一次存备份大约 30 天后,备份会被删掉,但菜单里还能看到那些消息。再点一次也一样会失败。补救:让 Claude 把改动反向改回去,或者用 git 恢复。以后想留久一点,把 cleanupPeriodDays 调大(最小 1,不能设 0;想长期保留就设成 3650 这类大数)。
提示 "Restored the code, but skipped N files"
代码恢复了,但有 N 个文件被跳过、保持原样。原因可能是:这个路径是(或变成了)软链接、硬链接;它所在的目录在存档之后变了;或者备份读不出来。想知道是哪几个文件,先输入 /debug 打开调试日志,再恢复一次,日志 ~/.claude/debug/<会话 id>.txt 里会列出路径。不是你自己建的链接要小心:说明存档之后有东西替换了这个文件,先检查内容再用。
压缩的时候,能指定摘要的重点吗?
可以。用方向键移到某个 Summarize 选项上(先别按回车),在显示 add context (optional) 的那一行输入你的要求,比如"保留所有报错信息",再按 Enter。如果直接按选项前面的数字键,会立刻压缩,不带任何要求。
想同时保留两种方案,方便对比
/rewind 退回去就回不来了。想两条路都留着,用 /branch 名字:它复制一份当前对话并切过去,原来的对话原封不动,用 /resume 能切回去。命令行里对应的是 claude --continue --fork-session。注意 /branch 只分对话,不分文件,两边改的是同一份代码;要连文件都隔离开,得用 worktree(第 9B 课)。
Claude 干活时我插了一句话,想撤回这句之后的改动
插进当前这一轮的话不单独存档,回退菜单里也找不到它。只能回退到开启这一轮的那条消息,整轮一起撤掉,包括你插话之前 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 课详细讲。
老教程说菜单里能看到时间、改了哪些文件
官方文档只写了菜单列出你在这次会话里发过的每条消息,没提时间和文件列表,不同版本的界面也可能不一样。不管显示什么,你主要还是靠消息内容认"回到哪里",所以给 Claude 下指令时一句话讲一件事,以后回退也更好找。
11检验

小测验

8 道题,每题选完会立刻看到解析。