Claude Code Checkpointing: Cách Hoàn Tác Thay Đổi Bằng /rewind (2026)
Nhấn Esc hai lần khi ô prompt đang trống, hoặc gõ /rewind, chọn một checkpoint rồi chọn muốn khôi phục gì: code, hội thoại, hay cả hai. Checkpoint tạo tự động sau mỗi prompt, giữ tối đa 100 checkpoint gần nhất mỗi phiên, và tự xóa sau 30 ngày (chỉnh được). Nhưng /rewind không hoàn tác được lệnh bash, không phải lúc nào cũng khôi phục edit của subagent, và không thay thế git.
- Nội dung đối chiếu trực tiếp tài liệu chính thức code.claude.com/docs/en/checkpointing, /commands và /settings tại thời điểm viết (08/2026); đây là tính năng đổi nhanh nên kiểm tra lại docs live trước khi phụ thuộc.
Checkpoint lưu gì, và lưu ra sao?
Claude Code tự động chụp trạng thái code trước mỗi prompt bạn gửi. Vài điểm cần nắm đúng ngay từ đầu, theo tài liệu chính thức:
- Mỗi prompt tạo một checkpoint mới - tự động, không cần bật gì.
- Chỉ track thay đổi qua file-editing tool của Claude - không phải mọi thay đổi xảy ra trên đĩa (chi tiết ở phần "không hoàn tác được" bên dưới).
- Giữ 100 checkpoint gần nhất mỗi phiên. Khi một checkpoint cũ bị loại, snapshot không còn checkpoint nào tham chiếu tới sẽ bị xóa - trừ snapshot đầu tiên của mỗi file, vì VS Code extension dùng nó làm baseline cho session diff.
- Checkpoint lưu cùng conversation, nên
/rewindvẫn chạy được sau khi bạn/resumelại phiên. - Tự xóa cùng session sau 30 ngày theo quy tắc dọn dẹp mặc định, chỉnh được qua
cleanupPeriodDaystrongsettings.json(mặc định 30, tối thiểu 1 ngày theo docs hiện tại - đây là con số hay đổi theo bản release, kiểm tra lại trước khi dựa vào).
Nếu bạn mới dùng Claude Code và chưa rõ những khái niệm nền tảng như session, prompt, tool-call, xem Claude Code là gì trước khi đọc tiếp phần dưới.
Cách mở và dùng /rewind - từng bước
Có hai cách mở menu rewind:
- Gõ
/rewindvà Enter. - Nhấn
Eschai lần khi ô prompt input đang trống.
Lưu ý dễ bị bất ngờ: nếu ô prompt đang có chữ,
EscEscchỉ xóa nháp đó về input history chứ không mở menu rewind. Nội dung xóa vẫn được lưu - bấmUpđể lấy lại sau khi thoát menu.
Menu rewind liệt kê từng prompt bạn đã gửi trong phiên. Chọn một điểm mốc, rồi chọn hành động:
| Hành động | Ý nghĩa |
|---|---|
| Restore code and conversation | Khôi phục cả code lẫn hội thoại về đúng thời điểm đã chọn. |
| Restore conversation | Lùi hội thoại về mốc đó, giữ nguyên code hiện tại. |
| Restore code | Hoàn tác thay đổi file, giữ nguyên hội thoại. |
| Summarize from here | Nén hội thoại từ mốc này trở đi thành một bản tóm tắt, giải phóng context. |
| Summarize up to here | Nén hội thoại trước mốc này, giữ nguyên các tin nhắn sau đó. |
| Never mind | Thoát menu, không làm gì cả. |
Hai lựa chọn khôi phục code chỉ xuất hiện khi checkpoint được chọn có thay đổi file để hoàn tác - nếu không, menu chỉ còn Restore conversation, hai lựa chọn Summarize, và Never mind. Với cả hai lựa chọn Summarize, bạn có thể gõ hướng dẫn vào ô "add context (optional)" để định hướng bản tóm tắt tập trung vào điều gì - chọn bằng phím số thì tóm tắt ngay, không cần hướng dẫn thêm.
Những gì /rewind KHÔNG hoàn tác được
Đây là phần hầu hết bài hướng dẫn khác bỏ sót hoặc nói quá đơn giản. Bốn giới hạn thật, theo đúng tài liệu chính thức:
| Giới hạn | Chi tiết |
|---|---|
| Lệnh bash không được track | rm file.txt, mv old.txt new.txt, cp source.txt dest.txt chạy qua bash sẽ không hoàn tác được bằng rewind - chỉ thay đổi qua file-editing tool của Claude mới được track. |
| Edit của subagent thường KHÔNG được khôi phục | Ngoại lệ duy nhất: một skill chạy context: fork ở foreground (đặt background: false) sửa trực tiếp working tree trong lượt của bạn, nên rewind khôi phục được edit đó như bình thường. Mọi subagent khác - kể cả forked skill chạy ngầm (mặc định) và /code-review --fix chạy ngầm - rewind KHÔNG khôi phục được, phải dùng git. |
| Thay đổi từ bên ngoài phiên không được track | Sửa tay ngoài Claude Code, hoặc edit từ một phiên chạy song song khác, thường không được ghi nhận (trừ khi vô tình đụng cùng file với phiên hiện tại). |
| File symlink/hard-link bị bỏ qua | Chọn Restore code hoặc Restore code and conversation, Claude Code bỏ qua mọi path track được là symlink hoặc hard link, và hiện cảnh báo Restored the code, but skipped N files. Muốn xem trước path nào sẽ bị bỏ qua, bật /debug trước khi restore - log ghi tại ~/.claude/debug/<session-id>.txt. |
Và một điều quan trọng hơn cả bảng trên: checkpoint được thiết kế để khôi phục nhanh trong phạm vi phiên làm việc, không phải bản thay thế cho version control. Lịch sử vĩnh viễn, branch, và cộng tác vẫn phải dựa vào git.
/rewind vs git vs /clear - bảng quyết định
Đây là câu hỏi thực tế nhất: gặp tình huống nào thì dùng công cụ nào? Đúng công cụ tiết kiệm vài giây; sai công cụ có thể mất cả buổi.
| Tình huống | Công cụ nên dùng | Vì sao |
|---|---|---|
| Hoàn tác vài edit gần nhất của Claude giữa task | /rewind → Restore code | Nhanh, không cần rời khỏi Claude Code, giữ nguyên hội thoại nếu muốn. |
| Hội thoại đi lạc nhưng code vẫn ổn | /rewind → Restore conversation | Lùi ngữ cảnh mà không đụng vào file đã sửa đúng. |
| Muốn lưu vĩnh viễn một trạng thái đang chạy tốt | git commit | Checkpoint tự xóa sau ~30 ngày và không phải version control thật; commit mới là lịch sử lâu dài. |
Claude vừa chạy rm/mv/npm install và cần đảo ngược | git (hoặc sửa tay) - không phải /rewind | Thay đổi qua bash không được checkpoint track, rewind sẽ không giúp được gì. |
| Context quá dài nhưng vẫn muốn tiếp tục làm việc | /rewind → Summarize, hoặc /compact | Nén hội thoại giữ context window rảnh mà không mất chi tiết gốc trong transcript. |
| Muốn làm lại từ đầu nhưng giữ nguyên file | /clear | Bắt đầu hội thoại mới với context trống, code trên đĩa không đổi. |
Mô tả một dòng chính xác từ tài liệu lệnh: /rewind "roll code and conversation back to a checkpoint, or summarize part of the conversation"; /clear "start a new conversation with empty context"; /compact "free up context by summarizing the conversation so far". Muốn thử một hướng khác mà không mất hội thoại gốc, còn có /branch - tạo nhánh hội thoại tại đúng điểm hiện tại.
Hoàn tác được cả sau khi /clear (mới từ v2.1.191)
Đây là mẹo ít người biết nhất bài này. Nếu bạn từng chạy /clear trong cùng một tiến trình Claude Code, menu rewind sẽ hiện thêm một dòng ở đầu danh sách: /resume <session-id> (previous session). Chọn dòng đó để quay lại đúng hội thoại đã tồn tại trước khi bạn /clear.
Vài điều cần biết trước khi dựa vào cơ chế này:
- Dòng này chỉ còn xuất hiện cho tới khi bạn thoát Claude Code hoặc resume một phiên khác - không phải vĩnh viễn.
- Cần Claude Code v2.1.191 trở lên. Bản cũ hơn không có dòng này - dùng
/resumethủ công rồi chọn phiên trước đó trong danh sách. - Version gate này tự nó là bằng chứng: tính năng checkpointing vẫn đang thay đổi theo từng bản release, không phải một API cố định.
Thói quen thử nghiệm an toàn mình đang dùng
Cách mình thực sự dùng hai công cụ này cùng nhau: commit git ở các mốc đã chạy ổn (một feature xong, một bug đã fix, test xanh), rồi để /rewind hấp thụ mọi sai lầm vặt giữa các lần commit đó. Rewind sớm và thường xuyên gần như miễn phí - vài giây, không mất gì. Fix một hội thoại đã trôi xa thì không rẻ chút nào; lúc đó bạn phải viết lại context, giải thích lại yêu cầu, và Claude vẫn có thể lặp lại đúng sai lầm cũ.
Thói quen này khớp thẳng với tinh thần vibe coding: thử nghiệm rẻ, revert nhanh, không sợ phá vỡ trạng thái đang chạy. Nó cũng là lý do viết TDD cùng AI hợp với checkpoint - mỗi vòng lặp red-green-refactor là một điểm rewind an toàn để quay lại nếu Claude sửa sai hướng.
AgentKit nằm ở đâu trong chuyện này?
Nói thẳng ranh giới: /rewind là tính năng gốc của Claude Code, hoạt động độc lập, không cần cài gì thêm. AgentKit (kit trả phí chạy bên trong Claude Code, khác Codex và khác OpenAI AgentKit) không đụng vào hay thay thế hệ thống checkpoint này. Điểm hữu ích: workflow brainstorm → plan → cook → ship của AgentKit chạy nhiều bước edit liên tiếp trong cùng phiên, nên khi một bước $ak:cook đi sai hướng, /rewind cho bạn hoàn tác đúng bước đó mà không mất cả phiên làm việc. Đọc thêm ở review AgentKit hoặc xem trực tiếp AgentKit tại đây.
Câu hỏi thường gặp (FAQ)
/rewind có hoàn tác được lệnh bash/terminal không?
Không. Checkpointing chỉ track thay đổi qua file-editing tool của Claude. Các lệnh chạy qua bash như rm, mv, cp không được ghi nhận và không thể hoàn tác bằng rewind - phải dùng git hoặc sửa tay.
Checkpoint được giữ bao lâu, và có đổi được không?
Mặc định checkpoint tự xóa cùng session sau 30 ngày, tối đa 100 checkpoint gần nhất mỗi phiên. Đổi số ngày qua cleanupPeriodDays trong settings.json (giá trị mặc định và vị trí xác nhận từ docs tại thời điểm viết - kiểm tra lại nếu bạn dựa vào đúng con số này).
Resume một phiên cũ xong còn rewind được không?
Được. Checkpoint lưu cùng conversation, nên sau khi /resume một phiên, /rewind vẫn hoạt động bình thường trên các checkpoint đã lưu của phiên đó.
Nếu đã /clear rồi mới muốn lấy lại checkpoint cũ thì sao?
Mở /rewind, dòng đầu danh sách sẽ hiện /resume <session-id> (previous session) - chọn để quay lại hội thoại trước khi /clear. Cần Claude Code v2.1.191 trở lên và chỉ còn hiệu lực tới khi bạn thoát app hoặc resume phiên khác; bản cũ hơn dùng /resume thủ công.
/rewind có thay thế được git không?
Không nên coi là thay thế. Checkpoint phục vụ hoàn tác nhanh trong phạm vi phiên, không phải lịch sử vĩnh viễn hay công cụ cộng tác. Muốn lưu trạng thái lâu dài, branch, hay làm việc nhóm vẫn phải dùng git.
Edit của subagent có được rewind khôi phục không?
Thường là không. Ngoại lệ: một skill chạy context: fork ở foreground (background: false) sửa trực tiếp working tree trong lượt của bạn thì được khôi phục như bình thường. Mọi subagent khác - kể cả forked skill chạy ngầm mặc định và /code-review --fix chạy ngầm - phải dùng git để đảo ngược.
Kết luận
/rewind là công cụ hoàn tác nhanh, session-level, không phải bản thay thế cho git. Dùng nó cho các sai lầm nhỏ giữa những lần commit; dùng git cho trạng thái muốn giữ vĩnh viễn hoặc bất cứ thứ gì Claude sửa qua bash. Nhớ bảng quyết định ở trên mỗi khi phân vân nên hoàn tác bằng gì, và luôn commit ở các mốc đã chạy ổn trước khi để Claude thử một hướng mới.