Skip to main content

Pi Session 管理:/new /tree /fork /clone /compact

· 8 min read

Pi 把"一次会话"抽象成可遍历的工作单元,五大命令撑起完整的生命周期管理。

  1. 核心概念:Session 是 Pi 多轮对话的工作单元,三次问答 + 一次 /new 就是一段独立历史
  2. 启动与续接/new 新开、pi -c 续最近、pi -r 交互式挑选历史 session
  3. /tree 回退:Pi 特别的对话树设计,历史可跳到任意节点,从那里继续或开新分支,三选项可控制回退方式
  4. /fork vs /clone/fork 从单节点分叉只带之前历史,/clone 复制整棵会话树
  5. 代码回退/tree 只回退对话不碰文件,必须 git 配合才能回滚实际代码改动
  6. /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 进入会话树视图,方向键翻到任意节点回车,会弹出三个选项:

7bBfyP
  1. 不总结——彻底抛弃回退区间内的所有对话历史
  2. 总结(summarize)——让 AI 把那段历史压缩成一段摘要,作为上下文的一部分保留
  3. 告诉 AI 怎么总结——自定义摘要的侧重

/tree 的内部数据结构是 JSONL 树形文件(每个 entry 是节点,靠 id / parentId 串成父子关系),但这篇只讲实战用法——数据结构层面的细节在 Pi 的 Session 是什么?JSONL 树形结构撑起分支、回滚、压缩 里展开过。

summarize 只总结被回退的那一段分支

容易踩的坑: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

命令全景

把上面所有内容收成一张决策图:

三条经验法则

  1. 任务边界用 /new——上一个话题结束、下一个话题开始时,直接清空上下文
  2. 方向探索用 /tree——同任务里发现走错了,跳回中间节点重试
  3. 代码回退必须 git——/tree 不碰文件,磁盘改动只能靠版本管理

References

  1. Pi 大道至简,超越Codex和Claude Code的极简Agent,保姆级全攻略,一期视频精通 —— 技术爬爬虾, 哔哩哔哩, 2026-08-16
  2. Pi 的 Session 是什么?JSONL 树形结构撑起分支、回滚、压缩 —— Kimi Gao, 2026-07-04
  3. Pi 的 Compaction 是什么?自动压缩 + 分支摘要共享一套摘要格式 —— Kimi Gao, 2026-07-07