Claude Code的会话(Session)不仅是"对话历史"——它是一个完整的状态持久化系统,承载着上下文窗口、工具调用记录、Subagent转录和项目元数据。本教程深入解析会话从创建、延续、分支、压缩到归档的全生命周期,帮助你建立高效的对话工作流,避免上下文丢失,实现会话级别的版本控制。适合已掌握Claude Code基础操作、希望提升长期项目协作效率的中高级开发者。
npm install -g @anthropic-ai/claude-code)claude 启动、/help 查看命令)每次启动Claude Code交互会话,系统在 ~/.claude/projects/ 下创建一个JSONL文件。路径结构如下:
~/.claude/
├── projects/
│ └── -home-gprshome-myproject/ # 项目路径编码
│ ├── session-abc123.jsonl # 会话文件
│ ├── session-def456.jsonl
│ └── ...
├── settings.json # 全局设置
└── credentials.json # 认证信息
项目目录名将工作目录的绝对路径做URL安全编码——/home/user/my-project 变成 -home-user-my-project。每个JSONL文件就是一次完整的会话记录。
每个会话文件按行存储,每一行是一个独立的JSON对象(JSON Lines格式):
{"type":"user","message":{"role":"user","content":"帮我分析这个项目的依赖关系"},"timestamp":"2026-05-21T08:30:00Z"}
{"type":"assistant","message":{"role":"assistant","content":"我来分析..."},"timestamp":"2026-05-21T08:30:05Z","toolUses":["Read","Grep","Glob"]}
{"type":"tool_result","toolName":"Read","result":"文件内容...","timestamp":"2026-05-21T08:30:06Z"}
{"type":"summary","content":"用户要求分析项目依赖,已读取package.json和tsconfig.json","contextUsed":45000,"contextTotal":200000}
关键记录类型:
| 记录类型 | 说明 | 用途 |
|---|---|---|
user |
用户输入 | 还原对话历史 |
assistant |
AI回复 | 包含文本和工具调用决策 |
tool_result |
工具执行结果 | Read/Grep/Bash等工具的输出 |
summary |
压缩摘要 | /compact 后的上下文快照 |
metadata |
元数据 | 模型版本、Token消耗、费用 |
会话ID是系统自动生成的唯一标识符(如 abc123def456),贯穿以下场景:
# 查看当前会话ID(在Claude Code内部输入)
/status
# 输出示例:
# Session: a3f8c2e1-9b4d-4f7a-b5e6-1234567890ab
# Context: 45,230 / 200,000 tokens (22.6%)
# Cost: $0.12
这个ID是后续 --resume、--fork-session、/branch 等操作的锚点。
--continue:无缝衔接上次对话最常用的会话延续方式。直接恢复最近一次会话的完整上下文:
# 恢复上一个会话,继续对话
claude --continue
# 简写形式
claude -c
# 恢复并直接发送新消息(非交互模式)
claude --continue -p "继续完成昨天未完成的测试"
工作原理:Claude Code读取 ~/.claude/projects/<project>/ 下最近修改的JSONL文件,加载完整对话历史到上下文窗口,然后进入交互模式。
适用场景: - 昨天的工作今天继续 - 电脑重启后恢复进度 - 午休后无缝衔接
--resume:精确恢复指定会话当你有多个并行会话时,--resume 让你跳转到任意历史会话:
# 列出最近会话供选择
claude --resume
# 输出交互式列表:
# ? Select a session to resume:
# ❯ a3f8c2e1 - "重构认证模块" (2 hours ago, 45K tokens)
# b7d4e3f2 - "修复支付Bug" (5 hours ago, 28K tokens)
# c9e5f4a3 - "添加用户导出功能" (1 day ago, 62K tokens)
# 通过会话ID精确恢复
claude --resume a3f8c2e1-9b4d-4f7a-b5e6-1234567890ab
--continue vs --resume 对比:
| 特性 | --continue |
--resume |
|---|---|---|
| 选择方式 | 自动选最近会话 | 手动选择或指定ID |
| 交互模式 | 可交互也可 -p |
可交互也可 -p |
| 适用场景 | 单线程连续工作 | 多任务并行切换 |
| 上下文加载 | 完整历史 | 完整历史 |
--session-id:命名会话为会话指定一个有意义的标识符,方便后续引用:
# 启动带名称的会话
claude --session-id auth-refactor
# 恢复命名会话
claude --resume auth-refactor
也可以在交互中使用 /session-name 命令重命名当前会话:
> /session-name auth-refactor-phase2
Session renamed to: auth-refactor-phase2
# 列出所有会话(含摘要)
claude --sessions
# 搜索包含特定关键词的会话
claude --sessions --grep "认证模块"
# 在headless模式下搜索
claude -p "列出所有与支付相关的历史会话"
/branch:创建对话决策树/branch(早期版本叫 /fork)是会话管理中最强大的特性之一——它让你在不丢失当前上下文的前提下,探索不同的解决方案路径:
# 在Claude Code交互中
> /branch try-redis-cache
Created branch: try-redis-cache
Current context preserved. You can now explore an alternative approach.
# 现在你可以大胆尝试Redis缓存方案
# 如果不理想,切回主干继续
分支的工作机制:
gitGraph
commit id: "初始对话"
commit id: "分析需求"
commit id: "设计方案A"
branch try-redis-cache
checkout try-redis-cache
commit id: "实现Redis方案"
commit id: "测试失败"
checkout main
commit id: "改用方案B"
commit id: "实现Memcached"
commit id: "测试通过 ✓"
Claude Code为分支创建一份完整的上下文副本。主会话和分支会话互不干扰,你可以用 --resume 在两者之间切换。
--fork-session:从CLI直接分支不需要进入交互模式,直接从命令行创建分支:
# 从最近的会话创建分支
claude --continue --fork-session cache-experiment
# 从指定会话创建分支
claude --resume a3f8c2e1 --fork-session parallel-approach
# 创建分支并立即执行任务
claude --resume a3f8c2e1 --fork-session quick-test -p "尝试用B-tree替代哈希表实现"
场景:重构数据库访问层,不确定用哪种ORM
# 步骤1:在主会话中完成基础设计
> 帮我设计数据库访问层的重构方案
[...完成方案设计...]
# 步骤2:创建分支A - Prisma方案
> /branch try-prisma
> 按照方案用Prisma实现UserRepository
[...完成Prisma实现...]
# 步骤3:切回主会话
> /branch try-typeorm
> 按照方案用TypeORM实现UserRepository
[...完成TypeORM实现...]
# 步骤4:对比评估
> 对比两个分支的实现,分析性能差异
分支管理最佳实践:
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 探索分支 | 快速尝试高风险方案 | 技术选型、架构决策 |
| 调试分支 | 隔离调试过程 | 复杂Bug排查 |
| 并行开发 | 多功能同时推进 | 独立模块开发 |
| 回滚锚点 | 做重大修改前分支 | 不可逆操作前的安全网 |
Claude Code的上下文窗口是有限资源。随着对话推进,Token消耗呈线性增长:
graph LR
A[会话开始<br/>0% 上下文] --> B[轻度对话<br/>20-30%]
B --> C[工具密集调用<br/>50-60%]
C --> D{到达阈值?}
D -->|否| C
D -->|是 60%| E[建议 /compact]
D -->|是 90%| F[自动压缩]
E --> G[手动压缩<br/>保留关键信息]
F --> G
G --> H[压缩后<br/>15-25%]
H --> C
/compact:智能上下文压缩/compact 是保持会话活力的核心命令。它不是简单地"截断"历史,而是让AI生成一份结构化的摘要来替换完整对话:
# 手动压缩(推荐在上下文60%时执行)
> /compact
Compacting conversation...
Summary generated. Context reduced from 125,000 to 18,000 tokens (85.6% reduction).
# 带指令的压缩——强调保留特定信息
> /compact 保留所有已修改文件的路径和修改原因,丢弃工具调用的详细输出
压缩保留了什么:
| 保留 | 丢弃 |
|---|---|
| 用户的核心需求和意图 | 工具调用的原始输出 |
| 已做出的架构决策 | 中间步骤的探索过程 |
| 已修改的文件清单 | 错误重试的过程 |
| 当前任务状态和进度 | 代码片段的讨论过程 |
| Bug的根因分析结论 | 格式化和调整的过程 |
压缩时机策略:
# 策略1:主动压缩(推荐)
在上下文达到50-60%时主动执行 /compact
优点:信息损失最小,AI有足够上下文生成高质量摘要
# 策略2:阈值触发
在上下文达到80%时执行
优点:保留更多细节
缺点:压缩质量下降,接近极限时AI推理能力减弱
# 策略3:阶段转换时压缩
每完成一个子任务后执行
优点:每个阶段有清晰的压缩锚点
/clear:硬重置当你需要完全重新开始,但保留在同一个项目中:
> /clear
Context cleared. Starting fresh in current project.
# 带说明的重置
> /clear 放弃当前方向,从零开始重新设计API
/clear 与 /compact 的本质区别:
| 特性 | /compact |
/clear |
|---|---|---|
| 上下文处理 | 压缩保留关键信息 | 完全清空 |
| 会话文件 | 追加压缩记录 | 追加清空标记 |
| Token节省 | 60-85% | 100% |
| 信息损失 | 最小化 | 全部丢失 |
| 适用场景 | 长会话延续 | 方向完全改变 |
/cost:实时监控Token消耗> /cost
Session cost breakdown:
┌─────────────────────────────────────────┐
│ Input tokens: 89,230 ($0.27) │
│ Output tokens: 12,450 ($0.19) │
│ Cache read: 45,000 ($0.02) │
│ Cache creation: 67,800 ($0.34) │
│─────────────────────────────────────────│
│ Total: $0.82 │
│ Context window: 146,680 / 200,000 (73%) │
│ Suggestion: Consider /compact │
└─────────────────────────────────────────┘
# 终端1:前端模块
claude --session-id frontend-dashboard
> 实现Dashboard页面的数据可视化组件...
# 终端2:后端API
claude --session-id api-v2-endpoints
> 为Dashboard设计REST API端点...
# 终端3:数据库迁移
claude --session-id db-migration-may
> 编写v2到v3的数据库迁移脚本...
每个会话独立运作,互不干扰。完成后可以用 --resume 随时回到任意会话继续工作。
graph TD
A[Day 1: 会话 init-project] --> B[初始化项目结构]
B --> C[/compact 阶段性压缩]
C --> D[完成基础架构]
D --> E[Day 2: --continue]
E --> F[实现核心功能]
F --> G[/branch try-new-algo]
G --> H[Day 3: --resume分支]
H --> I[性能测试与优化]
I --> J[Day 4: --resume主会话]
J --> K[集成与E2E测试]
K --> L[/compact 最终压缩]
L --> M[Day 5: --continue]
M --> N[部署与文档]
不同会话之间不能直接共享上下文,但有几种间接方式:
方法1:CLAUDE.md 作为跨会话记忆
# 在会话A中写入项目状态
> 更新CLAUDE.md,添加以下进度信息:
> - 认证模块已完成(JWT + Refresh Token)
> - 下一步:实现RBAC权限系统
> - 注意事项:使用casbin库,参考/docs/rbac-design.md
# 在会话B中自动继承
claude --session-id rbac-impl
# Claude Code自动读取项目根目录的CLAUDE.md
方法2:文件作为中间产物
# 会话A:生成设计文档
claude -p "将当前认证模块的架构设计写入 docs/auth-architecture.md"
# 会话B:读取设计文档
claude --session-id rbac-impl -p "阅读docs/auth-architecture.md,基于其中的设计实现RBAC"
方法3:/memory 命令写入全局记忆
# 在任意会话中
> /memory 添加:项目使用pnpm,不要用npm
> /memory 添加:数据库迁移必须向后兼容
# 这些记忆会在所有新会话中自动加载
在CI/CD或批量脚本中,会话管理同样重要:
#!/bin/bash
# ci-code-review.sh - CI中的代码审查脚本
# 获取PR变更
git diff origin/main...HEAD > /tmp/pr-diff.patch
# 使用命名会话,方便追踪
claude -p \
--session-id "pr-review-$(date +%Y%m%d-%H%M%S)" \
--output-format json \
--max-turns 5 \
"审查以下代码变更,关注安全问题和性能隐患: $(cat /tmp/pr-diff.patch)"
# 查看历史CI审查会话
claude --sessions --grep "pr-review"
当使用Task工具派发Subagent时,会话的层级关系:
主会话 (session-abc123)
├── 用户请求:"重构整个认证系统"
├── Task工具 → Subagent-1 (session-sub-001)
│ └── 独立上下文:"重构JWT签发逻辑"
├── Task工具 → Subagent-2 (session-sub-002)
│ └── 独立上下文:"重写权限中间件"
└── 汇总结果 → 主会话继续
Subagent拥有独立的上下文窗口,不会污染主会话。Subagent完成后只返回摘要结果给主会话。
对于长期项目,使用Agent SDK将会话持久化到外部存储:
import { ClaudeCode } from '@anthropic-ai/claude-code';
// 自定义会话存储后端
const agent = new ClaudeCode({
sessionStorage: {
// 将会话存储到S3
async save(sessionId, data) {
await s3.putObject({
Bucket: 'claude-sessions',
Key: `${sessionId}.jsonl`,
Body: JSON.stringify(data),
});
},
async load(sessionId) {
const result = await s3.getObject({
Bucket: 'claude-sessions',
Key: `${sessionId}.jsonl`,
});
return JSON.parse(result.Body);
},
},
});
# 内置诊断
> /doctor
Running diagnostics...
✓ API connection: healthy
✓ Context window: 45% used (good)
✓ Session file: intact (2.3MB)
⚠ Last compact: 4 hours ago (consider /compact)
✓ Project config: CLAUDE.md found
✓ MCP servers: 3 connected
# 手动检查会话文件
ls -lh ~/.claude/projects/-home-myproject/*.jsonl
# 输出:
# -rw-r--r-- 1 user staff 2.3M session-abc123.jsonl
# -rw-r--r-- 1 user staff 890K session-def456.jsonl
# -rw-r--r-- 1 user staff 4.1M session-ghi789.jsonl ← 过大,需要compact
一个中型电商平台的后端重构项目,预计3周完成,涉及5个核心模块。
graph TD
subgraph "Week 1: 基础架构"
A1[session: init-scaffold] --> A2[session: db-schema-v2]
A2 --> A3[session: api-gateway]
end
subgraph "Week 2: 核心业务"
B1[session: user-auth] --> B2[session: order-flow]
B2 --> B3[session: payment-integration]
end
subgraph "Week 3: 测试与部署"
C1[session: e2e-testing] --> C2[session: perf-optimization]
C2 --> C3[session: deployment]
end
A3 --> B1
B3 --> C1
Day 1:初始化
# 创建项目并启动首个会话
cd ~/ecommerce-refactor
claude --session-id init-scaffold
# 在会话中
> 这是一个Express.js电商后端项目,需要重构为模块化架构。
> 先分析当前项目结构,然后提出重构方案。
# 完成后压缩
> /compact 保留项目结构分析结果和重构方案决策
# 结束会话
> /cost # 记录消耗:$0.45
> exit
Day 2:数据库设计
# 新会话,但延续项目知识
claude --session-id db-schema-v2
# CLAUDE.md已包含昨日决策,Claude自动继承上下文
> 基于昨天的重构方案,设计新的数据库Schema。
> 要求支持多租户、软删除、完整的审计日志。
# 遇到设计分歧时使用分支
> /branch try-nosql
> 尝试用MongoDB替代PostgreSQL的设计方案
# 评估后决定保留PostgreSQL
> /branch try-multi-tenant-schema
> 用Schema隔离方案实现多租户
# 压缩保存
> /compact 保留最终Schema设计和放弃的方案及其原因
Day 5:认证模块(复杂场景)
claude --continue # 继续昨天的会话
# 上下文已满60%,先压缩
> /compact 保留已完成的认证流程图和JWT配置,丢弃中间调试日志
# 继续开发
> 实现Refresh Token轮换机制
# 发现安全漏洞需要紧急修复
> /branch hotfix-token-validation
> Token验证存在时间攻击漏洞,立即修复
# 修复完成后回到主线
> /compact
> 继续实现RBAC权限系统
Day 10:集成测试
# 恢复多个会话进行集成
claude --session-id integration-test
# 引用之前会话的成果
> 读取以下文件了解已完成模块的接口定义:
> - docs/auth-api.md(来自user-auth会话)
> - docs/order-api.md(来自order-flow会话)
> - docs/payment-api.md(来自payment-integration会话)
>
> 编写跨模块的集成测试
# 使用 /compact 管理大量测试输出
> /compact 保留失败的测试用例和错误信息,丢弃通过的测试详细输出
#!/bin/bash
# session-manager.sh - 项目会话管理工具
PROJECT_DIR="$HOME/ecommerce-refactor"
SESSIONS_DIR="$HOME/.claude/projects/$(echo $PROJECT_DIR | sed 's/\//-/g')"
# 列出所有会话及大小
list_sessions() {
echo "=== 项目会话列表 ==="
for f in "$SESSIONS_DIR"/*.jsonl; do
size=$(du -h "$f" | cut -f1)
name=$(basename "$f" .jsonl)
modified=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$f" 2>/dev/null || stat -c "%y" "$f" | cut -d'.' -f1)
lines=$(wc -l < "$f")
echo "[$size] $name | 修改: $modified | 记录数: $lines"
done
}
# 清理30天前的旧会话
archive_old_sessions() {
echo "=== 归档30天前的会话 ==="
find "$SESSIONS_DIR" -name "*.jsonl" -mtime +30 | while read f; do
echo "归档: $(basename $f)"
gzip "$f" # 压缩但不删除
done
}
# 会话大小预警
check_session_health() {
echo "=== 会话健康检查 ==="
for f in "$SESSIONS_DIR"/*.jsonl; do
size=$(stat -f%z "$f" 2>/dev/null || stat -c%s "$f")
if [ "$size" -gt 5242880 ]; then # >5MB
echo "⚠ $(basename $f): $(( size / 1024 ))KB — 建议compact或归档"
elif [ "$size" -gt 10485760 ]; then # >10MB
echo "🔴 $(basename $f): $(( size / 1024 ))KB — 严重过大!"
else
echo "✓ $(basename $f): $(( size / 1024 ))KB"
fi
done
}
case "${1:-list}" in
list) list_sessions ;;
archive) archive_old_sessions ;;
health) check_session_health ;;
*) echo "用法: $0 {list|archive|health}" ;;
esac
反模式1:永不压缩的巨型会话
# 错误示范
> 继续继续继续... # 上下文95%
> 再加一个功能... # 上下文98%
> 为什么回答质量下降了? # 上下文100%,AI被迫自动压缩
修复:设置心理锚点,上下文超过50%就主动 /compact。
反模式2:单会话承载所有任务
# 错误示范:用同一个会话处理前端、后端、DevOps
> 帮我写React组件
> 然后配置K8s部署
> 再写个数据库迁移脚本
修复:按职责拆分会话,每个会话聚焦一个领域。
反模式3:忽略 /cost 监控
三天后发现API费用远超预期,却不知道哪个会话消耗最多。
修复:每次结束会话前执行 /cost,记录到项目日志。
反模式4:不使用CLAUDE.md传递上下文
每次新会话都要重新解释项目背景、技术栈、编码规范。
修复:维护完善的CLAUDE.md,让每个新会话自动继承项目知识。
反模式5:会话文件无限增长
~/.claude/projects/ 目录膨胀到数GB,影响CLI启动速度。
修复:定期归档旧会话,使用上文的 session-manager.sh 脚本。
| 场景 | 推荐操作 | 频率 |
|---|---|---|
| 长对话持续开发 | --continue |
每日 |
| 多任务切换 | --resume <id> |
按需 |
| 上下文50%+ | /compact |
主动 |
| 方向完全改变 | /clear |
少用 |
| 技术方案探索 | /branch <name> |
按需 |
| 跨日进度传递 | CLAUDE.md + /memory |
每日 |
| 费用控制 | /cost |
每次结束 |
| 会话健康检查 | /doctor |
每周 |
| 旧会话清理 | gzip归档 | 每月 |
会话生命周期命令一览:
# 创建
claude # 新建会话
claude --session-id <name> # 命名会话
# 延续
claude --continue # 恢复最近会话
claude --continue -p "任务" # 恢复并执行
claude -c # --continue的简写
# 定位
claude --resume # 选择历史会话
claude --resume <id> # 恢复指定会话
claude --sessions # 列出所有会话
# 分支
> /branch <name> # 在交互中创建分支
claude --continue --fork-session <name> # CLI创建分支
# 管理
> /compact # 压缩上下文
> /compact <指令> # 带指导的压缩
> /clear # 清空上下文
> /cost # 查看费用
> /doctor # 健康诊断
> /session-name <name> # 重命名当前会话
> /status # 查看会话状态
# 外部
> /memory add <内容> # 添加全局记忆
--continue、--resume、--fork-session完整参考| 维度 | 说明 |
|---|---|
| 适合训练营类型 | Claude Code进阶训练营、AI辅助开发工作坊、团队效率提升培训 |
| 教学时长 | 3-4小时(含实操练习) |
| 学员基础要求 | 已完成Claude Code入门,有1周以上使用经验 |
| 实操占比 | 60%(会话创建/分支/压缩实操)+ 40%(原理讲解) |
| 建议分组 | 2-3人一组,各负责一个模拟项目的不同模块会话 |
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
