Claude Code 学习站

会话恢复与时光机

检查点 + 会话两层原语搭起 Claude Code 的时光机:在会话内 /rewind 倒回代码与对话,跨会话 --continue / --resume 续接,--fork-session 并行试不同方案。

为什么需要时光机

让 Claude 改一个跨十几个文件的功能,中途某条 prompt 把代码改崩、或把对话带跑偏,是常态。没有"时光机"时,你只能手动 git checkout 一堆文件,或从头来过。

Claude Code 把"回到过去"拆成两层原语,搭起来用:

  1. 检查点(checkpoint):每条 prompt 执行前自动给文件打快照,用 /rewind当前会话内回滚代码 / 对话。
  2. 会话(session):每条对话连续存盘,用 --continue / --resume 跨天续接,用 --fork-session 并行试另一条路。

检查点是"会话级本地撤销",Git 是"永久历史"——两者互补,不互相替代。


怎么用(最简调用)

会话内回滚:输入框为空时连按两次 Esc,或直接敲命令。

/rewind

跨天续接上一次工作:

claude --continue          # 恢复当前目录最近一次会话
claude --resume            # 打开会话选择器,手动挑一个

就这两个入口。下面是真实场景。


自动检查点:每条 prompt 前打快照

你不用做任何配置。每次发送一条 prompt,Claude Code 会在执行前对当前文件状态打一个快照——这就是检查点。它只追踪 Claude 通过文件编辑工具(Edit / Write)做的改动:

| 改动来源 | 被检查点追踪? | /rewind 能回滚? | | --- | --- | --- | | Claude 用 Edit / Write 改文件 | 是 | 能 | | Claude 用 Bashsed -i> 重定向、rm/mv | 否 | 不能 | | 你在外部编辑器手改 / 别的并发会话写入 | 通常否 | 通常不能 |

检查点跨会话持久化,/resume 旧会话后仍然可用;默认随会话保留 30 天(由 settings.jsoncleanupPeriodDays 配置)。


改崩了:/rewind 或 Esc Esc 倒回代码 / 对话

场景:第 4 条 prompt 引入了 bug,想退回第 3 条之前

测试本来是绿的,让 Claude 又改了一轮后开始报错。打开检查点菜单:

/rewind

或在输入框为空时连按 Esc Esc。菜单列出本次会话发过的每一条 prompt,选中出问题的那条,从这几个动作里挑一个:

| 动作 | 效果 | | --- | --- | | Restore code and conversation | 代码和对话同时回滚到该节点 | | Restore conversation | 只回滚对话,磁盘文件保持现状 | | Restore code | 只回滚文件,对话保持现状 | | Summarize from here | 把该节点及之后压缩成摘要,释放 context | | Summarize up to here | 把该节点之前压缩成摘要,保留后半段 | | Never mind | 什么都不做,返回列表 |

想"一键回到干净状态"就选 Restore code and conversation。执行 Restore conversation 后,被选中节点的原始 prompt 会自动填回输入框,改一改就能重发。

提示:输入框里有文字时,双击 Esc清空输入框而不是开菜单(被清空的文字进输入历史,按 Up 可召回)。要么先清空再双击,要么直接敲 /rewind

场景:误按 /clear 想找回对话(v2.1.191+)

不小心 /clear 清空了上下文,只要还在同一个 Claude Code 进程里,/rewind 菜单顶部会多出一条 /resume <session-id> (previous session),选它就能恢复清空前的对话。旧版本则改用 /resume 在列表里挑上一条会话。


真实陷阱:bash 改的文件不被追踪、不是 Git 替代

这是最容易踩的坑。同样是"把 foo 改成 bar":

> 用 Edit 工具把 config.ts 里的 foo 改成 bar

这条 /rewind 能回滚。但下面这条回不去:

sed -i 's/foo/bar/' config.ts     # 绕过了编辑工具层,检查点抓不到

rmmvcp> 重定向同理。所以:让 Claude 改文件时尽量走 Edit / Write 而不是 sed -i / 重定向,/rewind 才兜得住;任务里有破坏性 shell 操作(删目录、批量 mv)前,先手动 git commit 做一个真正的安全点——检查点是"local undo",Git 才是"permanent history"。

git add -A && git commit -m "wip: 安全点,准备大改"   # 破坏性操作前的真护栏

并行试另一条路:--fork-session / /branch

/rewind 是在一条时间线上退回;有时你想保留原路、另开一条岔路试不同方案,这时用分支(branch / fork)。

会话内分支,原会话原封不动:

/branch try-streaming-approach

命令行分支,从最近会话或指定会话派生出一份副本:

claude --continue --fork-session     # 基于最近会话开分支
claude --resume auth-refactor --fork-session

原会话保持完整,仍在选择器里。/branch 会打印两个 session ID:当前所在的新分支、以及原始会话——想回原会话就把它的 ID 喂给 /resume。分支会被归到根会话下,在选择器里成组显示,按 展开。

注意:用"allow for this session"批准过的权限不会带到新分支。另外,在两个终端里 /resume 同一条会话却不 fork,两边消息会交织进同一个 transcript——想并行就用 /branch--fork-session


上下文满了:/compact 压缩

长会话上下文塞满后,不用清空重来,/compact 把历史替换成一段摘要:

/compact
/compact 重点保留数据库 schema 的决策和未完成的 TODO

带参数时可以指定摘要重点关注什么。相关的还有:

/clear      # 清空上下文从零开始(原对话已存盘,可 /resume 找回)
/context    # 看当前什么在占用 context

/compact 压缩整段对话;如果只想压缩某一半,用 /rewindSummarize from here / Summarize up to here——那是定向版的 /compact。两者都只压缩对话,不回滚任何代码文件


跨天续接:--continue / --resume / --from-pr

会话连续存盘在 ~/.claude/projects/<project>/<session-id>.jsonl,关掉终端也不会丢。第二天回来:

| 命令 | 作用 | | --- | --- | | claude --continue | 恢复当前目录最近一次会话 | | claude --resume | 打开会话选择器,自己挑 | | claude --resume <name> | 按名称直接恢复 | | claude --from-pr <number> | 恢复与某个 Pull Request 关联的会话 | | /resume(会话内) | 不退出当前会话,切到另一条 |

为了日后好找,给会话起名——启动时用 claude -n auth-refactor,会话中用 /rename auth-refactor 动态重命名。

组合流:先选对会话,再退到对的时间点

--resume 解决"换哪一条会话",/rewind 解决"在这条会话里退到哪个时刻",最常见的是配合使用:先 claude --resume auth-refactor 把昨天那条会话切回来,进去发现最后几轮改崩了,再 /rewind 回滚到改崩前的检查点。

排错:claude --resume <session-id> 必须在会话创建时所在的目录执行,否则报 No conversation found with session ID: <session-id>——ID 查找按项目目录隔离。claude -p(headless)产生的会话不进选择器,但能凭 session ID 用 --resume 找回。


回到 示例列表 →