用 Claude Code 处理代码任务时,有一种让人不安的时刻:它改动了一批文件,你看着改动觉得方向有点不对,但已经不知道原来的代码是什么样子了——尤其是在它连续改了十几个文件之后。

检查点(Checkpoint)功能就是为这个场景设计的。它在 Claude Code 执行任务的过程中自动或手动保存项目状态的快照,当你发现改动走偏了,可以一键回到改动之前的状态,而不需要手动逐文件撤销或依赖 Git 的 stash 操作。

本文由 Claude Ai中文官网 整理,把检查点功能的工作原理、触发方式、回滚操作,以及与 Git 配合使用的最佳实践,系统梳理清楚,帮你在 AI 编程的试错过程中保持对代码状态的完整控制。

Claude Code 的检查点功能随版本迭代持续改进,具体交互方式和命令以你安装的版本为准。建议同时访问 Claude Ai中文官网 或 Anthropic 官方文档查阅最新说明。

一、检查点功能解决的核心问题

在理解功能细节之前,先把它解决的问题说清楚,方便你判断什么时候需要用它。

Claude Code 在执行一个任务时,可能会连续修改多个文件——改了 A 文件的函数、删了 B 文件的某个模块、在 C 文件里新增了代码、更新了 D 文件的配置。这个过程中,如果你在中途发现方向错了,想撤回到某个特定的状态,面临的选择通常只有两个:

  • 手动逐文件撤销:如果你没有 Git,只能靠 Ctrl+Z 逐步撤销,但跨文件的撤销顺序很难保证正确,而且可能已经关闭了某些文件。
  • 依赖 Git:如果项目有 Git,可以用 git checkoutgit stash,但这需要你提前做了 commit 或 stash,在任务进行中这个操作并不总是及时。

检查点功能在 Claude Code 内部提供了第三个选项:在任务执行过程中自动或手动保存状态快照,任何时候都可以一键回滚到某个快照,不依赖外部工具,不需要提前操作。

二、检查点的两种创建方式

方式 1:Claude Code 自动创建检查点

Claude Code 会在以下时机自动创建检查点,无需你手动触发:

  • 开始执行写操作之前:当 Claude Code 即将对文件进行写入、修改或删除操作时,它会在执行前自动保存当前状态。这是最常见的自动检查点触发场景。
  • 每轮对话结束时:在完成一个对话轮次(你发送一条消息,它执行并回复)之后,Claude Code 会保存当前的项目状态。
  • 执行批量操作之前:当 Claude Code 判断接下来要执行的操作涉及多个文件或具有较高影响面时,会在开始前自动创建检查点。

自动检查点是无感知的——你不需要做任何操作,Claude Code 会在后台静默创建。你只有在需要回滚的时候,才会意识到它们的存在。

方式 2:手动创建检查点

在以下场景,建议你主动创建检查点,而不是完全依赖自动触发:

  • 你即将让 Claude Code 执行一个风险较高的操作(如大规模重构、删除模块)
  • 当前的代码状态是你满意的”基准状态”,你想在此基础上进行实验性的修改
  • 在开始一个新的子任务之前,希望能够独立回滚这个子任务而不影响之前的改动

在 Claude Code 的交互界面中手动创建检查点:

# 在 Claude Code 对话中,用自然语言请求创建检查点
请在开始修改之前,先为当前状态创建一个检查点。

# 或者直接通过命令
/checkpoint save "重构前的稳定状态"

手动创建时建议附上描述性的标签,方便后续在多个检查点之间找到目标状态。

三、查看当前的检查点列表

在 Claude Code 的交互界面中,你可以随时查看当前会话中已有的检查点列表:

# 查看所有检查点
/checkpoint list

# 或者在对话中询问
请列出当前所有可用的检查点。

检查点列表通常会显示以下信息:

  • 检查点的序号或 ID
  • 创建时间
  • 创建检查点时正在进行的操作描述(自动创建)或你填写的标签(手动创建)
  • 该检查点对应的文件变更摘要

了解当前有哪些检查点,能帮你在回滚时选择正确的目标状态,避免回滚过头或回滚不足。

四、回滚操作:怎么用检查点还原代码状态

当你发现 Claude Code 的改动方向有问题,或者测试结果不符合预期,需要回到之前的状态时,操作步骤如下:

步骤 1:确认你想回到哪个检查点

先查看检查点列表,找到你想回滚的目标状态。如果你不确定应该回到哪个,可以查看每个检查点的变更摘要来判断:

# 查看特定检查点的详细信息
/checkpoint show [检查点ID]

# 查看从某个检查点到当前状态的变更差异
/checkpoint diff [检查点ID]

步骤 2:执行回滚

# 回滚到指定检查点
/checkpoint restore [检查点ID]

# 或者通过自然语言
请回滚到标签为"重构前的稳定状态"的检查点。

# 回滚到最近的一个检查点(最常用)
/checkpoint restore latest

步骤 3:确认回滚结果

回滚完成后,Claude Code 会显示还原的文件列表和变更摘要。建议做以下验证:

  • 检查关键文件的内容是否已恢复到预期状态
  • 运行一次快速的测试(如果有测试套件)确认代码可正常运行
  • 确认不需要的改动已经被撤销
# 回滚后验证当前状态
请告诉我当前的文件状态,确认回滚是否成功。

回滚的影响范围

需要了解的重要细节:回滚操作会将指定检查点之后的所有文件变更撤销,回到检查点时刻的精确状态。这意味着:

  • 检查点之后 Claude Code 做的所有修改都会被还原
  • 检查点之后你手动做的文件修改也会被还原
  • 回滚不可选择性撤销(不能只还原某一个文件而保留其他文件的改动)

如果你只想撤销某个特定文件的改动而保留其他文件,使用 Git 的 git checkout -- [文件名] 更合适。

五、检查点与 Git 的配合:最稳健的工作流

检查点功能和 Git 不是替代关系,而是互补的——检查点提供了会话内的即时状态保存,Git 提供了长期的版本管理。两者结合使用,能覆盖不同粒度的回滚需求。

推荐的工作流

开始一个任务之前:在 Git 中创建一个新分支,专门用于这次 Claude Code 辅助的改动。

git checkout -b feature/claude-refactor-auth-module

在 Claude Code 中执行任务:让 Claude Code 在这个分支上工作,利用检查点功能在任务执行过程中保存细粒度的状态快照。

任务完成并验证后:将改动提交到 Git。

git add .
git commit -m "feat: 重构认证模块,提升代码可读性"

如果任务失败或需要推倒重来:可以选择:

  • 使用检查点回滚到会话内的某个中间状态,在此基础上继续尝试
  • 使用 Git 完全放弃整个分支的改动,回到 main 分支重新开始

检查点 vs Git 的分工对比

场景 推荐工具 原因
任务进行中,需要临时回退几步 检查点 即时操作,不需要 commit,不污染 Git 历史
当前改动整体满意,想保留进度 Git commit 持久化保存,支持跨会话访问
只想撤销某个特定文件的改动 Git checkout 检查点是全量回滚,Git 支持文件级操作
需要在不同方案之间对比切换 Git branch 分支支持独立保存多个方案
Claude Code 会话结束后的状态保存 Git commit 检查点不跨会话,关闭会话后无法恢复
快速回滚 AI 的批量操作 检查点 比手动逐文件撤销快得多

关键注意事项:检查点不跨会话保存

检查点是会话级别的功能。当你关闭 Claude Code 会话后,该会话中的所有检查点都不再可用。 这意味着:

  • 重要的代码状态必须通过 Git 提交来持久化,不能只依赖检查点
  • 如果你关闭了终端或 Claude Code 进程退出,当前会话的检查点会话随之失效
  • 在长期任务中,应该定期通过 Git commit 保存阶段性成果

六、高风险操作前的检查点策略

以下几类操作风险较高,强烈建议在执行前手动创建检查点:

大规模重构

涉及多个文件的重构操作(如修改接口签名、重组目录结构、替换依赖库)影响面广,一旦出现问题,手动回退的成本极高。

# 在开始大规模重构前
请先创建一个名为"重构前基准状态"的检查点,
然后再开始对认证模块的重构。

删除操作

删除文件、删除函数、删除配置项——删除操作的影响通常比修改更难手动还原,检查点在这里的价值尤其明显。

# 在删除操作前
在删除这些废弃的工具函数之前,先创建一个检查点,
万一有其他地方还在用,我需要能够快速恢复。

依赖升级

升级第三方依赖包可能导致不兼容的 API 变更,在升级前保存检查点,确保出现问题时能快速回到已知可用状态。

实验性修改

当你不确定一种实现方式是否合适,想先试试看再决定的时候,检查点是”安全地试验”的基础设施。

# 实验性修改前
我想试一种新的缓存策略,不确定效果如何。
先创建一个检查点,然后我们来实现新的策略,
如果效果不好,可以快速回滚。

七、常见问题与解决方法

Q:回滚之后,我之前手动做的一些修改也没了,怎么找回来?

A:检查点的回滚是全量的,检查点之后所有的文件变更(包括你手动做的)都会被还原。如果你的项目有 Git,可以通过 git diff HEADgit stash 在回滚前先保存当前状态。养成在开始使用 Claude Code 之前先做 Git commit 的习惯,是防止这类情况的最可靠方法。

Q:检查点列表里有很多条目,怎么知道应该回滚到哪个?

A:通过 /checkpoint diff [检查点ID] 查看每个检查点到当前状态的差异,或者通过 /checkpoint show [检查点ID] 查看该检查点的摘要。如果你在手动创建检查点时给了清晰的描述标签,这个步骤会容易很多——这也是建议养成给检查点命名习惯的原因。

Q:关闭了 Claude Code 再重新打开,检查点还在吗?

A:不在。检查点是会话级别的,关闭会话后不再可用。重要的代码状态需要通过 Git commit 来持久化保存。

Q:能否只回滚某一个文件而不影响其他文件?

A:检查点的回滚是全量的,不支持选择性文件回滚。如果只想撤销某个特定文件的改动,使用 git checkout -- [文件路径](如果该文件在上一次 commit 时的状态是你想要的)更合适。

Q:检查点会占用磁盘空间吗?

A:会,但通常不多。检查点保存的是文件状态的差异(delta),而不是完整的文件副本,对磁盘空间的占用通常在可接受范围内。Claude Code 会在会话结束后自动清理该会话的检查点数据。

Q:Claude Code 执行任务时突然中断了,检查点还有效吗?

A:如果中断发生在 Claude Code 进程退出之前,检查点通常仍然有效,可以在重新启动 Claude Code 并进入同一项目目录后查看。如果进程异常终止,检查点数据可能不完整,建议通过 Git 来确认代码状态。

八、让检查点功能真正好用的几个习惯

检查点功能的价值能否充分体现,很大程度上取决于使用习惯。以下几点是从实际使用中总结出的最有价值的习惯:

  • 每个任务开始前做一次 Git commit:这不是检查点功能本身的要求,但是让检查点功能发挥最大价值的前提。有了干净的 Git 状态,你在任何时候都有”绝对安全点”可以回退,检查点负责任务执行中的细粒度回滚。
  • 手动创建检查点时写清楚描述:一个月后你不一定记得”检查点 3″是什么状态,但”添加缓存层之前”或”API 接口重构完成、单元测试通过”这样的描述让你一眼就能做出判断。
  • 在要求 Claude Code 做有较大风险的操作时,明确要求它先创建检查点:不要假设 Claude Code 一定会自动创建检查点,在高风险操作前主动要求,确保有明确的安全点。
  • 不要过分依赖检查点,把它当作 Git 的替代品:检查点解决的是会话内的即时回滚需求,不能替代 Git 的版本管理功能。阶段性成果必须 commit,不能只存在于检查点中。
  • 重要改动完成后立即 commit,不要等积累很多再一次性提交:小步提交能让 Git 历史更清晰,也能确保即使 Claude Code 会话意外终止,已有的进度也不会丢失。

总结

Claude Code 的检查点功能本质上是一个会话内的即时状态快照系统——它在 AI 执行多步骤任务的过程中,提供了一个随时可以”后悔”的机制,让你能够大胆地让 Claude Code 尝试复杂的改动,同时保持对代码状态的控制。

用好检查点功能只需要记住三件事:高风险操作前手动创建检查点并附上清晰描述;回滚时通过差异预览确认目标状态再操作;重要进度通过 Git commit 持久化,不能只依赖检查点。

检查点和 Git 是互补关系,不是替代关系。把两者的分工搞清楚,在正确的场景选用正确的工具,才能在 AI 辅助编程的工作流中既享受高效,又保持安全。

更多关于 Claude Code 功能说明、使用技巧和最新更新,欢迎访问 Claude Ai中文官网 查阅持续更新的中文开发者文档。

好的安全网让你敢于大胆行动。检查点功能的价值不在于它被用到的那一刻,而在于它存在的每一刻——知道随时可以回滚,你才能放心地让 AI 去尝试那些没有它你不敢轻易动手的改动。