Claude Code 做复杂重构做了 40 分钟,突然冒出一个念头:"换个思路试试会怎样?"可是已经积累起来的上下文 — 读过的文件、做过的判断、讨论过的取舍 — 谁也不想白白扔掉。这时候,一行 /fork 就够了。

3秒速览
积累对话上下文 /fork 克隆 在副本中实验 原始会话完整保留 A/B 对比后选择

这是什么?

/fork复制当前对话的完整历史、生成一个独立新会话的命令。概念上和 Git 的 git branch 完全一样。原始分支(对话)保持不变,从分叉点出发可以朝不同方向推进。

在 CLI 里,--fork-session 参数也能实现同样效果。用 --resume--continue 加载已有会话后,再加上 --fork-session,就会生成一个带有截至该时点对话历史、且拥有全新会话 ID 的独立会话。

重点:核心类比

--continue = 在同一本笔记本上继续写(会话 ID 相同)
--fork-session = 把笔记本复印一份,在新的那本上写(会话 ID 不同,内容相同)

根据官方文档,分叉出来的会话不会继承原始会话的权限设置(session-scoped permissions)。这是出于安全考虑的有意设计。意思是:在新会话里做敏感操作时,会再次要求确认。

有什么不同?

Claude Code 中,"想试另一种思路"的场景出现的频率比想象中高。以前只有两个选项:要么开个新会话从头开始积累上下文,要么在当前会话里硬着头皮推下去。两种代价都不小。

开新会话使用 /rewind使用 /fork
已有上下文全部丢失部分回滚完整保留
原始会话单独保留被回退完整保留
实验安全性安全(隔离)有风险(难以恢复)安全(隔离 + 保留原始)
Token 成本高(重新构建)中等(复制历史)
A/B 对比困难无法进行自然流畅

Trigger.dev 博客介绍的"Context Pre-Warming(上下文预热)"模式很能说明这个差距。把架构文档、API 规范、编码约定等超过 4 万 token 的重上下文先一次性加载到主会话里,之后每做一个功能任务就从主会话分叉一次。可以彻底省掉每次重新构建上下文的成本。

上手指南

  1. 创建主会话
    启动 Claude Code,给它充分加载项目的核心上下文。让它读架构文档,让它浏览主要文件,设定好编码规则。然后用 /rename master-context 给会话起个名字。
  2. 交互式分叉:/fork
    在会话里用 /fork refactor-attempt 这样带名字的命令分叉。原始对话原封不动,在分叉出来的会话里可以放心实验。
  3. CLI 分叉:--fork-session
    claude --resume master-context --fork-session 可以直接从终端分叉。开几个新终端标签页,对同一个主会话多次分叉,就能做并行实验。
  4. 对比结果后选择
    每个分叉里尝试不同思路,之后对比结果。选中心仪方向的那个会话继续推进,其余的丢掉就行。

注意:禁止同时使用同一会话

如果在多个终端里 --resume 同一个会话 ID,两边的消息会互相混杂。等下次 resume 的时候,对话会乱成一锅粥。需要并行工作时,务必使用 --fork-session

实战应用模式

我整理了一些社区里实际在用的 /fork 使用模式。

模式 1:实现方案 A/B 测试

把同一个主会话分叉两次,各自尝试不同的实现方式。比如一边用 Redis 缓存、另一边用内存缓存实现后对比性能。上下文完全一致,所以差异纯粹来自不同的实现思路。

模式 2:恢复 PR 评审应对场景

把提交 PR 时所用的会话分叉出来处理评审意见,就能保留当初写代码时的全部脉络 — 为什么这么决定、考虑过哪些替代方案 — 在完整保留这些上下文的前提下进行修改。

模式 3:Skill 中的 context: fork

Claude Code Skills 中配置 context: fork 的 frontmatter,该 Skill 就会在独立的子智能体(sub-agent)上下文中运行。既不会扰乱主对话,又能执行复杂的分析任务。

重点:/fork vs /btw vs /rewind — 什么时候用哪个?

• 不打断节奏问个小问题 → /btw(不留在历史里)
• 尝试不同思路 → /fork(保留原始,生成新会话)
• 撤销刚做的操作 → /rewind(在当前会话里回滚)