08|Rewind:定位错误并恢复到正确现场
用真实恢复模式比较 Rewind、Git 与局部回退。
用真实恢复模式比较 Rewind、Git 与局部回退。
Git 检查点像游戏存档。存档不是为了证明你不会失败,而是让每次实验都有安全返回点。越大的未审查改动,越难区分正确与偶然。
本课交付物
创建练习分支,完成两次小改动并分别检查 diff;故意制造测试失败,使用日志和局部回退恢复,而不是整仓覆盖。
最佳实践
因为 checkpoints 是自动创建的,所以你可以专注于工作,而不用担心手动保存状态。不过,下面这些习惯仍然很重要:
如何高效使用 Checkpoints
✅ 应该做:
- 回退前先看清楚可用的 checkpoints
- 当你想尝试不同方向时使用 rewind
- 保留 checkpoints 方便比较不同方案
- 理解每个 rewind 选项的作用(恢复代码和对话、恢复对话、恢复代码、或总结)
❌ 不要做:
- 只依赖 checkpoints 来保存代码
- 指望 checkpoints 跟踪外部文件系统变化
- 把 checkpoints 当成 git commit 的替代品
配置
你可以在设置中开启或关闭自动 checkpoints:
{
"autoCheckpoint": true
}
autoCheckpoint:是否在每次用户提示后自动创建 checkpoint(默认:true)
局限性
Checkpoints 很适合会话级回退,但它不是版本控制系统。对于需要长期保存、可审计、可共享的改动,仍然应该使用 git。
故障排查
找不到 Checkpoints
- 检查你是否在支持该功能的 Claude Code 版本中
- 确认自动 checkpoint 没有被关闭
- 重新打开会话再试一次
Rewind 失败
- 确认你选择了一个有效的 checkpoint
- 查看是否存在与文件系统或权限相关的限制
- 尝试先分别恢复代码或对话,再决定是否同时恢复两者
与 Git 的集成
Checkpoints 和 git 是互补关系:
- Checkpoints 用于会话内探索和安全试验
- Git 用于永久保存代码历史
- 你可以先用 checkpoints 快速试错,再把最终方案提交到 git
快速开始
基本工作流
1. 开始修改前自动创建 checkpoint
2. 尝试某个方案
3. 如果结果不理想,按 Esc 两次
4. 选择合适的 rewind 选项
5. 继续探索或提交最终方案
键盘快捷键
Esc+Esc:打开 checkpoint 浏览器/rewind:通过命令进入回退界面/checkpoint:/rewind的别名
什么时候该 rewind:上下文监控
如果你发现这些信号,通常就该回退了:
- 当前方案开始变复杂,而且你还没确定方向
- 测试刚失败,问题可能就是最近一两步引入的
- 你想比较两种实现方式
- 你想保留一个“干净起点”继续探索
相关概念
- Memory:跨会话的长期上下文,见 02-memory/README.md
- Hooks:事件驱动自动化,见 06-hooks/README.md
- Plugins:打包功能集合,见 07-plugins/README.md
- Advanced Features:包括 planning mode 和背景任务,见 09-advanced-features/README.md
更多资源
- 根目录中文指南
- Claude Code 官方检查点文档
- Claude Code 高级功能指南
总结
Checkpoints 的价值在于让你敢于试错。它让“先试再说”和“试错后立刻回退”变得安全,从而帮你更快找到正确方案。
示例 6:配置管理
场景
测试不同的配置方案。
工作流程
用户:把配置迁移到环境变量
[检查点“Original config”自动创建]
Claude:[实现环境变量配置]
用户:在开发环境里测试
Claude:本地可用,但生产环境部署有问题
用户:我换个方案试试。
[用户按下 Esc+Esc,选择“Original config”检查点,选择“恢复代码和对话”]
用户:改成带校验的配置文件方案
Claude:[实现带 JSON Schema 校验的 YAML 配置]
用户:在开发环境里测试
Claude:✅ 运行良好,校验错误提示也很清楚
用户:我们也能为敏感值支持环境变量吗?
Claude:[为密钥添加环境变量覆盖]
用户:测试部署
Claude:✅ 所有环境都正常工作
用户:完美,这个已经可以用于生产。
示例 7:测试策略
场景
实现完整的测试体系。
工作流程
用户:给 auth 模块添加单元测试
[检查点自动创建]
Claude:[添加 Jest 单元测试]
用户:运行测试
Claude:45 个测试通过,覆盖率 78%
用户:再加上集成测试
Claude:[添加集成测试]
用户:运行测试
Claude:89 个测试通过,覆盖率 92%,但测试太慢了(3 分钟)
用户:测试太慢了,我们来优化。
Claude:[优化测试设置,增加并行执行]
用户:运行测试
Claude:89 个测试通过,覆盖率 92%,35 秒完成 ✅
用户:很好!再给关键路径加上 E2E 测试。
Claude:[添加 Playwright E2E 测试]
用户:运行所有测试
Claude:112 个测试通过,覆盖率 94%,2 分钟完成
用户:很好,覆盖率和速度都平衡得不错!
示例 8:从检查点开始总结
场景
在一次很长的调试会话后,你想压缩对话内容,同时保留上下文。
工作流程
用户:[经过 20 多条消息的调试和探索之后]
[用户按下 Esc+Esc,选择较早的检查点,选择“从这里开始总结”]
[可选地提供指令:“重点保留我们尝试过什么,以及什么有效”]
Claude:[生成从该点开始的对话总结]
[原始消息保留在记录里]
[总结会替换当前可见对话,从而减少上下文窗口占用]
用户:现在继续推进那个有效的方案。
关键结论
- 检查点是自动创建的:每次用户提示都会创建一个检查点,不需要手动保存。
- 使用
Esc+Esc或/rewind:这两种方式都可以打开检查点浏览器。 - 选择合适的恢复方式:根据需要恢复代码、对话、两者都恢复,或者直接总结。
- 不要害怕试验:检查点让你可以安全尝试激进的改动。
- 和 git 结合使用:检查点用于探索,git 用于最终落地。
- 长会话要及时总结:用“从这里开始总结”来保持对话可管理。
本站实战工作台
检查点不是为了炫耀 Git
检查点的作用是把实验切成能理解、能比较、能局部撤销的小段。没有检查点时,十个文件一起变化,你很难知道测试是被哪一步破坏,也容易用整仓覆盖误伤别人尚未提交的工作。
动手前拍一张现场照片
git status --short
git branch --show-current
git log -3 --oneline
如果工作区本来就不干净,把现有改动视为用户资产。记录哪些文件与你的任务重叠,不要用 reset 或 checkout 清理。必要时新建分支或 worktree 隔离,而不是覆盖现场。
小步不是小提交数量竞赛
一个检查点应该表达完整意图,例如“补充失败测试”或“实现最小修复”,而不是“改第一行”。提交前看 diff,确保不混入格式化、调试输出和无关重构。测试失败也可以成为本地检查点,只要消息清楚说明当前状态,且不推送为完成版本。
安全制造并恢复一次失败
在练习分支修改一个被测试覆盖的返回值,让定向测试失败。保存失败输出,定位到本次差异,然后只撤回那一小块。恢复后再次运行同一测试,证明因果关系。
比较两种危险习惯:直接复制旧文件覆盖新文件,会丢掉同期合法修改;整仓 reset 会抹掉所有未提交工作。优先使用编辑补丁、反向提交或明确文件范围的恢复方式,并始终先审查目标差异。
Checkpoint 与 Commit 的区别
Claude Code 的检查点能力可帮助恢复会话内变更,Git 提交则是仓库级、可共享的历史。两者可以互补,但不能互相假装。会话检查点不替代数据库备份,Git 提交也不会撤销已经发送的邮件、迁移的生产数据或付费 API 调用。
恢复后还要检查外部状态
如果任务启动了服务、改变了端口、安装了依赖或执行了迁移,文件恢复不代表环境恢复。建立恢复清单:进程、数据库、生成文件、锁文件、远程分支、临时凭据。每种状态有自己的撤销工具。
交付恢复演练
创建 recovery-log.md,记录基线、两个检查点、注入的失败、定位证据、使用的局部恢复和恢复后测试。最后让另一位学习者只看日志复现。真正的可恢复不是“我知道 Git 命令”,而是事故发生时仍能保护不属于本任务的工作。