---
title: "会话生命周期:compact、clear 与恢复"
description: "全面详解会话生命周期中compact、clear、resume与检查点的使用时机，以及基于文件化状态运行长任务的最佳实践方法"
---

[缓存篇](/guide/cache-strategy)讲了"别破坏前缀",[上下文窗口篇](/guide/context-window)讲了"窗口只增不减"。本篇讲日常操作层面:一个会话从开始到结束,什么时候该压缩、该重开、该回滚、该续跑。

## 核心命令速查

| 命令 | 作用 | 对上下文的影响 |
| --- | --- | --- |
| `/context` | 查看窗口占用明细 | 无(诊断工具) |
| `/compact` | 把历史压缩成摘要 | 大幅缩小,**细节丢失** |
| `/clear` | 清空对话,重新开始 | 归零(系统提示、CLAUDE.md 仍在) |
| `/resume` | 列出历史会话,挑一个继续 | 恢复所选会话的完整历史 |
| `claude -c` / `--continue` | 直接续上最近一个会话 | 同上 |
| `Esc Esc` / `/rewind` | 回滚到之前的检查点 | 对话和/或代码回到当时状态 |
| `/cost` | 查看本会话花费(API 计费时) | 无 |

## Compact:压缩是有损的

窗口接近上限时,Claude Code 会**自动 compact**:把早期历史总结成一段摘要,腾出空间继续。这是保底机制,但把压缩时机交给自动触发有两个问题:压缩发生在**任务中间**(正是上下文最值钱的时候),而且你无法控制保留什么。

更好的做法是**主动压缩,选好时机**:

- **在阶段边界压缩**:一个功能改完、测试通过、刚提交——此刻旧历史的细节价值最低,是压缩的黄金时间;
- **带指令压缩**:`/compact 保留所有文件修改记录和未解决的报错` —— 告诉它摘要里什么必须留下;
- **压缩前把状态写进文件**:让 Agent 先把进展、待办、关键决定写到一个 markdown(如 `PROGRESS.md`),文件不怕压缩——摘要丢了细节,随时能从文件读回来。这是长任务最重要的习惯。

:::tip[与缓存的关系]
compact 会改写对话历史 ⇒ 缓存前缀必然重建一次。所以"少量多次"是最差策略——每次都付重建成本。**攒到阶段边界一次压到位**,然后在新前缀上继续累积命中。
:::

## Clear:重开比压缩更常被低估

经验法则:**换任务就 `/clear`,别舍不得**。

上一个任务的历史对新任务不但没帮助,还是三重负担:占窗口、增加每轮成本、且残留的旧上下文会干扰模型对新任务的判断(它可能"惯性"沿用上个任务的假设)。`/clear` 之后系统提示、CLAUDE.md、MCP 都还在,只是对话归零——相当于换了一张干净的桌子,而不是搬了办公室。

什么时候不该 clear:同一任务的自然延续(修复刚才实现里的 bug)、需要引用前面结论的追问。

## Resume 与续跑:跨会话的长任务

会话历史保存在本地,随时可以捞回来:

- `claude --continue`:续上最近一次会话,适合"昨天干到一半今天接着来";
- `claude --resume`(或会话内 `/resume`):从列表中挑选历史会话。

但要清醒:**恢复的会话把整个历史重新载入窗口**,而且缓存早已过期(TTL 只有 5 分钟到 1 小时),第一轮是全额重建。所以跨天的长任务,靠 resume 不如靠**文件化的状态**:

```text
推荐的长任务模式:
1. 让 Agent 维护一个 TODO.md / PROGRESS.md,每完成一步就更新;
2. 阶段完成 → 提交 git → /clear;
3. 新会话开场:"读 PROGRESS.md,继续下一项"。
   ── 每个会话都从小而干净的上下文开始,状态却一点不丢。
```

这个模式同时解决了窗口膨胀、缓存重建、compact 丢细节三个问题,是本站最推荐的工作方式。

## 检查点与回滚:大胆尝试的安全网

Claude Code 会在每次修改前自动记录**检查点(checkpoint)**。按 `Esc Esc`(或 `/rewind`)可以回滚,且**对话和代码可以分开回**:

- 只回代码:方案 A 改坏了,代码回到改动前,但对话里保留"方案 A 为什么失败"的记忆——让 Agent 带着教训试方案 B(非常好用);
- 只回对话:代码是对的,但对话被带偏了,回到之前的提问重新说;
- 都回:彻底重来。

注意检查点**不替代 git**:它不覆盖 Bash 命令产生的副作用(比如脚本删的文件),跨会话的持久保障仍然是"小步提交"。

## 一张时机决策表

| 情形 | 动作 |
| --- | --- |
| 开始一个不相关的新任务 | `/clear` |
| 任务没完,窗口 `/context` 显示超过 ~60-70% | 阶段边界处 `/compact`(先写状态文件) |
| 改动方向错了 | `Esc Esc` 回代码,保留对话教训 |
| 今天收工,明天继续 | 状态写文件 + git 提交;明天新会话读文件(优于 resume) |
| 改 CLAUDE.md / 增删 MCP / 换模型 | 顺手 `/clear`——反正缓存要重建(见[缓存策略](/guide/cache-strategy)) |
| 大任务里的独立探索 | 别污染本会话,派[子代理](/guide/subagents) |
