起因
我在用Claude Code做一个批量生成项目,跑了很长一个对话,积累了大量上下文——项目背景、格式规范、生成过的内容。
跑着跑着,对话里聊出了一个新话题,我想把这个话题单独拿出去深入讨论、写成文章。但问题是:
如果在当前对话继续讨论,会打断正在进行的批量生成任务如果开一个新对话,之前的所有上下文都没了,要从头说起如果先把当前话题导出、回滚对话,话题倒是分开了,但新对话拿不到之前的上下文
我想要的是分叉——像git branch一样,从当前对话的某个点分出两个独立的分支,各走各的路。
Claude Code没有这个功能。但我在折腾的过程中发现了一些技巧。
· · ·
对话历史存在哪
Claude Code有一个resume功能。你关掉终端,下次在同一个目录下打开claude,它会问你要不要恢复上次的对话。
我之前有一次改了项目文件夹的名字,resume就没了。后来改回去,resume又回来了。说明对话历史不是存在项目目录里的,而是存在某个和项目路径关联的地方。
找了一下,在这里:
~/.claude/projects/{编码后的项目路径}/{会话ID}.jsonl路径编码规则很简单:把路径分隔符都替换成 -。比如你的项目在 D:\my-project\foo,对应的就是 D--my-project-foo。
那个 .jsonl 文件就是完整的对话历史。我那个跑了几个小时的对话,文件大小1.7MB,733行。
· · ·
分叉的完整步骤
既然对话历史就是一个文件,那分叉的思路就很简单:
步骤1:建一个空文件夹
mkdir /path/to/my-project-branch-b不需要复制原来的项目文件。空文件夹就行,只要路径名确定下来就好。
步骤2:复制对话历史
# 创建新路径对应的会话目录mkdir -p ~/.claude/projects/{新目录的编码路径}/# 把会话文件复制过去cp ~/.claude/projects/{原目录的编码路径}/xxxxxxxx.jsonl \~/.claude/projects/{新目录的编码路径}/
这一步是核心。没有这个文件,在新目录下开claude就只能开全新对话,没有resume选项。
步骤3:两个终端分别resume
# 终端A - 原目录,继续原来的任务cd /path/to/my-projectclaude --resume# 终端B - 新目录,继续新的讨论方向cd /path/to/my-project-branch-bclaude --resume
两个对话从同一个起点出发,之后各走各的路。

但有一个坑。我实际操作的时候发现:在新目录resume后,对话上下文恢复得很完美,但所有文件操作都跑到了原目录去——Claude在新目录里恢复了对话,手却伸回老目录在干活。
原因是会话文件里记录了最初创建会话时的工作目录。resume的时候,工作目录也被还原了。你人在新目录,Claude的工作目录却回弹到了老目录。
所以目前的分叉方案能做到的是:对话上下文分叉,但文件操作仍然指向原目录。如果你分叉出去只是为了继续讨论(比如我是为了把新话题单独拿出去讨论),这完全够用。但如果你想让两个分支操作各自独立的文件,目前做不到——除非手动改.jsonl里的路径信息,但那是内部格式,有风险。
· · ·
几个注意事项
路径编码要对。新目录名里如果有中文或特殊字符,编码后的路径可能不对。建议用纯英文、不带空格的目录名。
这不是官方功能。Claude Code没有设计"分叉"这个能力,我们只是利用了它存储对话历史的机制。不保证未来版本还能用,也不保证所有情况下都没问题。
会话文件里可能有内部引用。比如子代理的任务ID、临时文件路径。复制到新目录后,这些引用可能会失效。不影响对话本身的恢复,但如果你在分叉后的对话里引用之前子代理的结果,可能会找不到。
分叉后的两个对话完全独立。在A里说的话不会出现在B里。这正是我们想要的——但也意味着分叉之后就是两条平行线了。
清理。不用的分支记得删——空文件夹和对应的 ~/.claude/projects/ 下的会话目录都删掉才算干净。不删也没什么害处,就是会话文件会一直占着磁盘(一个长对话的 .jsonl 可能有几MB)。
· · ·
更实用的替代方案
说实话,大多数时候你不需要搞分叉。有几种更简单的方式:
导出关键内容到文件。把你想在新对话里继续的内容写成一个markdown文件,存在项目目录里。新开一个claude对话,让它读这个文件。你损失的只是"对话的语气和细节",核心知识都在文件里。这是我最终采用的方案——让Claude把讨论的精华总结成一份文档,拿到新窗口就能继续。
用CLAUDE.md存共享知识。如果某些知识是跨对话都需要的(比如项目的格式规范、编码约定),写进项目的CLAUDE.md文件。每次新开对话都会自动加载。
用memory存长期记忆。Claude Code有一个memory系统,存在 ~/.claude/projects/ 对应的memory目录下。适合存用户偏好、项目关键决策这类跨对话信息。
分叉是最"完美"的方案(两个分支各自拥有完整的对话历史),但也是最重的。大多数情况下,导出一个文件就够了。
· · ·
什么时候值得分叉
对话已经跑了很久,积累了大量上下文,你不想丢失其中任何一部分你需要从同一个状态出发走两条不同的路两条路都需要完整的对话历史作为基础你不介意多占一份磁盘空间
如果你只是想"在另一个窗口讨论一个新话题",开个新对话 + 导出一份文件就行了。比分叉简单得多。
· · ·
额外发现:切换账号不丢上下文
在折腾分叉的过程中,我还发现了一个很实用的东西。
Claude Code的会话文件和账号认证是完全分开存的:
会话历史:~/.claude/projects/xxx/xxx.jsonl ← 纯对话记录,不含任何账号信息认证信息:~/.claude/.credentials.json ← 单独存放,跟会话无关
会话文件里只有对话消息、工具调用记录这些东西,没有账号ID,没有认证token,什么都没有。
这意味着你可以切换账号后直接resume同一个对话:
claude logoutclaude login # 登录另一个账号claude --resume # 对话上下文完整恢复,API调用走新账号的额度
不需要复制文件,不需要修改任何东西。logout、login、resume,三步完成。
这个在什么场景下有用呢?比如你跑了一个很长的对话,上下文已经积累了很多项目知识和讨论背景,这时候当前账号的额度用完了。以前你可能得等额度恢复,或者开一个新对话从头来过。现在你知道了——切个账号,resume,继续干活。所有上下文都在,一句话都不用重复。
当然这一点我还没真的去验证,只是逻辑上可以切换。有尝试过的朋友可以留言说一下你的实际经验。
如果你需要更彻底的多账号隔离(比如公司项目和个人项目完全分开,不想会话、memory互相串),可以用环境变量指定独立的配置目录:
# 个人账号,用默认配置claude# 公司账号,用独立配置目录CLAUDE_CONFIG_DIR=~/.claude-work claude
这样两个账号的认证、会话历史、memory全部隔离在不同目录下。
不过说实话,大多数人不需要这么复杂。直接logout再login就够了,会话文件不会因为你换了账号就消失或者被锁定。
我建了一个AI学习群,目前几十来人,都是在真正动手学AI的人。如果你也在自己跑模型、写代码、做项目,欢迎加我微信,备注"你在做的AI方向",我拉你进群。纯围观的就不加了,群里大家都在真搞。
