還我一個乾淨的對話:用 /btw、/fork、/rewind 對抗 Claude Code 對話污染

在用 Claude Code 處理比較長的任務時,有時候會注意到一件怪事:越到後面,Claude 的回答感覺越「飄」,開始忽略早先講好的架構決定,或是重複問你已經說過的事情。

一開始以為是模型能力問題,後來才意識到——是 context pollution 在作怪。

什麼是 Context Pollution

Claude Code 每次回應都要重讀整個對話歷史。這代表你在 session 裡的每一句話、每一次工具呼叫的輸出、每一個離題的閒聊,都會持續佔用 context 空間,而且每一輪都在反覆消耗 token。

所謂的 context pollution,就是這些「跟當前任務無關的內容」悄悄累積在對話裡,讓 Claude 越來越難精準聚焦在你真正想要的事情上。

常見的污染來源:

  • 中途問了一個「順帶一提」的問題,但答案和答案的答案都留在 history 裡
  • 試了一個方向、改了主意,但那段試錯對話沒有消失
  • 讓 Claude 讀了一個大檔案,輸出結果全部進了 context

v2.1.72(2026/03/10)引入的 /btw 指令,讓我重新注意到這個問題,也才發現 Claude Code 其實有三個專門對付 context pollution 的工具——只是放在文件很角落的地方。


/btw — 提問不留痕跡

/btw 是「by the way」的縮寫,用途很直白:讓你問一個問題,但這個問題的 Q&A 不進主對話 history

怎麼用

在任何時間點輸入:

/btw which test file covers the auth middleware?

Claude 會在一個獨立的浮動區塊裡回答。你看完、關掉,主線對話繼續,就好像什麼都沒發生過一樣。

更神奇的是,你可以在 Claude 正在執行任務的過程中發出 /btw 問題——它會並行處理,不會打斷正在進行的工作。

什麼時候用

  • 不確定某個函數在哪裡,但懶得開新 terminal 去 grep
  • 需要一個概念解釋(「useEffectuseLayoutEffect 差在哪?」)但不想讓這段 Q&A 污染後續 context
  • 想更新 Claude 對這個 session 的風格偏好(「這個 session 以後回答請盡量簡短」)
/btw from now on in this session, keep code comments in English only

這類「工作方式」的設定用 /btw 傳達特別適合——Claude 會記住,但這個設定本身不會每次都重新出現在 history 裡。

重要限制

/btw 沒有 tool access。它只能根據當前 context 裡已有的資訊回答,無法讀取檔案、執行指令、或搜尋程式碼。如果你需要 Claude 去翻 codebase,還是要走正常對話。

另外,/btw 只支援單次問答,無法追問。

TIP — Token 節省效果

/btw 的 Q&A 不進 history,代表後續每一輪請求都不用再讀這段內容,在長 session 裡積少成多。某些使用者回報光靠這一個習慣就減少了 30-50% 的 context 膨脹速度。


/fork — 給 context window 開分支

Git 有 git branch,Claude Code 的 session 也有對應的概念:--fork-session

怎麼用

從終端機啟動一個 fork session:

claude --fork-session <session-id>

或是在對話中使用:

/fork

Fork 會創建一個新的 session ID,但繼承當前 session 的完整歷史記錄。從這一刻起,兩個 session 完全獨立——不管哪邊做了什麼,另一邊都不受影響。

應用場景一:嘗試不同方向

你在做 refactor,但不確定要用 Strategy Pattern 還是 Visitor Pattern。與其在同一個 session 裡兩個方向都試,不如在還沒動手之前先 fork 兩份:

/fork
# 在 fork-A 裡試 Strategy Pattern
# 原 session 繼續試 Visitor Pattern

最後選一個方向,另一個分支直接捨棄,主線完全乾淨。

應用場景二:Context Pre-warming

這是社群上討論最熱的用法——「pre-warming」。

先建立一個「母 session」,只做一件事:把這個專案的核心知識全部載入——架構決定、重要 API 文件、程式碼慣例、常見坑。這個 session 可能有 40K+ token。

之後每次要開始新功能,就從這個母 session fork 出去,而不是重新建立一個空白 session 再重新解釋背景。

# 載入母 session context
claude --resume <master-session-id>

# 準備開始新功能時
/fork
# 現在在子 session 裡,帶著完整 project context 開工

效果有點像是 git worktree:同一份程式碼的不同工作副本,各自獨立,不互相干擾。


/rewind — 回到過去

/rewind 是這三個工具裡最接近「反悔鍵」的一個。

怎麼用

有兩種觸發方式:

  • 鍵盤快捷鍵:連按兩次 Esc
  • 指令:/rewind

兩種方式都會打開一個選單,讓你選擇要回到哪個對話節點。

NOTE — 選擇性 rollback

/rewind 支援選擇性回滾:你可以只回滾對話(但保留已修改的程式碼),或是同時回滾對話和程式碼狀態,根據需求彈性選擇。

壓縮試錯,而不是刪除

/rewind 的聰明之處在於它不只是「刪掉後面的對話」。當你選擇從某個節點重新開始,Claude 會把後面那段試錯過程壓縮成一個摘要——保留關鍵結論(「這個方向行不通,因為 X」),丟掉大量的中間過程。

這樣的結果是:你回到了一個乾淨的起點,但 Claude 還是知道你剛才試了什麼、為什麼沒成功。

這和直接把後面的訊息刪掉不一樣——直接刪掉等於這段試錯歷史不存在,下次 Claude 可能又走同一條死路。


三個工具搭配使用

這三個工具各自獨立,但放在一起用效果更好。

我現在常用的工作流程是這樣:

  1. 開始一個新功能前,用 /fork 從當前 session 開一個分支,而不是繼續在原 session 裡堆疊
  2. 在分支裡工作時,中途有任何「順帶問一下」的問題,用 /btw——不是開新 session,也不是汙染主線
  3. 走錯方向之後,用 EscEsc 打開 /rewind 選單,選一個乾淨的節點重來,而不是繼續在原本的 context 裡打補丁
# 一個典型的長 session 工作流
[開始任務]

/fork  ← 嘗試方向A

/btw did we handle null checks in this module?  ← 不汙染主線的即時確認

[發現方向A 跑不通]

Esc Esc → /rewind 到分叉點  ← 壓縮試錯,保留教訓

/fork  ← 嘗試方向B

[完成]

這套流程讓 context 的成長保持線性而不是指數型——每個 session 的任務邊界清楚,側問和試錯都不會無限堆疊。


個人心得

說實話,這三個指令存在蠻久了,但我用了幾個月 Claude Code 才偶然在 changelog 裡發現 /btw(v2.1.72 加進來的),進而去挖其他兩個。

文件把它們分散在幾個不同頁面,也沒有特別把「context hygiene」當作一個主題整合起來介紹,所以很容易錯過。

這讓我想到一個習慣:每隔一段時間翻一次 Claude Code 的 changelog 或是跑 /release-notes 看看最近多了什麼,常常會找到放了很久但自己不知道的好東西。


資料來源

留言