会话管理:--continue、--resume、会话命名与导出
会话是什么
一次会话(session)就是一段绑定到项目目录的对话,Claude Code 边聊边把它存成本地 JSONL 转录文件。退出、崩溃、/clear 都不等于丢失——会话像游戏存档,随时可以读档回来。这套机制是 --continue、--resume、/rewind、/export 共同的地基。
六个入口,覆盖所有回来场景
| 命令 | 作用 |
|---|---|
claude --continue(或 -c) |
接续当前目录最近一次会话 |
claude --resume |
弹出会话选择器 |
claude --resume <名字> |
按名字直接恢复 |
claude --resume <ID> |
按会话 ID 恢复(可跨目录,甚至跨项目) |
claude --from-pr 1234 |
列出与某个 PR 关联的会话 |
/resume |
会话内切换到别的会话 |
日常九成的需求是 claude -c:早上的重构下午接着干。稍复杂的就 claude --resume 挑列表。有个细节:转录文件按项目目录归档,--resume <ID> 找不到时它会在当前项目和 worktree 里找,再到全机其他项目找,但要求全机只有一份匹配,宁报"没找到"也不猜。
命名:让会话可以被一句话找回
并行任务一多,"哪个会话是干嘛的"就成了问题。命名是解药,有四个入口:
claude -n auth-refactor # 启动时命名
/rename auth-refactor # 会话中改名(也显示在提示栏)
会话选择器里高亮一条按 Ctrl+R 也能改名;计划模式批准计划时会自动生成一个基于计划的标题(你没手动命名的话),这个标题同样可以作为恢复句柄。没命名的会话也有默认显示名(目录名加两位后缀),但那只是显示用,不能拿来 --resume。
会话选择器的完整键位
claude --resume 打开的选择器功能比想象的多,值得花两分钟记键位:
| 键 | 功能 |
|---|---|
| 上/下 或 k/j | 移动 |
| 数字 1-9 | 直接恢复对应行 |
| Space | 预览会话内容 |
| Ctrl+R | 重命名 |
| 直接打字 | 搜索过滤(贴 PR URL 能找到创建该 PR 的会话) |
| Ctrl+W | 扩大到本仓库所有 worktree 的会话 |
| Ctrl+B | 只看当前 git 分支的会话 |
| Ctrl+A | 扩大到本机所有项目 |
默认列表显示当前 worktree 的会话,多 worktree 用户重点记 Ctrl+W 和 Ctrl+B。
分叉与分支:两条路都试试
发现方向错了想试另一条路?两条路可选:/branch [名字] 复制当前对话并切进副本,原对话原封不动留在选择器里随时回去;命令行上 claude --continue --fork-session 同理但开在新进程。恢复会话时权限模式也基本跟着还原(计划模式例外较多),细节以官方会话文档为准。
两者的取舍很简单:想在同一个终端里继续操作就用 /branch(进程不换,"本次会话内不再询问"的权限授权也会带过去);想让副本独立跑就用 --fork-session(新进程,权限要重新批)。相关命令还有 /fork(把对话复制成后台会话,本会话继续干活)和 /subtask(派一个继承完整对话的子代理去干副活,结果回到主对话)——它们构成一个完整的"对话分身术"工具箱。
打几个比方理清关系:--continue 是存档续玩,/branch 是读档后另开一个存档位——主线剧情不丢,支线随便浪;/fork 是把存档交给朋友去打,你继续主线;/subtask 是让分身去打副本,装备(结论)带回来。
转录文件、保留期与崩溃恢复
会话数据的存储细节值得知道,因为总有一天你要跟它打交道:
- 位置:
~/.claude/projects/<项目名>/<会话ID>.jsonl,项目名是工作目录路径的非字母数字字符换成-得来的; - 内容:每行一个 JSON 对象——消息、工具调用、工具结果全在里面,明文存储;
- 保留期:默认 30 天后随清理扫除(
cleanupPeriodDays可改,最小 1 天);自动记忆目录不受清理影响; - 隐私提示:转录是明文。如果会话中读到了密钥或敏感文件,它们就在磁盘上的转录里。敏感环境调低保留期,或用权限规则禁止读密钥文件。
崩溃恢复是转录机制的隐性福利:进程挂了,工作重开 claude -c 就接上了。被中断的工具调用会在恢复时标记"未完成",Claude 被告知先检查是否生效再决定重跑——不会出现"crash 后重复扣款"式的二次执行。
一个使用纪律:同一个会话别在两个终端里同时开着。没有分叉地恢复同一会话,两边消息会交织进同一条转录,历史会变得混乱。要在两处接续就先 /branch 分叉。
导出与会话数据的归宿
人看的导出用 /export:可复制到剪贴板或存成纯文本文件,消息和工具输出都渲染成可读格式。写事故复盘、给同事展示问题现场,都用它。
脚本用的接口是另一套:
# 结构化拿结果(JSON 里有 result、session ID、用量、成本)
claude -p "总结这次改动" --output-format json | jq -r '.result'
# 给已有会话追问一句并拿结构化回答
claude -p --resume <session-id> --output-format json "我们改了哪些文件"
转录原文存在 ~/.claude/projects/<项目>/<会话ID>.jsonl,每行一个 JSON 对象。注意官方明确说这个内部格式随版本可能变,脚本别直接解析它,走 /export 或上面的结构化接口。默认保留期 30 天(cleanupPeriodDays 可调),自动记忆不在清理范围。想手动删某个项目的全部数据用 claude purge <路径>,支持 --dry-run 预览删除计划。
三个真实使用场景
场景一:跨天的重构。 周五的重构进行到一半,周一 claude -c 接上。恢复后它会先复述一下"我们做到哪了",你确认或纠正后继续——比重新口头同步上下文快十倍。
场景二:一次失败的尝试要复盘。 方案 A 试了三天失败,/rewind 回到决策点,/branch 出一条方案 B 的支线继续。方案 A 的全过程留在原会话里当反面教材,复盘会上 /export 导出直接用。
场景三:交接。 你休假,同事接手。他 claude --resume 从选择器里找到你命名清晰的会话,/recap 一句话看清现状,继续干活。命名 + 导出 + 摘要,三件套交接无摩擦。
恢复时能带回来什么
--resume 恢复的不只是消息。完整清单值得过一遍,知道边界在哪才不会踩空:
| 恢复项 | 行为 |
|---|---|
| 对话历史 | 全量还原;压缩过的会话从摘要处接续 |
| 模型 | 沿用会话当时的模型 |
| 权限模式 | 终端 --continue / --resume 名字或ID 会还原当时的模式;从选择器恢复则按新会话规则 |
| 计划模式 | 会话结束时在 plan 模式,恢复时通常还在 plan 模式 |
| 会话内定时任务 | 未过期的会被还原 |
| 活跃目标(goal) | 带过来,但计数和计时重置 |
| 被中断的工具调用 | 标记为"未完成",Claude 先核查再决定重跑 |
| 启动参数 | --mcp-config、--settings、--add-dir 等需重传;settings.json 里的常规配置自动重读 |
特别说明 claude -p 与 Agent SDK 创建的会话:它们不出现在选择器、也不被 --continue 覆盖,但可以用 claude --resume <ID> 精确恢复——脚本里产出的会话照样可以人工接管。
后台会话(挂到后台跑的)也在恢复体系里:选择器里标着 bg,恢复一个还在跑的后台会话会直接附着上去而不是重复加载。
一句话总结本章:会话是资产,命名是索引,导出是出口。 把这套机制用顺之后,你会发现"关机焦虑"消失了——任务可以放心切走,一切都能回来。
本章由 WorkBuddy 原创整理,事实性内容参考 Claude Code 官方文档。
