MemoryLake
返回全部文章
Tutorial2026 年 9 月 18 日·12 分钟阅读

如何回滚 Claude Code 会话并理清哪些修改能恢复(2026 指南)

Claude Code 在每个提示词发送前都会对您的代码进行快照,而 /rewind 可以让您回到其中一个状态。Anthropic 用一句话描述了其目的:"Claude Code 会在您工作时自动跟踪 Claude 的文件修改,使您能够在出现偏差时快速撤销更改并回滚到以前的状态。"

让人困惑的地方在于,回滚并不是您工作目录的时光机。它是对一组特定的、有文档记录的更改进行恢复——而 Anthropic 在文档中一个字面意思为“局限性”(Limitations)的章节中,公布了不属于该范围的清单。

那个清单是页面上最有用的内容。Bash 命令修改的文件、后台子智能体(subagent)进行的编辑、同时运行的另一个会话的更改、符号链接路径,以及在 Claude 仍在工作时您输入的历史消息,其行为都与您想象的修改不同。在它们发生时,没有一个会产生错误。您只有在回滚时才会发现,某些您期望恢复的内容依然存在。

本指南介绍了回滚菜单提供的内容、哪些修改可以恢复、哪些不能恢复以及应该用什么代替,还有一个基于日期的细节,它会在大约一个月后让原本可以成功的回滚变成失败的操作。

为什么回滚恢复的内容比你预期的要少

检查点(Checkpointing)有一个精确的触发机制。Anthropic 写道:"当您使用 Claude 工作时,检查点会自动捕获您发送的每个启动轮次(turn)的提示词之前的代码状态," 并且该机制是针对每个提示词的——"您发送的每个启动轮次的提示词都会创建一个新的检查点。"

起关键作用的短语是“启动轮次”。如果您在 Claude 执行任务中途输入了内容,文档明确说明了会发生什么:"当您在 Claude 工作时排队的消息在运行的轮次内到达 Claude 时,它会加入该轮次,而不是启动一个新轮次。该消息会出现在对话中,但 Claude Code 不会为其创建检查点,回滚菜单也不会列出它。" Anthropic 还给出了恢复操作——"要删除此类消息,或撤销 Claude 在其后进行的编辑,请回滚到启动该轮次的提示词。这将回滚整个轮次,包括在您的消息到达之前 Claude 所做的工作。"

跟踪的范围同样非常具体。"检查点不跟踪由 Bash 命令修改的文件," Anthropic 写道,并指出了界限:"仅跟踪通过 Claude 的文件编辑工具进行的直接文件修改。" 脚本移动的文件不在快照范围内。

子智能体(Subagents)根据其运行方式而有所不同。Anthropic 指出,子智能体 "使用 Claude 的文件编辑工具进行修改,但 Claude Code 通常不会在您会话的检查点中捕获这些修改," 并区分了以下情况:派生到前台的技能(skill)"在您自己的轮次中修改您的工作树,因此回滚会像往常一样恢复其修改," 而对于 "任何其他子智能体:回滚不会恢复这些修改。请使用 git 来撤销它们。"

并行进行的工作也不在范围内:"检查点仅跟踪在当前会话中编辑过的文件。您在 Claude Code 之外对文件进行的常规手动更改以及来自其他并发会话的编辑通常不会被捕获,除非它们恰好修改了与当前会话相同的文件。" 如果打开了两个终端,其中只有一个在保存您即将恢复的快照。

还有一个类别会悄悄地向您发出警告。Anthropic 指出,"检查点不会回滚符号链接或硬链接文件," Claude Code "会跳过任何作为符号链接或硬链接的被跟踪路径,并显示 Restored the code, but skipped N files 警告," 并且 "被跳过的文件将保持其当前内容。" Dotfile 管理器和某些包管理器正是将文件放在这个类别中。

最后是时间细节。快照不会永久保存:"Claude Code 会保留会话中最近 100 个检查点的文件快照," 另外,"Claude Code 会在保留清理(retention sweep)中删除会话的文件快照,默认情况下大约在会话最后一次保存快照的 30 天后。" 其后果被指明:"回滚到快照已不存在的检查点可能会失败,并显示 No files were restored。" 文档中记录的控制杠杆是一个设置——"要保留快照更长时间,请设置 cleanupPeriodDays。"

人们尝试的其他替代方法

要求 Claude 撤销其上一次修改。 这种方法经常奏效,以至于成了一种习惯,但它是一种重新编辑,而不是恢复。您会得到一个类似于旧状态的新状态,这与旧状态并不完全相同。

在会话出错时使用 /clear 这会清除对话,但它并不是对文件的回滚。Anthropic 确实提供了一条返回的途径:如果您在同一个 Claude Code 进程中较早运行了 /clear,"回滚菜单会在列表顶部显示一个额外的条目,标记为 /resume <session-id> (previous session)," 这需要较新的版本。

在您实际需要更多上下文空间时进行回滚。 两种不同的需求共享同一个菜单。总结(summarize)选项会压缩对话;恢复(restore)选项会改变状态。Anthropic 将它们清晰地分开:"总结不会改变磁盘上的文件,并且原始消息仍保留在会话记录中,因此 Claude 仍然可以引用这些细节。" 选择在压缩中保留什么内容本身就是一项练习,我们在将自动压缩对准您需要保留的内容中详细探讨过。

将会话记录视为档案。 记录非常适合用来追踪发生过什么,但不适合作为以后查找内容的场所,我们在索引会话日志与记忆的对比中指出了这一区别。

将检查点用作版本控制。 Anthropic 直接指出了这一点:"检查点旨在用于快速的会话级恢复。对于永久的版本历史记录和协作,请继续使用版本控制(例如 Git)来进行提交、分支和长期历史记录管理。"

通过回滚来探索替代方案。 对此有一个专门的机制,文档也指出了这一点:要在保留原始会话完好无损的同时,分支出去尝试不同的方法,请使用 /branch。通过回滚来探索意味着会覆盖您可能想要找回的内容。

解决方法:将菜单视为两类操作,并明确哪些修改在范围内

一旦您不再把 /rewind 仅仅看作一个按钮,一切都会变得简单得多。

步骤 1:打开菜单并注意提供了哪些选项

Anthropic 提供了两种进入方式:"运行 /rewind,或者在提示词输入框为空时按两次 Esc,即可打开回滚菜单。" 在尝试之前,有一个值得注意的警告——如果输入框中有文本,双击 Esc 会清除它,不过被清除的文本会保存到您的输入历史记录中。

菜单列出了您发送的每个提示词,并提供最多六个操作:"Restore code and conversation(恢复代码和对话):将代码和对话都恢复到该时间点"、"Restore conversation(恢复对话):回滚到该消息,同时保留当前代码"、"Restore code(恢复代码):恢复文件更改,同时保留对话"、"Summarize from here(从此处开始总结)"、"Summarize up to here(总结到此处)" 以及 "Never mind(算了)"。

您看到的选项本身就是一种信息。Anthropic 解释道:"只有当所选检查点有被跟踪的文件更改需要恢复时,才会出现这两个代码恢复选项。如果该时间点之后没有捕获到任何文件修改,菜单将仅提供 Restore conversation、总结选项和 Never mind。" 所以,如果在您确定 Claude 修改了文件的某个时间点缺少代码选项,这就是一个信号,表明这些更改来自被跟踪范围之外的某些地方——例如 Bash 命令、后台子智能体或另一个会话。

一个值得期待的便利功能:"在恢复对话或选择 '从此处开始总结' 后,所选消息中的原始提示词将被恢复到输入框中,以便您可以重新发送或编辑它。"

步骤 2:在依赖恢复之前,检查四个范围外的类别

按照最容易让人踩坑的顺序浏览该清单:

是否有任何操作是通过 Bash 命令进行的?用 Anthropic 的话来说,这些文件修改 "无法通过回滚来撤销。"

后台子智能体是否参与了工作?对于除前台派生技能之外的任何子智能体,"回滚不会恢复这些修改。请使用 git 来撤销它们。"

在同一个仓库上是否打开了第二个会话?来自其他并发会话的编辑 "通常不会被捕获,除非它们恰好修改了相同的文件。"

是否有任何路径是符号链接或硬链接?这些路径会被跳过,并显示一个指出数量而非文件名的警告。要查看是哪些路径,Anthropic 提供了一个诊断方法:"在恢复之前使用 /debug 开启调试日志:位于 ~/.claude/debug/<session-id>.txt 的调试日志会列出每个被跳过的路径。"

步骤 3:在通过回滚消除证据之前,写下结论

回滚通常意味着一次让您学到了一些东西的尝试宣告结束——例如这个库并没有像文档暗示的那样工作、这个模式更改破坏了该任务、这个方法由于某种原因被放弃了。而“恢复代码和对话”会连同代码一起删除包含该发现的对话记录。

先花 30 秒时间。写下一句关于什么没有起作用以及原因的话,比您丢弃的分支更有价值,否则下个月您还会重新发现这个问题。同样的道理也适用于您在过程中摸索出的命令和调用,这就是在当 Claude Code 忘记您的命令历史记录时中描述的差距。

在 MemoryLake 中进行设置

检查点是为大约一个月期限内的会话级恢复而构建的。您在会话中得出的结论需要一个期限更长的地方来存放。MemoryLake 是一个您专门用来记录这些结论的存储库,它独立于任何单个会话的快照,并且可以从您连接的每个助手进行读取。您可以用自己的语言亲自编写这些条目。没有任何内容会从 Anthropic 的系统或任何其他供应商的存储库中读取、写入或删除——您的检查点、记录和本地文件完全保留在它们自己的控制之下。

步骤 1:创建 API 密钥

从仪表板生成一个密钥。正是它让终端会话、编辑器和聊天助手能够获取相同的事实,而无需它们各自从记录中重新学习。

MemoryLake 控制台显示 API 密钥屏幕,在此处创建并复制新密钥以在智能体中使用
MemoryLake 控制台显示 API 密钥屏幕,在此处创建并复制新密钥以在智能体中使用

步骤 2:上传您的第一批记忆

从放弃的尝试结果开始:您通过回滚放弃的方法、失败的原因以及出现的限制。同时添加回滚会抹去的具体操作细节——最终起作用的调用、起关键作用的标志、步骤必须运行的顺序。

MemoryLake 工作区,其中上传了第一批文档,列出了每个文件成为可搜索记忆的过程
MemoryLake 工作区,其中上传了第一批文档,列出了每个文件成为可搜索记忆的过程

步骤 3:连接您的 AI 和智能体

将您的工具指向该层,以便在会话开始时加载这些事实,而不是从滚动历史记录的最后一项中重新构建。然后对其进行妥善测试:让另一个助手告诉您为什么放弃该方法。如果它能回答,说明该发现的寿命已经超越了产生它的会话。

MemoryLake 集成屏幕,列出了可以连接 to 记忆层的 AI 客户端和智能体框架
MemoryLake 集成屏幕,列出了可以连接 to 记忆层的 AI 客户端和智能体框架

这在实践中带来了什么改变

第一个改变是,部分恢复不再让人感到困惑。当您期望恢复的文件仍然存在时,四个范围外的类别可以解释原因,而且菜单中灰色不可选的代码选项通常会提前告诉您。

第二个改变是,您将“返回”与“腾出空间”分开了。恢复会改变状态;总结会压缩对话并保留文件,原始消息仍保留在记录中。一旦这种划分清晰明了,您就不会在需要其中一个时去使用另一个。这与每个具有压缩步骤的智能体中出现的划分相同,这就是为什么决定在压缩中保留什么是一项需要反复进行的练习,而不是一次性的工作。

第三个改变是,大约 30 天的保留清理变成了您可以提前规划的事情,而不是事后才发现。您最终想要回滚的旧会话可能无法回滚,如果您需要更长时间,cleanupPeriodDays 是文档中给出的解决方案。

第四个改变是,放弃的工作开始产生价值。如果每次回滚都留下一句写下的句子,失败就会累积成知识,而不是随着快照一起消失。

回滚 Claude Code 会话的最佳实践

将您的修正作为独立的轮次发送。 加入正在运行的轮次的消息不会获得检查点,也不会列在回滚菜单中。等待该轮次结束可以为您赢得一个恢复点。

在让智能体自由运行之前进行提交。 检查点是会话级的恢复;根据 Anthropic 自己的建议,Git 才是永久的历史记录。

当您想保留推理过程时,首选 Restore code(恢复代码)。 在保留对话的同时恢复文件,可以让您在屏幕上保留所学到的一切的同时重新尝试。

在进行您关心的恢复之前,开启调试日志。 这是文档中记录的找出哪些符号链接或硬链接路径被跳过的方法,而不是仅仅读取一个数量。

不要对并行会话做任何假设。 只有进行修改的会话才持有该修改的快照。

在选择 Restore code and conversation 之前,写下您的发现。 该选项是唯一一个既删除状态又删除您更改原因记录的选项。在永久的地方保留可重用部分的习惯在让 Claude Code 记住您的命令历史记录中有所介绍。

结论

/rewind 确实实现了 Anthropic 所宣称的功能:它将代码、对话或两者恢复到您从列表中选择的提示词之前的状态。菜单本身设计得很好,包括只有在有被跟踪的文件更改需要恢复时才会出现代码恢复选项这一细节。

让回滚显得不可靠的是其范围之外的一系列更改,Anthropic 完整地公布了这一范围:由 Bash 命令修改的文件、大多数子智能体的编辑、手动和并发会话的更改、符号链接和硬链接路径,以及加入已在进行中的轮次的消息。其中每一个都有文档记录,而且在发生时都不会主动提示。

再加上保留细节——最近 100 个检查点的快照,默认在会话最后一次保存快照约 30 天后被清理,如果需要更长时间可以使用 cleanupPeriodDays——您就了解了该功能的真实形态:出色的短期恢复,刻意不作为版本历史记录。

使用 Git 来保证永久性,使用 /branch 来探索替代方案,使用总结选项来应对上下文压力,并使用 /rewind 来实现其原本的设计目的。然后写下每次放弃的尝试带给您的启示,因为这是任何快照都无法保留的唯一东西。

常见问题

在 Claude Code 中,/rewind 实际上会恢复什么?

它将代码、对话或两者恢复到您从回滚菜单中选择的提示词之前的状态。Anthropic 将这些操作列为 Restore code and conversation(恢复代码和对话)、Restore conversation(恢复对话)、Restore code(恢复代码)、两个总结选项以及 Never mind(算了)。

为什么我的回滚菜单中缺少代码恢复选项?

因为所选的检查点没有被跟踪的文件更改需要恢复。Anthropic 指出,这两个代码恢复选项"只有当所选检查点有被跟踪的文件更改需要恢复时才会出现," 否则菜单仅提供 Restore conversation、总结选项和 Never mind。

回滚会撤销子智能体(subagent)所做的修改吗?

这取决于子智能体是如何运行的。前台派生的技能(skill)在您自己的轮次中修改您的工作树,因此回滚会像往常一样恢复其修改。对于任何其他子智能体,Anthropic 的文档指出 "回滚不会恢复这些修改。请使用 git 来撤销它们。"

通过 shell 命令更改的文件是否包含在检查点中?

不包含。Anthropic 指出 "检查点不跟踪由 Bash 命令修改的文件," 并且 "仅跟踪通过 Claude 的文件编辑工具进行的直接文件修改。"

为什么我的回滚失败并报错提示没有恢复任何文件?

最可能是快照已被清理。Anthropic 记录道,Claude Code "默认在会话最后一次保存快照约 30 天后" 删除会话的文件快照,并且回滚到快照已不存在的检查点 "可能会失败,并显示 No files were restored。" 设置 cleanupPeriodDays 可以保留更长时间。

回滚和总结之间有什么区别?

恢复会改变状态;总结会改变上下文。Anthropic 指出 "总结不会改变磁盘上的文件,并且原始消息仍保留在会话记录中,因此 Claude 仍然可以引用这些细节," 并将总结选项描述为在同一会话中类似于有针对性的压缩行为。