龙虾AGI通用实验室Lobster AGI Lab · est. 20262026 · 09 · 16
首页 / 文章 / AI持续学习
AI持续学习

之前的文章白写了?Claude Code 原来自带对话分叉

格里灰丝2026-06-19约 2810 字Markdown 原文

之前我写过一篇文章《Claude Code的上下文对话想分叉怎么办?我有一个技巧》,聊了一个实际需求:在 Claude Code 里跑了很长的对话,临时想岔开去讨论另一个话题,但又不想丢失已有的上下文。当时我的方案是找到对话历史的 .jsonl 文件,手动复制一份到新目录,再分别 resume。能用,但不优雅,还踩了工作目录跑回原目录的坑。

今天我发现完全没必要这么折腾。Claude Code 内置了一个命令 /branch,一行搞定分叉。我之前竟然不知道。

但这篇文章不只是来说"用 /branch 就行了"这句话的。用了之后我发现有些细节值得展开聊聊,特别是它跟我之前手动方案的关系,以及一些容易搞混的地方。

· · ·

先说用法,三十秒讲完

在 Claude Code 的对话里输入:

/branch

回车。当前对话被完整复制一份,你自动跳到新分支里。原来的对话还在,一字不动。终端会告诉你原会话的 session ID,想回去就 /resume

这里强调一下"完整复制"。官方文档说得很明确:"The branch starts with the full prior context, not a summary of it." 新分支拿到的是你完整的对话历史,不是什么 AI 生成的摘要。你之前跟 Claude 聊的每一个细节、定下的每一个决策,新分支里全都有。

想两条路同时推进?开两个终端窗口:

终端 A:claude -r <原会话ID>,继续之前的工作

终端 B:就是你当前的新分支,去干别的事

两个窗口各走各的,互不影响。完事。

用法就这么简单,接下来是我觉得更值得聊的部分。

· · ·

那行蓝色的字到底是什么

执行 /branch 后,我在终端里看到了一行蓝色高亮:

This session is being continued from a previous conversation that ran out of context.

第一反应是:"ran out of context"?上下文耗尽了?但我两个分支都能正常继续聊天,完全没有任何问题。

去搜了一下,在 Claude Code 的 GitHub 仓库里找到了一个 issue(#11367),有人抱怨的就是这句话。这段文字是自动压缩(auto-compact)触发时留下的固定标记。所有被压缩过的会话,描述都会变成这同一句话。

也就是说,这句话不是 /branch 产生的。是我的对话在更早的时候就已经触发过一次自动压缩,这行字是当时留下的。/branch 只是忠实地把当前状态复制了一份,包括这行字。

搞清楚这一点之后,整个事情就理顺了:自动压缩是自动压缩,分支是分支,两个机制完全独立。之所以容易混淆,是因为对话越长,越容易触发压缩,也越需要分支,经常前后脚出现。

· · ·

跟 Git 分支的异同

用 Git 来类比最直觉,但有一个关键区别必须说清楚,不然用的时候会有错误预期。

像 Git 的地方: 可以从当前状态分叉、分叉后各自独立、可以随时切回任意分支。

不像 Git 的地方:没有 merge。

分出去就是分出去了,永远不会合回来。两个分支是两个完全独立的对话,没有任何机制把它们的成果合并到一起。

这不是功能缺失。对话上下文是线性的流,不像代码文件可以做三方 diff。想想也是,两个对话各自聊了半小时,怎么合?谁的上下文在前谁的在后?没法定义。

接受这个设定反而用起来更爽:不用纠结"之后怎么合",想分就分,用完就扔。

· · ·

跟我上次的手动方案比一下

写到这里,忍不住把 /branch 和我上篇文章里的手动方案对照了一下。

手动方案的流程: 找到 ~/.claude/projects/ 下的 .jsonl 文件 → 建新目录 → 算路径编码 → 复制文件 → 两个终端分别 resume。

/branch 的流程: 输入 /branch,回车。

功能上两者的核心逻辑是一样的,都是把对话历史复制到一个新的 session 里。但 /branch 解决了手动方案的几个痛点:

不用自己算路径编码了。 上次那个把 D:\my-project\foo 编码成 D--my-project-foo 的规则,不需要知道了。

工作目录不会跑回原目录了。 手动方案最大的坑是新目录 resume 后,Claude 的文件操作会跑回原来的目录。/branch 没有这个问题。

不过手动方案有一个 /branch 做不到的事:从历史上的任意一个点分叉。/branch 只能从当前状态分叉。如果你想从三十条消息之前的某个节点分出去,目前只能用手动方式(或者先 /rewind 回到那个点再 /branch)。这个需求在 GitHub 上已经有人提了 feature request。

· · ·

几个实际场景

方案对比。 做一个功能,想到了两种思路,不确定哪个好。/branch,两条路各自实现,跑一跑,挑好的那个。另一条路直接关掉,不心疼。

主线 + 临时任务。 正在做 feature,突然来了个紧急 bug。/branch,一条路继续 feature,另一条路去修 bug。修完关掉就行。

探索性尝试。 想试一个不确定能不能行的方案,直接在主线上试又怕搞乱上下文。分出去试,不行就丢,主线干干净净。

对话快满了,主动续命。 上下文接近上限时,与其等系统自动压缩(会损失细节),不如在一个干净的节点主动 /branch,带着完整上下文开始新会话。

· · ·

回头看

上篇文章里我写过一句话:"Claude Code 没有分叉这个功能。但我在折腾的过程中发现了一些技巧。"

现在知道了,Claude Code 有这个功能,而且很早就有了(v2.1.77 就加入了,当时叫 /fork,后来改名 /branch)。

但我不后悔走了那段弯路。手动翻 .jsonl 文件的经历让我理解了 Claude Code 对话存储的底层结构,理解了 session 和项目路径的关联方式,也理解了 resume 的工作原理。正是因为手动实现过一遍,今天看到 /branch 的时候我才能立刻明白它在干什么,以及它的边界在哪里。

工具会进化,手动方案会过时。但折腾过程中攒下的理解不会。

· · ·

我会持续分享 Claude Code 的使用经验和踩坑记录。如果这篇对你有用,欢迎关注,也欢迎转发给同样在用 Claude Code 的朋友。


我建了一个AI学习研究群,目前几十来人,都是在真正动手搞AI的人。如果你也在自己跑模型、写代码、做项目,欢迎点赞关注转发一键三连,然后加我微信,备注写清"你在做的AI方向",聊得来的话我拉你进群。纯围观的和小白就不加了,有一定门槛

上一篇从Trae SOLO谈多智能体的困局下一篇大模型之外的 Harness,也分远近亲疏