# 检查点示例 以下是一些在 Claude Code 中有效使用检查点的真实示例。 注意:每次用户提示都会自动创建检查点。你不需要手动保存。要回退,请连续按两次 `Esc`(`Esc+Esc`),或者使用 `/rewind` 打开检查点浏览器。 ## 示例 1:数据库迁移 ### 场景 你需要从 MySQL 迁移到 PostgreSQL,但想同时探索直接迁移和渐进式双写两种方案。 ### 工作流程 ``` 用户:我们来实现一个从 MySQL 到 PostgreSQL 的直接迁移方案 [检查点 A 自动创建] Claude:我来实现直接迁移…… [更换数据库驱动、更新查询、修改 schema] 用户:运行测试 [检查点 B 自动创建] Claude:正在运行测试…… ❌ 15 个测试失败 - 连接池问题 用户:这个方案有问题。我们改试双写模式。 [用户按下 Esc+Esc,选择检查点 A,选择“恢复代码和对话”] 用户:现在实现双写模式,同时向两个数据库写入 Claude:我来实现双写迁移…… [实现双写层、渐进式迁移策略] 用户:运行测试 Claude:正在运行测试…… ✅ 所有测试通过 用户:双写方案明显更稳妥。我们提交这个版本。 ``` ## 示例 2:性能优化 ### 场景 尝试多种性能优化策略。 ### 工作流程 ``` 用户:我们来优化 API 响应时间。当前:450ms [检查点“Baseline”自动创建] Claude:我来加数据库查询缓存…… [实现 Redis 缓存] 用户:运行性能测试 Claude:结果:平均响应时间 280ms(提升 38%) 用户:我想试试另一种方法。 [用户按下 Esc+Esc,选择“Baseline”检查点,选择“恢复代码和对话”] 用户:改试数据库查询优化 Claude:我来优化数据库查询…… [添加索引,优化 N+1 查询] 用户:运行性能测试 Claude:结果:平均响应时间 180ms(提升 60%) 用户:我也想试第三种方法。 [用户按下 Esc+Esc,选择“Baseline”检查点,选择“恢复代码和对话”] 用户:尝试响应压缩和 CDN Claude:我来添加压缩和 CDN…… [实现 gzip,配置 CDN] 用户:运行性能测试 Claude:结果:平均响应时间 320ms(提升 29%) 用户:查询优化最好。让我回到那个版本,再和缓存结合起来。 [用户按下 Esc+Esc,选择查询优化后的检查点,选择“恢复代码和对话”] 用户:现在在这些优化后的查询之上再加上 Redis 缓存 Claude:[在优化后的查询之上添加 Redis 缓存] 用户:运行性能测试 Claude:结果:平均响应时间 95ms(提升 79%)🎉 用户:完美!这就是最终方案。我们提交它。 ``` ## 示例 3:UI/UX 迭代 ### 场景 为仪表板尝试不同布局。 ### 工作流程 ``` 用户:我们来把仪表板重设计成侧边栏布局 [检查点“Start”自动创建] Claude:[实现侧边栏布局] 用户:给我看一张截图 Claude:[显示截图] 用户:侧边栏太拥挤了。我们试试顶部导航吧。 [用户按下 Esc+Esc,选择“Start”检查点,选择“恢复代码和对话”] 用户:试试顶部导航布局 Claude:[实现顶部导航] 用户:给我看一张截图 Claude:[显示截图] 用户:好多了,不过我们再试试卡片式网格布局。 [用户按下 Esc+Esc,选择“Start”检查点,选择“恢复代码和对话”] 用户:试试卡片式网格布局 Claude:[实现卡片网格] 用户:给我看一张截图 Claude:[显示截图] 用户:这个很不错!不过我们能把顶部导航和卡片网格结合起来吗? [用户按下 Esc+Esc,选择卡片网格后的检查点,选择“恢复代码和对话”] 用户:给卡片网格布局加上顶部导航 Claude:[在卡片网格上添加顶部导航] 用户:完美!这就是最终设计。 ``` ## 示例 4:调试会话 ### 场景 用多个假设排查一个难缠的 bug。 ### 工作流程 ``` 用户:应用里有内存泄漏 [检查点“Before debugging”自动创建] Claude:让我来调查…… [分析代码] 用户:我觉得问题在事件监听器里。我们先修这个。 Claude:[修复事件监听器清理逻辑] 用户:运行内存分析器 Claude:仍然在泄漏内存 - 事件监听器不是问题所在 用户:让我回到之前,换个思路试试。 [用户按下 Esc+Esc,选择“Before debugging”检查点,选择“恢复代码和对话”] 用户:也许是数据库连接的问题? Claude:[实现连接池修复] 用户:运行内存分析器 Claude:还是在泄漏 - 也不是连接的问题 用户:我再回去,换另一个方向试试。 [用户按下 Esc+Esc,选择“Before debugging”检查点,选择“恢复代码和对话”] 用户:我们检查一下有没有循环引用 Claude:[找到并修复缓存中的循环引用] 用户:运行内存分析器 Claude:✅ 内存泄漏修复了!缓存层里的循环引用就是罪魁祸首。 用户:太好了!我们提交这个修复。 ``` ## 示例 5:API 设计演进 ### 场景 为 REST API 设计做多轮迭代。 ### 工作流程 ``` 用户:给我们的博客平台创建一个 REST API [检查点“Before API design”自动创建] Claude:[创建基础 CRUD API] 用户:这个太简单了。加上分页和过滤 Claude:[添加分页和过滤] 用户:我们需要更好的资源关系 Claude:[实现 HATEOAS 链接] 用户:其实我们改用 GraphQL,不用 REST 了 [用户按下 Esc+Esc,选择“Before API design”检查点,选择“恢复代码和对话”] 用户:那就为我们的博客平台改实现 GraphQL API 吧 Claude:[实现 GraphQL API] 用户:我觉得 REST 更适合我们的场景。 [用户按下 Esc+Esc,选择 HATEOAS 之后的检查点,选择“恢复代码和对话”] 用户:那我们就把 REST 方案定下来。 ``` ## 示例 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:[生成从该点开始的对话总结] [原始消息保留在记录里] [总结会替换当前可见对话,从而减少上下文窗口占用] 用户:现在继续推进那个有效的方案。 ``` ## 关键结论 1. **检查点是自动创建的**:每次用户提示都会创建一个检查点,不需要手动保存。 2. **使用 `Esc+Esc` 或 `/rewind`**:这两种方式都可以打开检查点浏览器。 3. **选择合适的恢复方式**:根据需要恢复代码、对话、两者都恢复,或者直接总结。 4. **不要害怕试验**:检查点让你可以安全尝试激进的改动。 5. **和 git 结合使用**:检查点用于探索,git 用于最终落地。 6. **长会话要及时总结**:用“从这里开始总结”来保持对话可管理。