什么是 Session Branching
Session Branching 是 OpenClaw v2026.4.7 新增的会话管理能力,允许用户在对话的任意检查点分叉出新的会话路径,并在需要时恢复到之前的状态。
这借鉴了 Git 的分支模型:
- 主会话是 main 分支
- 从任何时间点可以 fork 出 feature 分支
- 尝试失败的分支可以丢弃
- 成功的分支可以合并回主线
底层原理
会话以追加式事件日志(append-only event log)形式存储:
- 每次对话消息、工具调用都是一个事件
- 事件带有时间戳和 ID
- 分支就是从某个事件 ID fork 新的事件流
- 状态可以通过回放事件日志恢复
这种设计让 Session Branching 具有:
- 无损:原始会话永不丢失
- 可追溯:每个分支都有完整历史
- 可恢复:任何时刻都可以回到之前状态
适用场景
1. 风险重构
尝试重大代码重构但不想污染主会话:
[main] 讨论架构...
↓
[main] 开始重构
↓ (fork)
[try-new-arch] 尝试新架构
↓
[try-new-arch] 失败,回滚
↓
[main] 继续原方案
2. Prompt A/B 测试
对比不同指令策略的效果:
[main] 任务描述
↓ (fork 3 个分支)
[strict] 严格模式指令
[creative] 创意模式指令
[balanced] 平衡模式指令
对比结果后选最优分支继续。
3. 故障调试
调试生产事故时尝试不同假设:
[main] 收到告警
↓ (fork)
[hypothesis-a] 假设是数据库问题
[hypothesis-b] 假设是网络问题
[hypothesis-c] 假设是代码 Bug
验证每个假设后回到主会话报告结论。
基础命令
创建分支
在任意会话中:
/branch create feature-test
或指定 fork 点:
/branch create feature-test --from-event abc123
列出分支
/branch list
输出示例:
* main (当前)
try-new-arch (2 hours ago)
prompt-strict (30 minutes ago)
切换分支
/branch switch try-new-arch
删除分支
/branch delete prompt-strict
查看分支历史
/branch history main
CLI 管理
命令行同样支持会话分支操作:
# 列出某个会话的所有分支
openclaw sessions branches <session-id>
# 创建分支
openclaw sessions branch <session-id> --name feature-test
# 恢复到历史事件
openclaw sessions restore <session-id> --event <event-id>
实际案例
案例 1:尝试数据库迁移方案
用户:我想把 MySQL 迁移到 PostgreSQL,但不确定可行性
Agent:[main] 让我先分析当前 schema...
用户:/branch create try-pg-migration
Agent:[try-pg-migration] 已切换到分支
我建议尝试以下迁移方案:
1. 使用 pgloader
2. 手动 dump/restore
3. 逐表迁移
[尝试使用 pgloader]
发现部分字段类型不兼容...
用户:这个方案不太行,我们回去
用户:/branch switch main
Agent:[main] 回到主会话
pgloader 方案遇到字段类型问题,让我们尝试手动迁移...
案例 2:调试复杂 Bug
用户:生产环境 500 错误
Agent:[main] 开始分析日志...
用户:/branch create hypothesis-db
Agent:[hypothesis-db] 假设:数据库连接池耗尽
[检查连接数] 连接数正常,排除
用户:/branch create hypothesis-memory
Agent:[hypothesis-memory] 假设:内存泄漏
[检查 heap dump] 发现某个 Service 持续增长
用户:找到了!/branch switch main
Agent:[main] 根据分支调试结果,问题是内存泄漏
检查点管理
系统会自动在关键节点创建检查点:
- 每次
/reset之前 - 每次
/compact之前 - 工具调用失败时
- 手动触发:
/checkpoint create "重要节点"
恢复到检查点:
/checkpoint list
/checkpoint restore <checkpoint-id>
分支合并
简单的合并(将分支的状态更新到主会话):
/branch merge feature-test --into main
这会将 feature-test 的最新事件应用到 main,保留 main 原有历史。
与 Memory-Wiki 配合
Session Branching 和 Memory-Wiki 可以配合使用:
- 在分支中学到的信息,值得保留的可以写入 Wiki
- 即使分支被删除,Wiki 中的知识仍然保留
- 这样既保持主会话简洁,又不丢失探索成果
[try-new-arch] 测试完新架构,决定放弃
↓
将测试结果写入 memory/wiki/decisions/2026-04-arch-eval.md
↓
删除 try-new-arch 分支
↓
主会话中仍可通过 Wiki 访问评估结果
注意事项
- Session Branching 需要 OpenClaw v2026.4.7 或更高版本
- 分支过多会增加存储开销,建议定期清理已完成的分支
- 工具调用的外部副作用(文件修改、API 调用)无法通过分支回滚
- 对于涉及真实副作用的操作,建议配合 Lobster 的审批门控
- 合并分支时注意事件冲突,复杂合并可能需要人工介入