Claude Code 如何恢复会话并查找历史记录
了解 Claude Code 如何按名称或 ID 恢复会话、使用选择器切换对话,并找到运行代理的本机上保存的纯文本会话记录。
如何恢复 Claude Code 会话
要恢复 Claude Code 会话,请运行 claude --continue,恢复当前目录中的最近一次对话;也可以运行 claude --resume,从列表中选择较早的会话。在已运行的会话中,/resume 命令可在不退出的情况下切换到其他对话。对应的短命令是 -c 和 -r。
claude --continue
claude --resume
claude --resume auth-refactor如果已经知道会话名称或 ID,可将其作为参数传入。Claude Code 会直接进入该会话,不显示选择器。
以下内容与截至 2026 年 8 月的官方会话文档一致。Claude Code 发布频繁,标志名称和键盘快捷键也会随版本变化。因此,如果本文内容与终端显示不一致,应以 claude --help 和该页面为准。
会话的实际含义
会话是与某个项目目录关联的一段已保存对话。它包含完整的消息历史记录,包括 Claude Code 发起的工具调用,以及这些调用返回的结果。Claude Code 会在您工作期间持续将其写入磁盘,而不是等到最后一次性保存。因此,即使您关闭终端或 SSH 连接中断,对话也不会丢失。
恢复会话时,恢复的不只是文本。完整的对话历史记录会一并恢复,包括该会话使用的模型;如果您使用 --agent 启动了子代理,子代理也会恢复。权限模式同样会恢复,但出于安全考虑存在例外:计划模式和绕过权限模式永远不会恢复。因此,处于其中一种模式的会话恢复后,会使用新会话默认的启动模式。
有些内容不会恢复,因为它们是启动时参数,而不是已保存的状态。使用 --add-dir 添加的目录,以及 --mcp-config、--settings 和 --plugin-dir 等选项,恢复会话时必须再次传入。settings.json 等设置文件会在启动时重新读取,因此其中的内容无需重复指定。凭据同样如此:Claude Code 会在启动时根据您的登录信息和环境确定身份验证方式,而不会随对话一同恢复。因此,如果 VPS 上的 shell 中混入了多余的 ANTHROPIC_API_KEY,恢复的会话就会出现无效 API 密钥错误,即使上次运行正常。
为什么 VPS 上的会话历史更重要
有一个事实常常让人意外:会话记录会写入运行代理的那台机器。它不会保存在您的账户中,也不会同步到云端,而是该机器磁盘上的一个文件。
因此,您在 VPS 的 tmux 窗口中留下的会话,不会出现在笔记本电脑的会话选择器中;笔记本电脑上的会话也不会出现在 VPS 上。两者之间不会传输任何内容。如果您像大多数人在 VPS 上通过 tmux 运行 Claude Code 那样工作,服务器才是实际积累完整会话历史的地方,而您在本地看到的选择器显示的是另一组小得多的会话。
不同界面之间也存在同样的隔离。桌面应用和 VS Code 扩展分别维护自己的会话历史,两者都不是 CLI 的历史记录。Claude Code 网页版也维护独立的会话历史。Cowork 的运行环境更为独立:它运行在 Anthropic 沙箱中,而不是您拥有的硬件上。因此,如果您正在 权衡 Cowork 与 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。
这些 transcript 文件中实际包含什么
每个工具结果都会被记录,因此 transcript 包含 Claude 读取的文件内容,以及 Claude 运行的命令输出。Anthropic 的数据使用页面对此有明确说明:Claude Code 会以明文形式将会话 transcript 本地存储在 ~/.claude/projects/ 下。
请考虑这在服务器上意味着什么。如果 Claude 读取了 .env 文件,以确定服务无法启动的原因,那么该文件的内容现在就位于主目录中的 JSONL 文件里。如果某条命令打印了连接字符串,该字符串也会记录在其中。没有发生数据泄露。transcript 只是记录发生过的操作,这正是它的用途,也正因为如此,您必须将其纳入威胁模型。
- 备份:直接备份
/home或/root时,transcript 也会被复制到备份存储中。请添加排除规则,或接受提示内容和文件内容的副本现在会存放在备份存储中。 - 快照和镜像:无论出于何种原因创建的 VPS 快照都会包含整个目录。用于构建第二台服务器的克隆镜像也一样。
- 服务器上的其他账户:请使用
ls -ld ~/.claude ~/.claude/projects自行检查权限模式,不要假定权限限制足够严格。 - 主动上传:
/feedback命令会主动将对话历史发送给 Anthropic,/bug和/share也会通过相同路径上报。这些都是您主动选择的操作,因此在确认之前,请先了解您同意的内容。
如果您不希望生成 transcript,CLAUDE_CODE_SKIP_PROMPT_HISTORY 会禁止写入 transcript;对于单次非交互式 claude -p 运行,--no-session-persistence 会禁止写入 transcript。设置任一选项前,请明确了解其中的取舍。resume 读取 transcript,因此没有 transcript 就无法 resume。
如何查找旧对话
使用 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 格式可靠得多。
重新开始优于恢复会话的情况
恢复会话会带回完整历史记录,而后续每个请求都会携带这份完整历史记录。昨天运行了 4 个小时的会话,今天继续使用时成本很高;长会话中的令牌用量如何累积解释了这些成本的实际来源。
Claude Code 有时会提供折中方案。在 Pro 或 Max 计划中,如果某个会话已闲置约 1 小时且包含超过 100,000 个令牌,恢复该会话时,Claude Code 会在您发送第一条消息前打开对话框。此时提示缓存已过期,因此无论选择哪个选项,下一个请求都会重新处理完整历史记录 1 次。
- 从摘要恢复会立即执行压缩,因此后续请求携带的是摘要,而不是完整历史记录。每个请求的成本更低,但摘要中被删除的内容将不再可用。
- 按原样恢复完整会话会加载未更改的会话,保留所有细节,但每个请求的成本会随会话大小增长。
第三个选项会完整恢复会话,并阻止该对话框在以后恢复会话时再次出现。
判断方法比看起来简单。接下来要输入的内容依赖于先前的对话时,就恢复会话;不依赖时,就重新开始。只要留意这些迹象,就很容易发现上下文已经偏移:例如 Claude 提到您 1 小时前删除的文件,或重新争论您在会话开头已经确定的决定。这就是过时的上下文。继续携带这些内容既会消耗令牌,也会降低准确性。
如果旧会话中有一项决定或一个事实以后还会用到,不要依赖恢复会话来保留它。将其记录在每个会话都能访问的位置,这正是 Claude Code 的记忆文件的用途。
/branch 在这里也很有用。它会复制截至当前点的对话,并切换到副本,同时保留原会话不变,使其仍显示在选择器中。您可以用它尝试第二种方法,而不会丢失第一种方法。
resume 与压缩及记忆的区别
这几个概念经常混淆,但它们解决的是不同的问题。
resume 用于在退出、重启或转去处理其他任务后,恢复整个对话。压缩处理的是实时对话中的上下文窗口:/compact 会用摘要替换 Claude 当前保留的内容,使后续请求发送更少的 token。如果问题是上下文窗口已满,应使用压缩工具,管理 Claude Code 上下文窗口对此有完整说明。
记忆又有所不同。CLAUDE.md 文件和自动记忆会在每个会话开始时加载指令和事实,因此它们不是供您返回的对话。它们是您记录下来的内容,这样以后就不必再返回原对话。
如果您希望同时运行两个对话并让它们相互协调,那是另一种机制。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 会禁止写入会话记录;对于单次非交互式 claude -p 运行,--no-session-persistence 会禁止写入。请先了解这一取舍,因为恢复功能依赖会话记录;禁用写入后,--continue 和 --resume 将没有可加载的内容。如果您关心的是文件的存储位置,而不是完全禁止生成文件,可以将 CLAUDE_CONFIG_DIR 指向加密卷,并改为降低 cleanupPeriodDays。