Pi Session 管理:/new /tree /fork /clone /compact
Pi 把"一次会话"抽象成可遍历的工作单元,五大命令撑起完整的生命周期管理。
- 核心概念:Session 是 Pi 多轮对话的工作单元,三次问答 + 一次
/new就是一段独立历史 - 启动与续接:
/new新开、pi -c续最近、pi -r交互式挑选历史 session - /tree 回退:Pi 特别的对话树设计,历史可跳到任意节点,从那里继续或开新分支,三选项可控制回退方式
- /fork vs /clone:
/fork从单节点分叉只带之前历史,/clone复制整棵会话树 - 代码回退:
/tree只回退对话不碰文件,必须 git 配合才能回滚实际代码改动 - /compact vs /new:压缩省空间但模糊重点,清空彻底但丢弃中间细节
Session 是什么?
Session 是 Pi 多轮对话的工作单元。跟 AI 来回三轮问答、加上若干次工具调用,整个过程被打包成一个 session——不是单条消息,而是包含"上下文"在内的一段连续历史。
这跟普通聊天窗口最大的区别:每次对话不是孤立的对话框,而是一段有 ID、能续接、能分叉、能回退的连续历史。session 一旦创建,会写到 ~/.pi/agent/sessions/ 下,按工作目录分组存档。
启动姿势:三种 flag
裸 pi 默认是新建 session,不是续接。要续接最近一 次 session 必须显式传 -c。
| 命令 | 行为 | 适用 |
|---|---|---|
pi | 新建 session(默认) | 第一次进项目、或主动开新工作 |
pi -c | 续接最近一次 session(同 cwd 下) | 中断后继续上次工作 |
pi -r | 交互式 picker 挑选历史 session | 想跳到非最近的工作 |
/new 是 TUI 内部的命令——进入 Pi 之后输入 /new 会清空上下文、保留当前 session 文件做存档。它跟 pi -c 的关系是"续接 vs 重开":-c 把上次的对话重新加载进来,/new 是同一 session 文件上开一个新分支。
注意:Pi 的 session 按工作目录分组。在项目 A 启动的 session 不会出现在项目 B 的 -r 列表里。
/tree:会话树与节点回退
Pi 的 session 不是线性消息流,而是一棵可遍历的节点树。所有用户消息、模型响应、工具调用都在树上,每个节点都能被单独选中回退——这是 /tree 命令的核心能力。
输入 /tree 进入会话树视图,方向键翻到任意节点回车,会弹出三个选项:

- 不总结——彻底抛弃 回退区间内的所有对话历史
- 总结(summarize)——让 AI 把那段历史压缩成一段摘要,作为上下文的一部分保留
- 告诉 AI 怎么总结——自定义摘要的侧重
/tree 的内部数据结构是 JSONL 树形文件(每个 entry 是节点,靠 id / parentId 串成父子关系),但这篇只讲实战用法——数据结构层面的细节在 Pi 的 Session 是什么?JSONL 树形结构撑起分支、回滚、压缩 里展开过。
容易踩的坑:summarize 不是"总结所有历史",而是"总结被回退的那一段分支"。其它分支上的对话历史默认不会被触及。
举一个具体的例子:
第一个节点是「加苹果」。从它分叉出两条线——加香蕉 和 桃子→菠萝(summarize 范围)。选 summarize 之后,AI 收到的是「苹果→桃子→菠萝」这段分支的总结,加香蕉那一段默认不在 summary 里——它属于另一条独立路径,除非显式跳过去,否则 AI 不会知道。
代码回退:/tree 不会动文件
高频踩坑:/tree 只回退对话历史,不动磁盘上的任何文件。已经写完的代码不会跟着回滚。
典型场景:你让 AI 写了水果列表,又继续往里加了海鲜;现在想回退到只有水果的状态。
光靠 /tree 不够,必须配合 git:
# 1. /tree 回退对话历史
/tree → 选中"加苹果"那个节点 → summarize
# 2. git 配合回退代码
git reset --hard <加苹果时的 commit id>
两件事各管一个维度:
| 维度 | 工具 |
|---|---|
| 对话历史 | /tree |
| 磁盘文件 | git reset / git checkout |
混用会留坑:只回对话不回代码,AI 会以为"什么都没写过",下次操作时容易基于残缺的代码状态做修改——比如你以为列表已经被清空了,但 AI 看到文件里还有残留的旧内容,继续往里加东西。
/fork vs /clone:单节点 vs 整树
/fork 和 /clone 是两个容易混淆的命令,差别在"复制哪一段历史":
| 命令 | 行为 | 适用 |
|---|---|---|
/clone | 复制整棵 session 树,包括所有分支 | 存档当前进度 |
/fork | 选一个对话节点,从该节点起复制到当前 leaf | 跳过"试错的中间过程" |
/clone 适合在开始新方向前留个完整快照;/fork 适合"前面试了一些废话,只想从中间某个干净的节点开始新对话"。
举一个典型场景:当前 session 经过了 "试了方案 A → 不行 → 试了方案 B → 也不太行 → 现在有方案 C 的思路"。/clone 拿到的是包含 A、B、C 全部尝试的完整副本;/fork 选"C 思路"那个节点起跳,干净地从那里继续。
/compact vs /new:压缩还是重开
关键经验:清空好于压缩。
/compact 用在上下文快爆了的时候——Pi 把之前的对话历史压缩成一段总结,腾出上下文空间。/new 直接新开会话,AI 完全不记得之前发生了什么。
为什么"清空 > 压缩"?因为对话历史是注意力噪声:
- 越长的历史,AI 越容易把注意力分散到无关信息上
- 压缩摘要信息密度高,但模型对"压缩过的旧事"的关注度天然低于"正在写的新事"
- 一段任务结束 + 重新开始,比"续着旧任务 + 压缩历史"的输出质量更稳
/compact 的真正适用场景:
- 一个长任务做到一半,中途想换模型或换思考强度但又不想丢上下文
- 上下文窗口确实快爆了,再加一条新消息就报错
其他时候,任务一结束就 /new。
命令全景
把上面所有内容收成一张决策图:
三条经验法则:
- 任务边界用
/new——上一个话题结束、下一个话题开始时,直接清空上下文 - 方向探索用
/tree——同任务里发现走错了,跳回中间节点重试 - 代码回退必须 git——
/tree不碰文件,磁盘改动只能靠版本管理
References
- Pi 大道至简,超越Codex和Claude Code的极简Agent,保姆级全攻略,一期视频精通 —— 技术爬爬虾, 哔哩哔哩, 2026-08-16
- Pi 的 Session 是什么?JSONL 树形结构撑起分支、回滚、压缩 —— Kimi Gao, 2026-07-04
- Pi 的 Compaction 是什么?自动压缩 + 分支摘要共享一套摘要格式 —— Kimi Gao, 2026-07-07