SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor

Claude Code 如何恢复会话及查找历史记录

了解如何按名称或从选择器恢复 Claude Code 会话,并找到代理运行机器上保存的纯文本会话记录,注意 VPS 与本地历史互不共享。

如何恢复 Claude Code 会话

要恢复 Claude Code 会话,请运行 claude --continue,恢复当前目录中的最近一次对话;或运行 claude --resume,从列表中选择较早的会话。在已经运行的会话中,/resume 命令可在不退出的情况下切换到其他对话。对应的简写形式是 -c-r

claude --continue
claude --resume
claude --resume auth-refactor

如果已知会话名称或 ID,可将其作为参数传入。Claude Code 会直接进入该会话,不显示选择列表。

以下内容与截至 August 2026 的官方会话文档一致。Claude Code 发布频繁,选项名称和键盘快捷键可能随版本变化。因此,如果本文内容与终端显示不一致,应以 claude --help 和该页面为准。

会话的实际含义

会话是与项目目录关联的一段已保存对话。它包含完整的消息历史记录,包括 Claude Code 执行的工具调用及其返回结果。Claude Code 会在您工作期间持续将其写入磁盘,而不是等到最后才保存,因此即使关闭终端或 SSH 连接中断,对话也不会丢失。

恢复会话时,恢复的不只是文本。完整的对话历史记录会被还原,同时还会恢复该会话使用的模型,以及在使用 --agent 时启动的子代理。权限模式也会恢复,但出于安全原因存在例外:计划模式和绕过权限模式从不恢复,因此处于其中任一模式的会话恢复后,会使用新会话默认启动时的模式。

有些内容不会恢复,因为它们是启动时的标志,而不是保存的状态。使用 --add-dir 添加的目录,以及 --mcp-config--settings--plugin-dir 等选项,都必须在恢复会话时重新传入。settings.json 等设置文件会在启动时重新读取,因此其中的设置无需再次指定。

为什么会话历史记录在 VPS 上更重要

这里有一个容易让人意外的事实。会话记录写入运行代理的那台机器。它不会保存在您的账户中,也不会同步到云端。它只是该机器磁盘上的一个文件。

因此,您留在 VPS 的 tmux 窗口中的会话,不会出现在笔记本电脑的会话选择器中;笔记本电脑上的会话也不会出现在 VPS 上。两者之间不会传输任何内容。如果您像大多数使用 在 VPS 上通过 tmux 运行 Claude Code 的人一样工作,那么服务器会积累您真正的会话历史,而您在本地看到的会话选择器显示的是另一组规模小得多的会话。

不同界面之间也存在相同的隔离。桌面应用和 VS Code 扩展分别维护自己的会话历史,二者都不是 CLI 的历史记录。Web 版 Claude Code 也维护独立的会话历史。

在同一台机器上,搜索范围比您预期的更广。claude --resume <session-id> 会先搜索当前项目目录及其 git worktree,然后搜索该机器上的其他所有项目。需要记住的是“在该机器上”。来自其他主机的会话 ID 无法解析为任何会话,Claude Code 会通过 No conversation found with session ID: <session-id> 告知您这一点。

Claude Code 将会话历史记录存储在哪里

默认情况下,记录文件位于 Claude Code 配置目录下,路径格式为 ~/.claude/projects/<project>/<session-id>.jsonl

<project> 是您的工作目录路径,其中所有非字母数字字符都会替换为连字符。因此,在 /home/deploy/apps/api 中启动的会话会存储在名为 -home-deploy-apps-api 的目录下。如果转换后的名称超过 200 个字符,Claude Code 会将其截断,并追加完整路径的哈希值,使目录名保持在文件系统限制以内。

该文件采用 JSONL 格式:每行包含一个 JSON 对象,每行表示一条消息、一次工具调用或一条元数据记录。它是可读文本,可以直接读取。

但不建议基于它编写解析器。条目格式属于 Claude Code 的内部格式,并且会随版本变化,因此直接读取这些文件的脚本可能在任何更新后失效。Anthropic 的官方文档建议使用 /export 或文档说明的脚本接口,原因正是如此。

有两个设置会改变存储位置或保留期限。CLAUDE_CONFIG_DIR 会迁移整个配置目录,因此可以将记录文件放到独立卷或加密卷上。cleanupPeriodDays 位于 settings.json 中,用于控制记录的保留时间,默认值为 30 天,最小值为 1。

转录文件中实际包含什么

每个工具结果都会被记录,因此转录文件包含 Claude 读取的文件内容,以及 Claude 执行的命令输出。Anthropic 的数据使用页面对此有明确说明:Claude Code 会以纯文本形式,将会话转录文件存储在 ~/.claude/projects/ 下。

请考虑这在服务器上意味着什么。如果 Claude 读取了 .env 文件,以查明某项服务为何无法启动,那么该文件的内容现在就位于您主目录中的 JSONL 文件里。如果某条命令输出了连接字符串,该字符串也会被记录其中。没有发生泄露。转录文件记录的是实际发生的事情,这正是它存在的目的;也正因如此,您应将其纳入威胁模型。

  • 备份:直接备份 /home/root 会将转录文件复制到备份存储所在的位置。请添加排除项,否则您需要接受:提示词和文件内容的副本现在也会存放在备份存储中。
  • 快照和镜像:无论出于何种原因创建的 VPS 快照都包含整个目录。您为创建第二台服务器而克隆的镜像也一样。
  • 服务器上的其他账户:请使用 ls -ld ~/.claude ~/.claude/projects 自行检查权限模式,不要假定权限已经严格限制。
  • 主动上传:/feedback 命令会主动将对话历史发送给 Anthropic,/bug/share 也会通过同一路径上报。这些操作都需要您主动选择,因此在确认之前,请先了解您同意的内容。

如果您不希望生成任何转录文件,CLAUDE_CODE_SKIP_PROMPT_HISTORY 会禁止写入转录文件,--no-session-persistence 则会在单次非交互式 claude -p 运行中禁止写入。设置任一选项前,请明确了解相应的取舍。恢复会话依赖转录文件,因此没有转录文件就无法恢复会话。

如何查找旧对话

使用 claude --resume 打开选择器,或在运行中的会话内使用 /resume。每一行都会显示会话名称(如果已设置),否则显示自动生成的标题,以及距离上次活动的时间、git 分支和文件大小。

选择器支持搜索。按 /,或直接开始输入,即可筛选列表。值得记住的是用于扩大搜索范围的快捷键:Ctrl+A 显示本机上所有项目的会话,Ctrl+W 显示当前仓库的所有 worktree,Ctrl+B 将结果筛选为当前 git 分支。按 Space 可在确认恢复前预览会话内容,按 Ctrl+R 可重命名高亮显示的会话。

为会话命名后,查找会容易得多。使用 claude -n auth-refactor 开始会话,或者在会话进行到一半、意识到对话已经变成一项实际工作时运行 /rename auth-refactor。之后可以直接从 shell 按名称恢复已命名的会话。

未命名的会话仍会获得自动生成的标题。系统会在后台请求一个小型快速模型,根据您的第一条提示生成摘要。该标题有助于您在选择器中识别会话,但不能用作恢复句柄。claude --resume <name> 只匹配您自行设置的名称。

搜索会话记录以找到正确的会话

有时您只记得某个短语,其他内容都不记得。会话记录是文本文件,因此可以搜索。

grep -rl "nftables" ~/.claude/projects/

该命令会输出匹配会话记录的路径。不含 .jsonl 扩展名的文件名就是会话 ID,claude --resume <session-id> 接受该 ID。使用 grep 确定需要哪个会话,然后恢复该会话,或将其导出后实际查看内容。

需要注意两点。内容经过 JSON 转义,因此包含引号的短语,或跨越换行的短语,可能无法作为字面字符串匹配。此外,如果匹配内容位于工具结果中,只能说明 Claude 看到了该文本,不能说明有人输入过该文本。

读取并导出对话

/export 将当前对话渲染为纯文本,以易读的形式写出消息和工具输出,而不是 JSON。不带参数时,它会打开一个菜单,让您选择剪贴板或文件。指定文件名后,/export handover.txt 会直接写入该路径。这是将对话从服务器传输到笔记本电脑,或将对话附加到工单的正确方式。

对于自动化任务,请使用设计为稳定的接口。钩子和状态行命令会接收一个 transcript_path 字段作为输入,因此 SessionEnd 钩子可以在会话结束时归档对话记录。您也可以在不打开已存储会话的情况下向其提问:

claude -p --resume <session-id> --output-format json "summarize what we changed" | jq -r '.result'

该命令会向旧对话发送后续提示,并返回结构化 JSON。相比解析下一版本可能随时更改的 JSONL 格式,这是一种可靠得多的基础。

重新开始有时优于恢复会话

恢复会话会带回完整历史记录,而后续每个请求都会携带完整历史记录。昨天运行了四个小时的对话,今天继续使用的成本很高。长会话中的令牌用量如何累积说明了这些成本的实际来源。

Claude Code 有时会提供折中方案。在 Pro 或 Max 计划中,如果某个会话已闲置约一小时且包含超过 100,000 个令牌,恢复该会话时,Claude Code 会在您发送第一条消息前打开一个对话框。此时提示缓存已经过期,因此无论选择哪个选项,下一个请求都会重新处理一次完整历史记录。

  • 从摘要恢复会立即执行压缩,因此后续请求携带的是摘要,而不是完整历史记录。每个请求的成本更低,但摘要中被删除的内容将不再可用。
  • 按原样恢复完整会话会加载未修改的对话,保留所有细节,但每个请求的成本会随对话规模增长。

第三个选项会完整恢复会话,并禁止该对话框在之后恢复会话时再次出现。

判断标准其实很简单。如果即将输入的内容依赖之前已经说过的信息,就恢复会话。如果不依赖,就重新开始。只要留意以下情况,就很容易发现上下文已经偏移:Claude 提到您一小时前删除的文件,或者重新争论您在会话开始时已经确定的决定。这就是过时的上下文。继续携带这些内容会同时增加令牌消耗并降低准确性。

如果旧对话中有一项决定或事实,您之后还会再次用到,就不要依赖恢复会话来保留它。将其记录在每个会话都能访问的位置,这正是Claude Code 的记忆文件的用途。

/branch 在这里也很有用。它会复制截至当前时间点的对话,并将您切换到副本,同时保留原始会话不变,并继续显示在会话选择器中。您可以用它尝试第二种方案,而不会丢失第一种方案。

resume 与压缩及 memory 的区别

这些概念经常被混淆,但它们解决的是不同的问题。

resume 用于在退出、重启或转而处理其他任务后,重新恢复整个对话。压缩用于处理正在进行的对话中的上下文窗口:/compact 会用摘要替换 Claude 当前携带的上下文,使后续请求发送更少的 token。如果问题是上下文窗口已满,应使用压缩;管理 Claude Code 上下文窗口对此有完整说明。

memory 又有所不同。CLAUDE.md 文件和自动 memory 会保存每个会话开始时加载的指令和事实,因此它们不是供您返回的对话。它们是您记录下来的内容,这样以后就无需再返回某个对话。

如果您希望同时运行两个对话并让它们相互协作,那是另一种机制。Claude Code 会话可以相互发送消息,前提是两个会话都处于运行状态。这与从磁盘恢复昨天的会话是不同的问题。

FAQ

Claude Code 将会话历史存储在哪里?

默认存储在配置目录下的 ~/.claude/projects/<project>/<session-id>.jsonl 中,其中 <project> 是将非字母数字字符替换为连字符后的工作目录路径。每个文件均采用 JSONL 格式:每行包含一个 JSON 对象,表示一条消息、一次工具调用或一条元数据记录。CLAUDE_CONFIG_DIR 可将配置目录移动到其他位置;在 settings.json 中设置 cleanupPeriodDays 可控制会话记录的保留时长,默认值为 30 天,最小值为 1 天。

为什么我在笔记本电脑的选择器中看不到 VPS 会话?

因为会话记录会写入运行代理的那台机器的磁盘,机器之间不会自动同步。您在 VPS 的 tmux 中进行的对话只存在于 VPS 上。您可以通过 SSH 在 VPS 上恢复该会话;如果需要本地副本,也可以在其中运行 /export,然后将文本文件复制到本地。

我可以恢复在其他目录中启动的会话吗?

可以,但您需要知道该会话的 ID。claude --resume <session-id> 会先在当前项目目录及其 git worktree 中查找,然后在同一台机器上的其他项目中查找。在选择器中,Ctrl+A 会将列表扩展到该机器上的所有项目,Ctrl+W 会将列表扩展到当前仓库的所有 worktree。如果没有匹配项,Claude Code 会报告 No conversation found with session ID: <session-id>

我应该恢复旧会话,还是启动新会话?

如果您的下一条消息依赖于该对话中已经讨论的内容,请恢复旧会话。如果不依赖,请启动新会话,因为恢复会重新加载完整历史记录,之后的每个请求都会携带这些内容。注意上下文偏移:如果会话持续引用您已经删除的文件,说明其中仍保留着过时上下文;这些上下文会在每次交互中消耗 token,并降低准确性。

我可以阻止 Claude Code 将会话记录写入磁盘吗?

可以。CLAUDE_CODE_SKIP_PROMPT_HISTORY 会禁止写入会话记录;--no-session-persistence 会仅针对一次非交互式 claude -p 运行禁止写入。请先了解其影响,因为 resume 依赖会话记录进行恢复;禁用写入后,--continue--resume 将没有可加载的内容。如果您只是担心文件的存储位置,而不是希望完全禁用会话记录,请将 CLAUDE_CONFIG_DIR 指向加密卷,并改为降低 cleanupPeriodDays