Pi Session 管理:tree、fork、clone 与 handoff
最喜欢 Pi 的特性之一就是对 session 的管理很方便。Pi 的 session 不是线性的——它是树形的。每次回溯到某个历史节点重新发消息,就会在那个点分出一个新分支。
先看 session 长什么样
下面是一段典型的对话树:
user: "帮我写一个排序函数"
└─ assistant: "这是冒泡排序..."
├─ user: "改成快排" → assistant: "这是快速排序..."
│ └─ user: "加注释" → assistant: "已加注释" ← 当前活跃
└─ user: "用 Rust 写" → assistant: "这是 Rust 版本..."
你随时可以回到"帮我写一个排序函数"或"改成快排"那个点,走另一条路。走了新路之后,原来的分支不会消失——它还保存在同一个 session 文件里。这就是 Pi 的 /tree ,目前 Claude Code 和 Codex 都还没有到特性。
/tree — 同一Session内切换分支
不创建新 session 文件。 打开一个树形导航器,显示当前 session 的全部对话节点。
在 /tree 里你可以:
- 选一条用户消息:光标移到该消息的父节点,编辑器预填那条消息的原文,你可以修改后重新提交——形成新分支
- 选一条 assistant 消息或工具结果:光标移到该消息位置,编辑器为空,直接从那个点继续
- 切换分支时:Pi 可以(可选)把"被抛弃的分支"总结成一段摘要,附到新位置。这样不用回看旧分支也能知道那边发生了什么
常用按键:↑↓ 浏览、Enter 选择、Esc 取消、Shift+L 打标签、Ctrl+O 切换过滤模式(默认/隐藏工具结果/只看用户消息/只看有标签的)。
适用场景:想在同一话题下探索"如果当时选另一个方案",但不想把 session 拆成好多文件。
/fork — 从历史消息创建新 session
创建一个全新的 session 文件。 打开一个选择器,只列出用户消息。选一条之后,Pi 用一个新的 session 文件,从那条消息的父节点开始。
/fork 和 /tree 的关键区别:
/tree在原地分支,所有东西都在一个文件里。如果分支很多,文件会越来越大。/fork把指定节点拆出去,形成独立的 session 文件。可以单独命名、单独 resume、单独压缩。原 session 不受影响。
/fork 的新 session 会带着 fork 点之前的所有上下文。
适用场景:一个 session 里聊了太多不同话题,想把某个方向拆出去独立跟进。比如"我们在修 bug 的途中发现了一个新需求"——把新需求 /fork 出去就不会和 bug 修复混在一起。
/clone — 复制当前分支为新 session
创建新文件,把当前活跃分支完整复制过去。起点就是当前所在的节点。
和 /fork 的区别:
/fork让你选一个历史节点,从那里分岔/clone不选——你当前在哪个节点,就从哪个节点复制
等效于"把我当前已经聊出来的这条路,完整拷贝一份"。原 session 还在原处,但你可以在拷贝里随意折腾而不影响原文件。
适用场景:当前分支的方向已经不错了,但你想在不搞乱原文件的前提下做大量修改性探索。或者你想给当前的进展留一个"快照",以防接下来改崩了。
也可以用 CLI 启动:pi --fork <path|id> 或 pi --clone。
/handoff — 用 LLM 提炼后交接
这是 extension,不是内置命令。 需要先安装:
cp ~/.nvm/versions/.../examples/extensions/handoff.ts ~/.pi/agent/extensions/
前面三个命令都是"机械式"的分支操作——原样复制或切分对话。/handoff 不同:它先让模型(默认)把当前对话总结提炼,再创建新 session。
执行 /handoff <目标> 时发生的流程:
-
收集当前 session 的对话历史(包括压缩过的部分)
-
调用模型分析:关键决策是什么、涉及了哪些文件、现在在做什么
-
生成一个结构化的 prompt:
## Context We've been working on X. Key decisions: - Decision 1 - Decision 2 Files involved: path/to/file1.ts, path/to/file2.ts ## Task [清晰描述下一步该做什么] -
创建新 session,把生成的 prompt 预填到编辑器里
-
你可以审核、编辑,然后直接发送
适用场景:对话了几百轮,上下文要爆了,但还需要继续做相关的工作。直接 /new 会丢失大量背景;但原样带着全部历史又不现实。/handoff 让 LLM 帮你提炼关键信息,用很小的上下文窗口携带最重要的事。也是从一个大型任务过渡到下一个子任务的理想方式。
四种方式对比
/tree |
/fork |
/clone |
/handoff |
|
|---|---|---|---|---|
| 创建新文件 | 否 | 是 | 是 | 是 |
| 选择起点 | 任意节点 | 任意用户消息 | 当前活跃分支 | 当前上下文 |
| 上下文处理 | 原样保留,可加分支总结 | 从切点开始,带之前的上文 | 完整复制当前分支 | LLM 总结提炼 |
| 新 session 预填 | 原消息文本或空 | 原消息文本 | 最后一条用户消息 | 生成的精炼 prompt |
| 适用场景 | 同文件内探索备选方案 | 拆分历史话题独立跟进 | 备份当前分支再改 | 上下文太长需要"交接" |
| 内置/extension | 内置 | 内置 | 内置 | 需安装 handoff.ts |
什么时候用哪个
- 只是想"试试另一个方案" →
/tree,不增加文件,干净 - “这个话题太大,单独拆出去” →
/fork,从那条起始消息创建独立 session - “当前方向不错,我想留个备份再放开了改” →
/clone - “聊了太多轮了,上下文要满了,但下个任务还需要这些背景” →
/handoff