为什么需要时光机
让 Claude 改一个跨十几个文件的功能,中途某条 prompt 把代码改崩、或把对话带跑偏,是常态。没有"时光机"时,你只能手动 git checkout 一堆文件,或从头来过。
Claude Code 把"回到过去"拆成两层原语,搭起来用:
- 检查点(checkpoint):每条 prompt 执行前自动给文件打快照,用
/rewind在当前会话内回滚代码 / 对话。 - 会话(session):每条对话连续存盘,用
--continue/--resume跨天续接,用--fork-session并行试另一条路。
检查点是"会话级本地撤销",Git 是"永久历史"——两者互补,不互相替代。
怎么用(最简调用)
会话内回滚:输入框为空时连按两次 Esc,或直接敲命令。
/rewind跨天续接上一次工作:
claude --continue # 恢复当前目录最近一次会话
claude --resume # 打开会话选择器,手动挑一个就这两个入口。下面是真实场景。
自动检查点:每条 prompt 前打快照
你不用做任何配置。每次发送一条 prompt,Claude Code 会在执行前对当前文件状态打一个快照——这就是检查点。它只追踪 Claude 通过文件编辑工具(Edit / Write)做的改动:
| 改动来源 | 被检查点追踪? | /rewind 能回滚? |
| --- | --- | --- |
| Claude 用 Edit / Write 改文件 | 是 | 能 |
| Claude 用 Bash 跑 sed -i、> 重定向、rm/mv | 否 | 不能 |
| 你在外部编辑器手改 / 别的并发会话写入 | 通常否 | 通常不能 |
检查点跨会话持久化,/resume 旧会话后仍然可用;默认随会话保留 30 天(由 settings.json 的 cleanupPeriodDays 配置)。
改崩了:/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 # 绕过了编辑工具层,检查点抓不到rm、mv、cp、> 重定向同理。所以:让 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 压缩整段对话;如果只想压缩某一半,用 /rewind 的 Summarize 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找回。
回到 示例列表 →