Claude Code /rewind 详解:AI 改错了?一键回退
目录
为什么需要 /rewind
你让 Claude 重构一个模块,它改了 5 个文件。你看了一眼——改得不对,方向完全错了。
怎么办?手动 git checkout 每个文件?如果你还没 commit,连 diff 都不好找。
或者另一种情况:Claude 前面几轮回答都很好,但最后一轮走偏了。你想回到”走偏之前”那个节点,重新开始。
/rewind 就是你的后悔药。 一个命令,把代码和对话回退到任意历史节点。
/rewind 是什么
/rewind 是 Claude Code 的代码与对话回退命令(别名 /checkpoint)。它能把你的文件状态和对话历史恢复到会话中任意一个之前的时间点。
输入:
/rewind
会弹出一个交互式的消息选择器,让你选择”回到哪里”。
它是怎么记住历史的
这里有一个巧妙的机制:文件快照系统。
每次 Claude 完成一轮回复后,Claude Code 会自动对当前所有被它修改过的文件做一次快照。这个过程完全透明,你感知不到。
具体来说:
- 触发时机:每次 Claude 回复完成后
- 快照内容:所有被 Claude 编辑、创建或删除的文件
- 存储位置:
~/.claude/file-history/{sessionId}/ - 版本管理:每个文件按版本编号(v1、v2、v3…)
- 上限:每个会话最多 100 个快照,超出后淘汰最旧的
文件备份是增量的——只有实际发生变化的文件才会创建新版本。如果某个文件在两轮之间没变,直接复用上一个版本的备份,不浪费空间。
回退的四种模式
选好要回退的时间点后,你有四个选择:
1. 同时回退代码和对话
Restore code and conversation
最常用的模式。 文件恢复到选定时间点的状态,同时删除该时间点之后的所有对话消息。对话会”分叉”——你可以重新开始那个时间点之后的讨论。
2. 只回退对话
Restore conversation
只删除选定时间点之后的对话消息,文件不动。适合你觉得 Claude 后面的回答不好,但代码改动你想保留的情况。
3. 只回退代码
Restore code
只恢复文件到选定时间点的状态,对话不动。适合你想保留对话上下文(比如 Claude 的分析过程),但代码改动需要撤销的情况。
4. 从这里开始总结
Summarize from here
选定时间点之后的消息会被压缩成一条总结消息。既节省上下文空间,又保留了关键信息。
操作界面
/rewind 的交互体验设计得很直观。
第一步:选择回退点
屏幕上会列出你的对话历史,每条消息都会显示:
- 消息内容摘要
- 代码变更统计(改了几个文件,增删了多少行)
- 如果只改了一个文件,显示文件名
用上下箭头选择,Enter 确认。
第二步:确认回退方式
选好时间点后,显示确认界面:
- 你选的是哪条消息
- 会恢复几个文件
- 有多少行代码变更
- 选择回退模式(代码+对话、只代码、只对话、总结)
底部有一行提醒:
⚠️ Rewinding does not affect files edited manually or via bash
什么会被回退,什么不会
这一点很重要,务必理解:
会被回退的
- Claude 通过文件编辑工具修改的文件(FileEditTool)
- Claude 通过文件写入工具创建的文件(FileWriteTool)
- Claude 删除的文件(从备份恢复)
不会被回退的
- 你手动编辑的文件
- 通过 Bash 命令修改的文件(比如
sed、awk) - 外部工具或 IDE 做的修改
简单记:只有 Claude 的”官方”文件操作才会被追踪和回退。 如果 Claude 用 Bash 工具执行了 sed -i 来修改文件,这个改动不在 rewind 的追踪范围内。
文件备份机制
稍微展开说一下技术细节,帮助你理解它的可靠性。
备份文件格式
~/.claude/file-history/{sessionId}/
├── abc123def4567890@v1 # 某个文件的第 1 个版本
├── abc123def4567890@v2 # 第 2 个版本
├── abc123def4567890@v3 # 第 3 个版本
├── f1e2d3c4b5a69788@v1 # 另一个文件的第 1 个版本
└── f1e2d3c4b5a69788@v2
文件名是原始路径的哈希值,加上版本号。
变更检测
Claude Code 不是每次都盲目备份。它会:
- 检查文件的 stat 信息(大小、修改时间)
- 如果 stat 有变化,读取文件内容做字节级比对
- 只有真正变化了的文件才创建新版本
权限保留
恢复文件时,不仅恢复内容,还恢复文件权限(通过 chmod)。所以可执行脚本回退后仍然是可执行的。
实际使用场景
场景 1:重构方向错了
你让 Claude 把一个类重构成函数式风格。它改了 5 个文件,你看了之后觉得还是原来的好。
/rewind
选择重构之前的那条消息 → Restore code and conversation → 回到起点重新来。
场景 2:只想撤销最后一步
Claude 帮你改了三轮,前两轮很好,第三轮改坏了。
/rewind
选择第三轮之前的消息 → Restore code and conversation → 保留前两轮的成果。
场景 3:代码没问题,对话要重来
Claude 的代码改动是对的,但后续的对话走偏了,你想从某个节点重新引导。
/rewind
选择消息 → Restore conversation → 文件保持不变,对话从选定点重新开始。
场景 4:上下文太长了
会话太长,上下文快满了。你想保留关键信息但压缩历史。
/rewind
选择一个合适的节点 → Summarize from here → 后续消息被压缩成总结。
开启和关闭
文件快照系统默认是开启的,你不需要做任何配置。
如果出于性能或隐私考虑想关闭:
# 环境变量关闭
export CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING=1
或者在全局配置中设置 fileCheckpointingEnabled: false。
关闭后,/rewind 仍然可以回退对话,但无法恢复文件。
/rewind vs git
你可能会想:我有 git 啊,为什么还需要 /rewind?
| 特性 | /rewind | git |
|---|---|---|
| 粒度 | 每轮对话 | 每次 commit |
| 需要提前 commit | 不需要 | 需要 |
| 追踪未 commit 的改动 | 自动追踪 | 不追踪 |
| 能回退对话 | 能 | 不能 |
| 追踪手动编辑 | 不追踪 | 追踪 |
简单说:git 是长期版本管理,/rewind 是会话内的即时撤销。 两者互补,不冲突。
最佳实践:在每个重要节点先 commit,然后用 /rewind 处理 commit 之间的细粒度回退。
写在最后
/rewind 的核心价值是给你犯错的勇气。
和 AI 协作写代码,你不可能每次都给出完美的指令。Claude 也不可能每次都理解得准确无误。有了 /rewind,你可以大胆尝试:让 Claude 试一个激进的方案,不满意就回退;让它走一条冒险的路,走不通就退回来。
没有后悔药的 AI 编程是不完整的。
相关推荐
Claude Code Agent Loop:拆解 AI 编程助手的心脏
Claude Code 是怎么一步步理解你的需求、调用工具、自我修复的?从源码角度拆解 Agent Loop 的核心架构——流式响应、并行工具执行、自动压缩、错误恢复,一次讲透。
Claude Code settings.json 详解(一):配置文件在哪里、谁说了算
全面介绍 Claude Code 的配置文件体系——五个配置来源的路径、优先级规则、数组合并与单值覆盖的区别、企业管理设置的多种下发方式。
Claude Code settings.json 详解(二):permissions 权限系统全解析
深入解析 Claude Code 的 permissions 配置——allow/deny/ask 三类规则、通配符语法、MCP 工具权限、defaultMode 各模式含义,以及 additionalDirectories 的作用。
Claude Code settings.json 详解(三):hooks 钩子全解析
深入解析 Claude Code 的 hooks 配置——四种钩子类型、核心事件(PreToolUse/PostToolUse/Stop/Notification)、stdin/stdout 协议、exit code 语义,以及实用配置示例。
Claude Code settings.json 详解(四):env、模型、认证与其他实用字段
全面介绍 Claude Code settings.json 中的 env 环境变量注入、模型配置、身份认证辅助、Git 提交署名、会话清理、语言与界面、思考深度、自动更新、记忆系统等实用字段。