Claude Code 给你两层安全网:会话内的 checkpoint(每条 prompt 前自动给文件拍快照,随时 /rewind)和会话间的管理命令(继续、恢复、分支、压缩)。学会这两层,你才敢把大任务放心交出去——因为任何一步都退得回来,任何一天都续得上。
为什么这天学这个
D2 讲过上下文窗口会被聊满,压缩(compaction)是保命手段;D5 讲了动手前先规划。但规划再好,长任务也会中途偏航:改坏了想反悔、想换条思路重试、上下文吃紧要瘦身、今天做不完明天接着做。这些「反悔与续命」的能力全在本课。
它也为后面铺路:D10 Subagents 会再遇到本课的一个限制(子代理的编辑不进 checkpoint),D11 Worktrees 的并行会话则完全建立在你熟练管理单个会话之上。跳过本课,后面每次改砸了你只能手动 git checkout 救火。
概念讲清楚
checkpoint:每条 prompt 前自动打点
官方你每发送一条 prompt,Claude Code 就在执行前自动创建一个 checkpoint,记录当前代码状态;凡是 Claude 用自己的文件编辑工具做的修改都被追踪。快照只保留会话里最近 100 个 checkpoint;checkpoint 随会话一起保存,所以恢复(resume)一个旧会话后仍然可以 /rewind;会话(连同 checkpoint)默认 30 天后删除,可用设置项 cleanupPeriodDays 调整。
本站观点理解它的关键是「两条轨」:一条是会话历史(你和 Claude 说过的话),一条是文件状态(磁盘上的代码)。checkpoint 在每条 prompt 处把两条轨「钉」在一起,rewind 时可以只回退其中一条,也可以两条一起回退:
rewind 菜单:三种回退 + 两种压缩
官方运行 /rewind,或在输入框为空时连按两次 Esc,打开 rewind 菜单(输入框有文字时,双击 Esc 是清空输入;被清掉的文字进了输入历史,按 ↑ 可找回)。菜单列出本会话你发过的每条 prompt,选中一个点后有六个动作:
- Restore code and conversation:代码和对话一起回到该点;
- Restore conversation:只回退对话,保留当前代码;
- Restore code:只回退文件,保留对话;
- Summarize from here:把该点之后的对话压缩成摘要,腾出上下文空间;
- Summarize up to here:把该点之前的对话压缩成摘要,保留之后的消息;
- Never mind:什么都不做,返回列表。
官方两个代码回退选项只在选中的 checkpoint 之后确有被追踪的文件改动时才出现。回退对话或选 Summarize from here 之后,那条 prompt 的原文会回填到输入框,方便你改一改重发。压缩(summarize)不改磁盘文件,原始消息也仍留在会话转录(transcript)里;选中 Summarize 选项时可以在「add context (optional)」处输入指示,引导摘要保留什么。官方把 summarize 定位为「定点的 /compact」——留在原会话里压上下文;想另起炉灶试新思路,应该用 /branch(见下文)。
官方还有一个隐藏入口:如果本次 Claude Code 进程里执行过 /clear,rewind 菜单顶部会多出一行 /resume <session-id> (previous session),选它即可回到 /clear 之前的那个会话(需 v2.1.191+)。
误区澄清:checkpoint 不是 git
本站观点常见误解是「有了 rewind 就不用 git 了」。实际上 checkpoint 只覆盖一类改动:本会话里 Claude 用文件编辑工具做的修改。以下四类它都管不了,判断方法就是问一句「这个改动是 Claude 在本会话里用编辑工具做的吗」:
- 官方bash 命令的改动不追踪:Claude 跑
rm file.txt、mv old.txt new.txt、cp source.txt dest.txt造成的文件变化,rewind 撤不掉; - 官方子代理(subagent)的编辑不回退:除了在前台运行的
context: forkskill,子代理的编辑落在你会话的 checkpoint 之外,得用 git 撤销; - 官方会话外的改动不追踪:你手动改的文件、其他并行会话改的文件,通常不被捕获;
- 官方软链接/硬链接路径不回退:restore 时这些路径会被跳过并提示
Restored the code, but skipped N files(v2.1.216 起有此警告)。
官方官方的定位是:checkpoint 是「本地撤销」(local undo),git 是「永久历史」(permanent history),前者补充而非替代后者。本站观点实用分工:大改动开工前先 git commit 一个干净基线;干活途中用 rewind 快速反悔;收尾满意了再用 git 固化。两者怎么选、什么场景各自兜底,展开见 Tip:改砸了怎么回退——checkpoint 还是 git。
会话生命周期:继续、恢复、fork、压缩
官方会话(session)是绑定项目目录的一段保存的对话,边聊边持续写入本地转录文件(默认在 ~/.claude/projects/<project>/<session-id>.jsonl)。所以退出、断电、/clear 都不丢:
| 命令 | 作用 |
|---|---|
claude --continue | 接着当前目录里最近的一个会话 |
claude --resume | 打开会话选择器(Ctrl+A 看所有项目,Ctrl+W 看所有 worktree,Ctrl+B 按分支过滤,Space 预览) |
claude --resume <name> | 按名字直接恢复;起名用 claude -n <name>、会话内 /rename,或选择器里 Ctrl+R |
claude --from-pr <number> | 选择器只显示与该 PR 关联的会话 |
/resume | 在会话内切换到另一个会话 |
/branch [name] 或 claude --continue --fork-session | 复制当前对话开一条新支线,原会话原封不动 |
官方恢复的会话会带回:完整对话历史(含工具调用)、所用模型、agent 身份、权限模式(但 plan 和 bypassPermissions 永不恢复,后者必须启动时重新显式开启)。注意有些启动配置不会恢复:--mcp-config、--settings、--plugin-dir、--add-dir 等 flag 要在恢复时重新传;写在 settings.json 里的配置则每次启动自动重读,不受影响。
官方/branch 会打印两个 session ID(新支线和原会话),原会话留在选择器里随时可回。因为支线跑在同一个进程里,「本会话允许」的权限授权继续有效,进行中的后台子代理和后台 bash 也继续跑、输出进新支线;用 --fork-session 另开进程则要重新授权。
长任务不丢上下文:三板斧
本站观点把本课工具串成一套工作法,对应三种典型状况:
- 偏航了 →
/rewind选「Restore code and conversation」回到出错前那条 prompt,借助回填的原文改写要求重发; - 上下文吃紧但任务没完(D2 的老问题)→ 用「Summarize from here」定点压缩啰嗦的调试段落,保住开头的任务指令;或直接
/compact [聚焦指示],先用/context看清都是什么在占空间; - 想并行试第二种方案 →
/branch try-b,失败了就/resume回主线,两边互不污染。
官方隔天恢复长会话时(Pro/Max 计划,闲置约一小时以上且超过 100,000 tokens),Claude Code 会先弹一个对话框:「Resume from summary」当场压缩成摘要再继续(之后每次请求便宜但细节有损)、「Resume full session as-is」原样载入(细节全保,每次请求按全量历史计费)、「Don't ask me again」以后不再问。这正是 D2 讲的成本-细节权衡在会话恢复场景的重演。
当天能做完的实操
找一个测试仓库(或 mkdir cc-d6-lab && cd cc-d6-lab && git init),全程约 25 分钟:
- 制造两个 checkpoint:启动
claude,第一条 prompt 让它创建hello.py打印固定文案;第二条让它改成从命令行参数读名字。预期:两轮修改都完成。 - 打开 rewind 菜单:清空输入框后连按两次
Esc(或输入/rewind)。预期:看到你发过的两条 prompt 列表。 - 只回退代码:选中第二条 prompt,选「Restore code」。预期:
hello.py回到第一版,但对话记录原封不动——正好体会「两条轨分开退」。 - 验证盲区:粘贴下面的 prompt,跑完后再 rewind 一次选「Restore code」。预期:
tracked.txt被撤销消失,untracked.txt原地不动——bash 改动不入 checkpoint,眼见为实:
做一个 checkpoint 边界实验,两步分开执行:
1. 用你的文件编辑工具(不要用 bash)创建 tracked.txt,内容写一行 "created by edit tool"。
2. 用 bash 的 echo 命令创建 untracked.txt,内容写一行 "created by bash"。
完成后分别告诉我这两个文件各是用什么方式创建的,不要做其他改动。
- 命名并恢复:执行
/rename d6-lab,退出 Claude Code,再运行claude --resume d6-lab。预期:对话完整回来;再开一次 rewind 菜单,确认恢复后的会话依然能回退(checkpoint 随会话保存)。 - 开一条支线:执行
/branch try-b。预期:打印两个 session ID;在支线里随便聊一句,再用/resume d6-lab回主线,确认主线没被污染。
验收标准
- 能不看笔记说出:checkpoint 什么时候自动打点、保留多少个、随什么一起保存,以及四类 rewind 管不了的改动(bash、子代理、会话外、软/硬链接)。
- 能解释 rewind 菜单三种 Restore 和两种 Summarize 的区别,并说清 Summarize 为什么不动磁盘文件、它和
/compact、/branch各自的适用场景。 - 实操 6 步全部跑通,第 4 步盲区实验的结果与预期一致。
- 自测题:Claude 在会话里先用 bash 跑了
rm data.csv,又用编辑工具改了main.py;你/rewind选「Restore code」后,两个文件各是什么状态?(答案:main.py被还原,data.csv回不来——bash 改动不被追踪,只能靠 git 找回。)