Claude Code /rewind 完整教學:Esc 按兩下,退回它改壞之前
三年前你叫 AI 幫忙改一個模組,做法大概是這樣:先 git stash,或者複製一份整個資料夾叫 src_backup,然後才敢按 Enter。
改完發現它把三個檔案改歪了,你的救援手段只有兩個。一個是 git checkout .,代價是這一輪所有東西一起消失,包含它改對的那五個檔案。另一個是坐下來一個一個檔案讀 diff,手動挑哪些留、哪些丟。
那個年代大家用的詞是「備份」。備份的問題是它只有一個時間點,就是你動手之前。中間那七、八輪對話,每一輪都可能是你真正想回去的地方,但那些狀態不存在,沒人存過。
為什麼會長出 checkpoint 這個東西
轉折點是 agent 開始一次改十幾個檔案。
當 AI 只是幫你補一個函式,diff 短,人腦讀得完,備份夠用。當它一輪跑掉五分鐘、動了十四個檔案、其中十一個是對的,人工挑揀的成本就超過重做一次的成本。這時候你會開始下意識地把任務切小,不是因為切小比較好,是因為你不敢一次交太多出去。
工具的設計者顯然看到了同一件事。Claude Code 現在的做法是:每次你送出一個 prompt,它就在那個瞬間先把當前的程式碼狀態存一份。
不是你按下去之後才存,是按下去之前。所以每一份快照對應的都是「這句話還沒生效的世界」。一個 session 保留最近 100 個 checkpoint 的檔案快照,而且快照是跟對話一起存的,明天 --resume 回來還能退。整包東西跟 session 一起在 30 天後清掉,想改期限的話是 settings 裡的 cleanupPeriodDays。(來源:Claude Code 官方文件)
像煮湯的時候,每加一樣新材料之前先舀一小碗出來放旁邊。加完發現味道跑掉了,你不用倒掉整鍋重煮,也不用猜是哪一味壞的,直接拿回上一碗。
怎麼叫出來
兩個入口,殊途同歸:
- 打
/rewind - 輸入框是空的時候,
Esc按兩下
第二個有個小陷阱值得記一下。輸入框裡如果有文字,Esc 按兩下的行為是清空文字,不是開選單。清掉的內容會進輸入歷史,按 Up 叫得回來,所以不會真的弄丟,但你會愣一秒。要開選單就先確認輸入框是乾淨的。
選單開起來,裡面列的是你這個 session 送過的每一個 prompt。挑一個時間點,接下來的選項有六個。
六個選項,其實是兩組不同的工具
第一組是還原,三個:
Restore code and conversation — 程式碼和對話一起退回那個點。整輪當作沒發生過。
Restore conversation — 只退對話,程式碼留在現在的樣子。用在「它改對了,但中間那三輪繞路的討論把 context 塞爆了」。
Restore code — 只退檔案,對話留著。用在「這個方向不對,但我不想重講一次需求」。
第三個是實務上最好用的一個,值得多說兩句。你退掉檔案、留住對話,然後直接接一句「這次不要動 service 層」。它記得前面所有脈絡,你只補一句修正。比重開一輪省事非常多。
還有個細節:那兩個 code restore 的選項不一定會出現。如果你選的那個點之後沒有任何被追蹤到的檔案變更,選單就只會給你 Restore conversation、兩個 Summarize,和 Never mind。沒東西可退的時候它不會假裝有。
第二組是壓縮,兩個。這組跟「還原」根本不是同一件事,只是剛好住在同一個選單裡:
Summarize from here — 把選定的這個點「往後」的對話壓成摘要。適合那種除錯到一半、中間試了十幾次、每次都貼一大包 log 的 session。你把後半段壓掉,最前面給的規格和限制完整留著。
Summarize up to here — 反過來,壓掉這個點「之前」的,後面的訊息原封不動。
兩個都不會動到磁碟上的檔案。而且原始訊息還留在 session 的 transcript 裡,所以 Claude 之後要引用細節還是查得到,你只是把它從 context window 裡挪走。壓完的位置會留一個 Summarized conversation 的標記,讓你知道這裡有東西被折起來了。
想控制摘要的重點,用方向鍵停在 Summarize 選項上,那一行會出現 **add context (optional)**,直接打字進去再按 Enter。用數字鍵選的話會立刻執行,不給你這個機會。
我自己用這兩個的頻率遠高於用還原。原因很簡單:程式碼壞掉我有 git,context 塞爆我沒有別的工具。這個選單的名字叫 rewind,但它一半的價值在 context 管理上。
兩個容易錯過的路口
/clear 之後還能退回去。 如果你在同一個 Claude Code 行程裡跑過 /clear,rewind 選單最上面會多一列 /resume <session-id> (previous session)。選它就回到 /clear 之前那段對話。這個入口在你離開 Claude Code 或 resume 到別的 session 之前都在,需要 v2.1.191 以後的版本。舊版就走 /resume 自己從清單裡挑。
想分岔不要用 Summarize。 Summarize 是在同一個 session 裡壓縮,等於一個指定範圍的 /compact。你要的是「留著原本這條,另外開一條試別的做法」的話,用 /branch,或者 claude --continue --fork-session。這兩件事很容易搞混,選錯的代價是原本那條線被你自己壓掉了。
它沒有幫你顧到的地方
這段比上面所有功能都重要,因為安全網的價值取決於你知不知道它的洞在哪。
bash 改掉的檔案救不回來。 checkpoint 只追蹤 Claude 的檔案編輯工具做的修改。它跑 rm file.txt、mv old.txt new.txt、cp source.txt dest.txt 動到的東西,rewind 完全碰不到。所以「叫它跑一個腳本批次改檔」跟「叫它逐檔編輯」,在可回復性上是兩種完全不同的風險等級,而這件事從對話裡看不出來。
subagent 改的東西不會被還原。 subagent 用的也是 Claude 的檔案編輯工具,但它的編輯落在你 session 的 checkpoint 之外,退不回來。背景跑的 /code-review --fix、背景執行的 forked skill 都算在內,這些只能用 git 收拾。唯一的例外是前景執行的 context: fork skill,它在你自己這一輪裡動工作目錄,所以退得回來。v2.1.218 之後 forked skill 預設在背景跑,要前景得在 frontmatter 設 background: false。
你自己手改的不算。 checkpoint 只追蹤這個 session 內被編輯過的檔案。你在編輯器裡手動改的、另一個並行 session 改的,通常都不在裡面,除非剛好動到同一批檔案。
symlink 和 hard link 會被跳過。 選了 Restore code 之後,Claude Code 會略過所有是 symlink 或 hard link 的追蹤路徑,然後顯示 Restored the code, but skipped N files。這些檔案維持現在的內容不動。dotfile manager symlink 進專案的設定檔、pnpm hard-link 進去的東西,都吃這條。想知道到底跳過哪些路徑,還原之前先 /debug 打開除錯記錄,~/.claude/debug/<session-id>.txt 裡會逐條列出來。順帶一提,v2.1.216 之前的版本會直接穿過連結寫入或刪除,而且不給警告,這個修得算晚。
它不是版本控制。 官方自己把定位寫得很清楚:checkpoint 是 local undo,git 是 permanent history。checkpoint 補的是 session 層級的快速回復,補不了長期歷史和協作。
這條時間線還沒走完
回頭看這三年,變的不是「能不能復原」,是你敢一次交出去多少。
備份那個年代,你的膽量上限被「一次只能退到最開始」限制住,所以你養成切小任務、每一步盯著的習慣。checkpoint 出現之後,那個限制鬆了:現在你可以交一個大的出去,跑歪了退回中間某一輪就好。官方文件在講設計意圖時用的字是「讓你敢去做有企圖心、大範圍的任務」,這句話翻成人話就是——工具在調整的不是它的能力,是你的膽量。
不過洞還在。bash 沒被追蹤、subagent 的編輯落在外面,而 agent 的發展方向恰恰是越來越多工作交給 subagent、越來越多操作用指令完成。安全網的覆蓋率跟不上工作方式的移動速度,這個缺口目前是靠 git 填的。
git 能不能一直填得住,我沒有答案。倒是有件事今天就能做:開一個 session,隨便叫它改點東西,然後 Esc 按兩下,把那個選單六個選項全部看一遍。看過一次,下次它真的把東西改歪的時候,你的手會知道要按哪裡。



























































































































































