晚上您关掉终端,感觉和智能体的整段对话都随着窗口一起消失了。讨论了一个小时,找到的 bug,解释过的任务背景 - 看起来都不见了。

其实没有消失。对话在您工作的同时自动写入磁盘,一条命令就能重新打开。

最简单的理解方式是把会话想象成一家酒店。项目文件夹是大楼,每段对话是一个房间,所有房间的钥匙都挂在前台后面的板子上。晚上您离开,但不会把房间烧掉:钥匙挂回板子,东西留在房间里。第二天早上,只要告诉前台您要哪个房间就行。

这个比喻是有边界的,最好一开始就说清楚:房间里住的是对话,不是代码。代码是大楼本身,所有住客共用。

下面讲什么是会话、回到会话的三种方式、为什么对话需要名字,以及为什么新任务最好开新对话,而不是接着用旧的。

什么是会话

会话是与智能体保存下来的对话,绑定在项目文件夹上。您工作的时候它会持续写入磁盘:不用像文本编辑器那样专门保存。

进入会话的不只是对话本身。除了您的消息和智能体的回答,里面还有工具调用及其结果:它打开过哪些文件,执行的命令返回了什么,应用了哪些修改。所以回到旧对话时,您得到的不是一份摘要,而是完整的全貌。

接下来两点说明,能消除一半的困惑。

一段对话的内容不会带到另一段里。一个月前在另一个会话里讨论过什么,这段对话里就没有,哪怕项目完全一样。每个会话只知道自己的历史。

会话不是存放代码的第二个地方。项目文件本身就在磁盘上。一个项目完全可以同时有十几个会话,它们共用同一份代码 - 也就是文件夹里现在的那份。

在同一个项目文件夹里存在多个互相独立的会话,它们都使用同一批代码文件项目文件夹会话 1反馈表单会话 2支付功能的 bug会话 3测试重构项目文件所有会话共用同一份代码
对话之间互不重叠,但代码是共用的

这张图把两个要点一次说清楚:文件夹只有一个,里面有好几个会话,每个会话都保留自己的历史,最下面的文件是共用的。给同一个项目再开一个会话,并不是复制代码,只是又多了一段关于它的对话。

怎样回到之前的工作

有三个入口,选哪一个取决于您是否还记得需要的是哪段对话。

入口作用
claude --continue不问任何问题,直接继续这个文件夹里最新的对话
claude --resume打开过去对话的列表,您来选需要的那个
/resume同样是这个列表,但是从已经打开的会话内部调出来

表里有一点很容易忽略:上面两行都以 claude 开头,最下面一行以斜杠开头。这不是外观上的巧合。上面两个是智能体还没出现在屏幕上时,在终端里输入的,参数是启动命令本身的一部分。也就是说,您一个动作既启动了智能体,又告诉它该打开哪段对话:

claude              # 从空白页开始
claude --continue   # 启动后直接进入昨天的对话
claude --resume     # 启动后从列表里选一段对话

/resume 的方向正好相反,是从里面发起的:智能体已经开着,您在它的输入框里敲字,切换到另一段对话,不用回到终端。

实际用起来区别很简单。claude --continue 的意思是"我昨天在这里做过,接着来":智能体不声不响地打开当前文件夹里最近的一段对话。claude --resume 的意思是"有好几段对话,让我挑一个"。

列表每行对应一段对话:如果您起过名字就显示名字,否则显示自动生成的标题,另外还有距上次活动过去了多久、所在的分支和大小。行数多的时候,直接开始打字就能搜索;也可以把列表扩展到当前文件夹之外,Ctrl+A 会显示这台机器上所有项目的对话。

先检查文件夹

默认情况下,列表绑定在文件夹上。如果 claude --resume 是从主目录启动的,请切换到项目文件夹再试一次。想知道某段对话放在哪里,可以用 Ctrl+A:它会显示所有文件夹里的对话,但没法直接从列表里打开别的项目的对话 - Claude Code 会把切换到那个文件夹并启动的命令放进剪贴板,您需要把它粘贴到终端里执行。还是不行的话,检查一下 Claude Code 是否用的是和之前相同的配置,以及这段对话是否已经超过了保留期限。自动删除之后,就没法再通过 /resume 找回来了。

对话里的一切都会跟着一起回来:完整的历史记录,包括工具调用及其结果。通常模型也会保留下来,只要它还可用、设置也没有变。可以正好从上次停下的地方接着做。

为什么会话需要名字

只有一段对话的时候,不需要名字。一旦有了三段,列表就变成了一道谜题:两段开头一模一样,第三段根本看不出是关于什么的。

设置名字有两种方式:

claude -n feedback-form   # 启动时
/rename feedback-form     # 在已经打开的会话里

如果没有设置名字,Claude Code 会根据您的第一条消息自己想出一个简短的标题。它同样能起到路标的作用:靠它就能在列表里认出这段会话并打开。只是自己起的名字更准确 - 自动标题描述的是第一句话,而不是整个任务。

说实话,对话刚开始的时候很少有人会去想名字:您还不知道它会发展成什么样。一半的会话都是"看一行代码而已",其中有些却意外变成了半天的工作量。

所以更简单的做法是这样。简短的一次性任务就别管它了,自动标题够用。发现要陷进去很久了 - 中途用 /rename。做完了 - 带名字执行 /clear:任务已经过去,叫什么名字也就不再是个问题。

新任务 - 新对话

工作过程中最主要的问题只有一个:这还是同一个任务吗?还是的话就继续。变了就打开一张空白页。听起来像是走形式,但实际上对话最容易在这里变成一锅粥。

这种诱惑可以理解:智能体已经了解项目了,何必重新开始。但一段塞进了三个任务的对话,行为会可预见地变差:

  • 它会把上一个任务的决定带进新任务。一小时前商量好用一种方案,现在改用另一种了 - 它却还记得最初的约定,不断绕回去;
  • 已经被否决的想法又冒出来。在别的任务里否决过,可对它来说这是同一条时间线;
  • 它会顺手改动属于上一份工作的内容。您问的是表单,结果连支付功能也被改了;
  • 改动混在一起。一段对话里同时有两个主题的修改,之后很难分清哪个属于哪个;
  • 在列表里找不到这段对话。它什么都涉及一点,也就等于什么都不是。

由此得出一条简单的规则:一段对话该活多久,就看它对一个任务有没有用。任务结束了,它也就结束了。会话在这里是消耗品,不是需要珍藏的东西。

打开空白页有两种方式,二者的差别比看上去要小。

操作对话会怎样项目文件会怎样什么时候选
/clear从空白页开始,之前的对话保存下来不动任务变了,但您还在原地
新会话为另一份工作开始一段独立的对话不动不同的项目、不同的文件夹、不同的一天

接下来说说 /clear,因为正是这里最容易让人紧张。这条命令看起来像删除,实际上是切换:它不会抹掉对话,而是把它放到一边,打开一个空的。放到一边的对话仍然留在列表里,通过 /resume 打开时,还是您放下它时的样子。

它有一个可选参数 - 名字。/clear feedback-form 会给退场的对话在列表里打上标签,方便您以后认出它来。多花一秒钟,之后找起来明显轻松得多。

也有反过来的情况。如果对话已经有名字了 - 通过启动时的 -n 或者中途用的 /rename - 那么不带参数的 /clear 会把这个名字交给新对话,下一个任务就会挂着上一个任务的名字。带参数的话,名字留在旧对话上,新对话就以无名开始。

在 clear 命令之前,当前窗口里活跃的是关于表单的对话,列表是空的。命令执行之后,活跃的是空白页,关于表单的对话则躺在列表里。这两种状态下,这个窗口里始终只有一段对话是活跃的之前之后/clear活跃在列表里表单对话空白页表单对话暂时是空的
在当前窗口里,命令切换的是活跃对话,旧的那个被移到列表里

看最上面这一行。这次启动里,命令前后都只有一段活跃的对话。/clear 不会在第一段旁边再开一个会话:它把活跃对话换成空白的,把原来那段挪到下面的列表里。要再次回到它,只能通过 /resume 有意识地操作。

新会话和 /clear 的区别在于,它通常也意味着不同的工作:不同的项目、不同的文件夹、不同的一天。/clear 不会让您离开当前的目录,也不会离开当前的启动 - 它就在您所在的地方打开一张空白页。

还有一个 /compact。这条命令不是关于切换任务,而是关于对话的长度:它把已经说过的内容折叠成一份摘要,让您留在同一个会话里。放在一起讲上下文窗口是怎么运作的、用完了会发生什么,会更顺一些 - 那是另一个话题了。

这些数据放在哪里、保存多久

对话保存在您自己的磁盘上,在 Claude Code 的数据文件夹里:

~/.claude-codegym/projects/

~ 符号表示用户的主文件夹。在 Windows 上对应的是 %USERPROFILE%,所以学习用的路径以 %USERPROFILE%\.claude-codegym\projects\ 开头。

.claude-codegym 是学习专用配置。如果 Claude Code 不用这个配置启动,标准路径就是 ~/.claude/projects/。里面每个项目一个子文件夹,每个子文件夹里每段对话对应一个主文件。

不要把秘密写进对话记录

在磁盘上,对话记录是以明文形式保存的。里面会记录读取过的文件内容、执行过的命令的输出,以及您粘贴到聊天框里的文字。凡是能访问您操作系统账户下文件的进程和用户,都能读到这个文件。

本地文件只是故事的一部分:为了让模型给出回答,Claude Code 会把请求和所需的上下文通过网络发给您选定的提供方。服务端的保留策略取决于账号和设置。所以不要把密码和密钥粘贴进聊天,也不要在没必要的情况下让智能体去读包含秘密的文件,比如 .env。

对话不会永久保存:大约一个月后,旧的对话会连同对应的检查点一起自动清理掉,这个期限可以按需调整。所以会话适合用来处理眼前的任务,不适合当作项目的长期历史记录。想长期保存历史用什么,是另一个大话题。

这对您的工作意味着什么

几条明天就能用上的结论:

  • 会话是一个任务的容器,不是和智能体一辈子的聊天记录。您越是把它往这个方向靠拢,智能体犯糊涂的次数就越少;
  • 对话自己会保存,不需要专门去保存。晚上关掉终端不会有任何损失;
  • 会话按文件夹分类存放。从项目文件夹启动智能体,它的对话就都在手边;如果列表是空的,检查一下文件夹:Ctrl+A 会显示所有项目的对话,并提示您该去哪里;
  • 回到旧对话,就会连同它的整个上下文一起回来,包括走过的死胡同和被否决的想法。有时候重新开始比复活一场三小时的讨论更快;
  • 一个文件夹底下有十几个会话,是正常的工作状态,不是混乱的表现。
两秒钟的小习惯

用一个习惯代替两个:不在开头去想名字,而在结束时给对话打标签。/clear feedback-form 代替光秃秃的 /clear - 同样是那两秒钟,只不过是在名字已经很明显的那一刻花掉。一个月后,列表依然清晰易读,不用再翻箱倒柜去找。


会话文件的位置、列表的内容和保留期限取决于 Claude Code 的版本和设置,所以您那边看到的可能和这里描述的不完全一样。