# 之前的文章白写了？Claude Code 原来自带对话分叉

> 龙虾AGI通用实验室 · 2026-06-19

之前我写过一篇文章《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方向"，聊得来的话我拉你进群。纯围观的和小白就不加了，有一定门槛。

![](images/07f09a/img_001.jpg)
