检查点与回溯
- 理解检查点会记录什么——以及它悄悄不会记录什么
- 用两种方式打开回溯菜单,并每次都选对恢复操作
- 区分“恢复”(撤销状态)与“总结”(压缩上下文)
- 清楚知道检查点为何是 Git 的补充而绝不是替代
核心思想
当你放手让 Claude 去做一项雄心勃勃的大范围改动时,最可怕的问题是“如果做到第三处编辑就出错了怎么办?”检查点(Checkpointing) 就是答案:Claude Code 会在你每次发起一轮对话之前自动为你的代码拍下快照,这样你就可以回溯到任何更早的状态,而不必手动去收拾一个做到一半的重构。
可以把它看作针对整个会话的本地撤销——一张安全网,让你可以放心地说“好,试试那个大胆的方案”。
检查点是如何创建的
你不需要创建检查点——它们是自动产生的。
- 每个开启一轮的提示,都会在 Claude 的文件编辑工具运行之前记录下你的代码状态。无需命令,无需配置,没有任何繁琐流程。
- Claude Code 会为一个会话中最近的 100 个检查点保留文件快照。更早的会被丢弃,因此一个很长的会话无法一路回溯到起点。
- 检查点与对话一起保存,所以恢复会话之后你仍然可以运行 /rewind,而不只是在当前活跃的会话中。
- 会话的文件快照会在保留期清理任务中被删除,默认约在该会话最后一次保存快照后的 30 天。回溯到快照已被清除的检查点会失败,并提示“No files were restored”——调高 cleanupPeriodDays 可以让它们保留更久。
打开回溯菜单
有两种进入方式:
- 在提示符处输入这个斜杠命令。始终可用。/checkpoint 和 /undo 是同一条命令的别名,想到哪个名字就用哪个。
- 当提示框为空时,连按两次 Esc 会打开回溯菜单。如果框里有文字,连按两次 Esc 则会清除这些文字(被清除的文字会保存到输入历史中,之后按 ↑ 键即可找回)。
打开回溯菜单
/rewind
- 别名的名字比它的字面意思更亲切:/checkpoint 不会按需拍摄快照(快照是自动的),/undo 也不会自己撤销上一次编辑。三个名字打开的是同一个菜单,你仍然要在其中选择时间点和操作。
菜单会列出本次会话中你发送的每一个提示。选择你想操作的那个时间点,然后选择一个操作。
恢复与总结:关键区别
很多人会在这里搞混。菜单提供两类操作:
- **恢复(Restore)**操作会改变磁盘上和/或对话中的状态——它们是撤销。
- **总结(Summarize)**操作绝不会触碰你的文件——它们把对话压缩以释放上下文窗口空间。
- 恢复 = 撤销(回退代码、对话,或两者)。总结 = 压缩上下文(磁盘上的文件不受影响)。
- 编辑把东西弄坏了,就用恢复。会话变得臃肿但代码没问题,就用总结。
恢复操作
- 把你的文件和聊天历史都回退到所选时间点——干净利落地“回到那一刻”。
- 把聊天回退到那条消息,但保留你当前的代码。适合在不丢失想保留的编辑的前提下重新提问。
- 回退文件改动但保留对话。撤销编辑,保留关于这些编辑的讨论。
两个代码恢复选项只有在所选检查点确实有可回退的已跟踪文件改动时才会出现。如果那个时间点之后没有记录到任何文件编辑,菜单就只提供恢复对话、两个总结选项,以及Never mind(返回消息列表,不做任何更改)。
恢复对话之后(或选择“从此处开始总结”之后),所选消息的原始提示会被放回输入框,方便你重新发送或修改。
总结操作
两者都会把对话的一部分压缩成 AI 生成的摘要——就像一个有针对性的 /compact,由你选择压缩所选消息的哪一侧。
- 所选消息之前的消息保持原样。所选消息及其之后的一切都会变成摘要。适合在保留早期上下文完整细节的同时,丢弃一段旁支讨论。
- 所选消息之前的消息变成摘要;所选消息及其之后的一切保持原样。你仍停留在对话的末尾。适合压缩早期的铺垫闲聊,同时原文保留最近的工作。
无论哪种方式,原始消息都仍保留在会话记录中,所以 Claude 仍能参考其中的细节,并且在被压缩的消息原来的位置会出现一个Summarized conversation标记。若想引导摘要的侧重点,用方向键高亮某个总结选项,在显示为add context (optional) 的那一行输入指示,然后按 Enter——如果直接按数字键选择该选项,则会立即总结,不带任何指示。
完整流程请参阅上下文管理——/rewind 的总结操作是手术刀,而 /compact 是大刷子。
- 总结会让你留在同一个会话中。如果想另开分支尝试不同的方案、同时保持原会话不变,请改用 /branch 或 claude --continue --fork-session。
回溯到 /clear 之前
如果你在同一个 Claude Code 进程中更早运行过 /clear,回溯菜单的顶部会多出一项:/resume <session-id> (previous session)。选择它即可跳回 /clear 之前的那段对话。
检查点的边界——会让你栽跟头的局限
检查点在失灵之前都显得很神奇。这些缺口很重要:
- 跟踪是按文件进行的,只有当 Claude 用它的文件编辑工具编辑过某个文件后,该文件才会进入跟踪。一旦如此,/rewind 也会撤销之后 Bash 命令对同一文件所做的改动——格式化工具或生成器重写一个已被编辑过的文件,是可以回溯的。只有 Bash 碰过的文件不会被跟踪,会保持原样,所以 Claude 从未编辑过、却被 rm 删除的文件需要靠 Git。菜单也反映了这一点:在每个提示下方,它会统计对 Claude 已经编辑过的文件的改动,无论这些改动由什么造成。
- 子代理使用同样的文件工具进行编辑,但你的会话通常不会捕获这些编辑。例外是前台的 fork 技能(context: fork 且 background: false),它在你自己的回合中编辑,可以正常回溯。对于任何其他子代理——包括默认的后台 fork 技能,以及后台运行的 /code-review --fix——回溯只会恢复 Claude 在你的对话中已经编辑过的文件;子代理对其他文件的编辑会保留,因此请用 Git 撤销它们。参见 /docs/claude-code/subagents。
- 你在 Claude Code 之外手动做的编辑,以及其他并发会话所做的编辑,通常不会被记录——除非它们恰好触及了当前会话编辑过的那些文件。
- 你在 Claude 工作期间排队发送、并在当前这一轮内送达的消息,会并入这一轮而不是开启新的一轮,所以它自己没有检查点——回溯菜单会把它标记为“No code restore”。要撤销它之后发生的事情,请回溯到开启这一轮的那个提示,这会回溯整整一轮,包括你的消息到达之前已完成的工作。直接选中这条被标记的消息,仍然可以使用“恢复对话”,你的文件保持原样。
- Claude Code 会把回退后的对话与你发送的下一条提示一起保存——所以如果你在发送之前退出,恢复会话时被回退的消息会重新出现。退出前先给 Claude 发一条提示,恢复才会生效;如果之后想再次去掉回来的消息,运行 /rewind,选择同一条提示,然后选择 Restore conversation。无论哪种情况,你恢复的文件都保持回退后的状态,所以受影响的只有对话。
- 恢复时会跳过任何属于符号链接或硬链接的已跟踪路径,并警告“Restored the code, but skipped N files”;这些文件保持当前内容。dotfile 管理器的符号链接和 pnpm 的硬链接都会碰到这个问题。恢复之前先运行 /debug,调试日志里就会列出被跳过的路径。
- 检查点是快速的本地恢复手段。它们不是提交,不是分支,也无法与团队共享。
检查点 vs. Git:两者并用
它们解决的是不同的问题,所以要搭配使用。
检查点(/rewind) | Git | |
|---|---|---|
| 范围 | 一个会话 | 整个项目历史 |
| 粒度 | 每个开启一轮的提示,自动 | 每次提交,刻意为之 |
| 跟踪 bash 造成的改动? | 仅限 Claude 已编辑过的文件 | 是(一旦暂存/提交) |
| 寿命 | 最近 100 个检查点,会话结束后约 30 天清理 | 永久 |
| 可共享 / 可协作 | 否 | 是 |
| 心智模型 | “本地撤销” | “永久历史” |
- 在冒险的大范围运行之前,先用 Git 提交可工作的状态——那是你持久的底线。
- 用 /rewind 在两次提交之间快速进行会话内恢复,而不会弄脏你的 Git 历史。
- 对于 Claude 从不直接编辑的文件——只有破坏性的 bash(rm/mv)或后台子代理才会碰的那些——请依靠 Git。只有当 Claude 用自己的文件工具编辑过某个文件后,rewind 才会覆盖它。
何时使用
- 尝试一个大胆的实现,如果不喜欢,就把代码和对话恢复到分叉点,再试另一条路。
- 三个提示之前的一次编辑引入了 bug?把代码恢复到它之前,而不是去调试那堆残局。
- 尝试各种变体,始终知道一个已知良好的状态只需一次 /rewind 就能回到。
- 一次冗长的调试岔路耗尽了你的上下文窗口?从中点开始往后总结,同时完整保留你最初的指示。
自测一下
0/3- 检查点是在每个开启一轮的提示之前自动拍下的快照——会话的本地撤销。保留最近 100 个,会话结束后约 30 天清理。
- 用 /rewind(别名:/checkpoint、/undo)或在输入为空时连按两次 Esc 打开回溯菜单;它会列出你发送的每一个提示。
- 恢复操作撤销状态(代码、对话,或两者);总结操作压缩上下文,绝不触碰文件。
- 跟踪是按文件进行的,从 Claude 用文件工具编辑它时开始——此后,即使是对该文件的 Bash 改动也会被回溯。Claude 从未编辑过的文件(仅 bash、外部、并发、大多数子代理改动)不会被跟踪,符号链接或硬链接路径在 restore 时会被跳过。
- 检查点是 Git 的补充,而不是替代:想想“本地撤销”与“永久、可共享的历史”。