SSD Nodes Learn 🎉 VPS từ $5.50/tháng
Hướng dẫn Matt ConnorBởi Matt Connor

Cách resume session và xem lịch sử Claude Code

Dùng lệnh resume hoặc picker để mở lại Claude Code session, rồi tìm plaintext transcript trên máy đã chạy agent, kèm lưu ý khác biệt theo phiên bản.

Cách tiếp tục một phiên Claude Code

Để tiếp tục một phiên Claude Code, chạy claude --continue để mở cuộc trò chuyện gần nhất trong thư mục hiện tại, hoặc claude --resume để chọn một phiên cũ hơn từ danh sách. Trong một phiên đang chạy, lệnh /resume chuyển bạn sang cuộc trò chuyện khác mà không thoát. Dạng viết tắt là -c-r.

claude --continue
claude --resume
claude --resume auth-refactor

Nếu đã biết tên hoặc ID của phiên, truyền tên hoặc ID đó làm đối số. Claude Code sẽ mở thẳng phiên tương ứng mà không hiển thị trình chọn.

Toàn bộ nội dung dưới đây khớp với tài liệu phiên chính thức tại thời điểm tháng 8 năm 2026. Claude Code thường xuyên phát hành phiên bản mới, và tên flag cũng như phím tắt có thể thay đổi giữa các phiên bản. Vì vậy, khi nội dung ở đây không khớp với những gì terminal hiển thị, hãy coi claude --help và trang đó là nguồn tham chiếu chính.

Một session thực sự là gì

Một session là một cuộc trò chuyện đã lưu, gắn với một thư mục dự án. Session chứa toàn bộ lịch sử tin nhắn, bao gồm các tool call mà Claude đã thực hiện và kết quả trả về từ những lần gọi đó. Claude Code liên tục ghi session xuống đĩa trong khi bạn làm việc, không phải chỉ ghi một lần khi kết thúc. Vì vậy, cuộc trò chuyện vẫn được giữ lại khi bạn đóng terminal hoặc mất kết nối SSH.

Việc resume khôi phục nhiều hơn phần văn bản. Toàn bộ lịch sử cuộc trò chuyện được khôi phục, cùng với model mà session đang sử dụng và subagent mà session được khởi chạy cùng nếu bạn đã dùng --agent. Permission mode cũng được khôi phục, nhưng có các ngoại lệ vì lý do an toàn: plan mode và bypass-permissions mode không bao giờ được khôi phục. Vì vậy, session từng ở một trong hai mode này sẽ resume ở mode mà một session mới sẽ khởi chạy.

Một số thành phần không được khôi phục vì chúng là flag lúc khởi chạy, không phải trạng thái đã lưu. Các thư mục được thêm bằng --add-dir và những tùy chọn như --mcp-config, --settings--plugin-dir phải được truyền lại khi bạn resume. Các file settings như settings.json được đọc lại khi khởi chạy, nên bạn không cần truyền lại những cấu hình nằm trong các file đó.

Vì sao lịch sử phiên quan trọng hơn trên VPS

Có một thực tế khiến nhiều người bất ngờ. Bản ghi phiên được ghi trên máy nơi agent chạy. Nó không nằm trong tài khoản của bạn và không được đồng bộ lên cloud. Đó là một file trên ổ đĩa của máy đó.

Vì vậy, phiên bạn để trong một cửa sổ tmux trên VPS sẽ không xuất hiện trong danh sách chọn phiên trên laptop, và phiên từ laptop cũng không xuất hiện trên VPS. Không có dữ liệu nào di chuyển giữa hai máy. Nếu bạn làm việc theo cách phổ biến là chạy Claude Code trong tmux trên VPS, server sẽ là nơi tích lũy lịch sử hội thoại thực tế của bạn, còn danh sách chọn phiên trên máy local chỉ hiển thị một tập phiên khác và nhỏ hơn nhiều.

Sự tách biệt tương tự cũng áp dụng giữa các giao diện. Desktop app và extension của VS Code mỗi bên giữ lịch sử phiên riêng, và cả hai đều không dùng chung lịch sử của CLI. Claude Code trên web cũng có lịch sử riêng.

Trên cùng một máy, phạm vi tìm kiếm rộng hơn bạn có thể nghĩ. claude --resume <session-id> trước tiên tìm trong thư mục project hiện tại và các git worktree của project đó, sau đó tìm trong mọi project khác trên máy. Cụm từ cần nhớ là “trên máy đó”. Session ID từ host khác sẽ không phân giải được, và Claude Code cho bạn biết điều này bằng No conversation found with session ID: <session-id>.

Claude Code lưu lịch sử session ở đâu

Theo mặc định, transcript được lưu trong thư mục cấu hình của Claude Code, tại đường dẫn có dạng ~/.claude/projects/<project>/<session-id>.jsonl.

<project> là đường dẫn đến thư mục làm việc của bạn, trong đó mọi ký tự không phải chữ và số được thay bằng dấu gạch ngang. Vì vậy, session được bắt đầu trong /home/deploy/apps/api sẽ được lưu trong thư mục có tên -home-deploy-apps-api. Nếu tên sau khi chuyển đổi dài hơn 200 ký tự, Claude Code sẽ cắt ngắn tên đó và thêm hash của đường dẫn đầy đủ. Nhờ vậy, tên thư mục vẫn nằm trong giới hạn của filesystem.

File này có định dạng JSONL: mỗi dòng chứa một JSON object, tương ứng với một message, một lần tool use hoặc một mục metadata. Đây là văn bản có thể đọc được, nên đọc file này là an toàn.

Không nên viết parser dựa trực tiếp trên file này. Định dạng entry là nội bộ của Claude Code và thay đổi giữa các phiên bản. Vì vậy, script đọc trực tiếp các file này có thể hỏng sau bất kỳ lần update nào. Tài liệu chính thức của Anthropic khuyến nghị dùng /export hoặc các script interface đã được tài liệu hóa. Đây là khuyến nghị phù hợp chính vì lý do đó.

Có 2 setting làm thay đổi vị trí và thời gian lưu trữ. CLAUDE_CONFIG_DIR di chuyển toàn bộ thư mục cấu hình. Bạn có thể dùng setting này để lưu transcript trên volume riêng hoặc volume được mã hóa. cleanupPeriodDays trong settings.json kiểm soát thời gian lưu transcript. Giá trị mặc định là 30 ngày và giá trị tối thiểu là 1.

Nội dung thực tế của các file transcript

Mọi kết quả từ tool đều được ghi lại. Vì vậy, transcript chứa nội dung của các file mà Claude đã đọc và output của các command mà Claude đã chạy. Trang sử dụng dữ liệu của Anthropic nêu rõ: Claude Code lưu transcript của session cục bộ dưới dạng plaintext tại ~/.claude/projects/.

Hãy xem điều đó có ý nghĩa gì trên server. Nếu Claude đọc một file .env để tìm nguyên nhân khiến service không khởi động, nội dung của file đó hiện nằm trong một file JSONL trong home directory của bạn. Nếu một command in ra connection string, chuỗi đó cũng nằm trong file. Không có gì bị rò rỉ. Transcript chỉ ghi lại những gì đã xảy ra, đúng với mục đích của nó. Chính vì vậy, transcript phải nằm trong threat model của bạn.

  • Backup: backup dạng plain của /home hoặc /root sẽ sao chép transcript đến nơi lưu backup. Hãy thêm exclusion, hoặc chấp nhận rằng bản sao của prompt và nội dung file của bạn hiện nằm trong kho backup.
  • Snapshot và image: VPS snapshot được tạo vì bất kỳ lý do nào cũng chứa toàn bộ directory này. Image bạn clone để tạo server thứ hai cũng vậy.
  • Các account khác trên máy: tự kiểm tra mode bằng ls -ld ~/.claude ~/.claude/projects thay vì mặc định cho rằng quyền đã được giới hạn chặt.
  • Upload có chủ đích: command /feedback cố ý gửi lịch sử hội thoại đến Anthropic, còn /bug/share cũng báo cáo qua cùng đường này. Đây là những việc bạn chủ động thực hiện. Hãy hiểu rõ nội dung mình chấp nhận trước khi xác nhận.

Nếu bạn không muốn tạo transcript, CLAUDE_CODE_SKIP_PROMPT_HISTORY sẽ tắt việc ghi transcript, còn --no-session-persistence sẽ tắt việc này cho một lần chạy claude -p non-interactive. Hãy hiểu rõ trade-off trước khi đặt một trong hai tùy chọn. Resume cần transcript để đọc lại, nên không có transcript thì không thể resume.

Cách tìm một cuộc hội thoại cũ

Mở bộ chọn bằng claude --resume, hoặc bằng /resume từ bên trong một phiên đang chạy. Mỗi dòng hiển thị tên phiên nếu bạn đã đặt tên, hoặc tiêu đề được tạo tự động nếu chưa đặt, cùng với thời gian kể từ lần hoạt động cuối, nhánh git và kích thước tệp.

Bộ chọn có chức năng tìm kiếm. Nhấn / hoặc bắt đầu nhập để lọc danh sách. Các phím tắt đáng nhớ là những phím mở rộng phạm vi tìm kiếm: Ctrl+A hiển thị các phiên từ mọi project trên máy này, Ctrl+W hiển thị mọi worktree của repository hiện tại, còn Ctrl+B lọc theo nhánh git hiện tại. Nhấn Space để xem trước nội dung của một phiên trước khi chọn tiếp tục phiên đó, và Ctrl+R để đổi tên phiên đang được chọn.

Đặt tên cho các phiên giúp việc này dễ hơn nhiều. Bắt đầu một phiên bằng claude -n auth-refactor, hoặc chạy /rename auth-refactor giữa chừng, tại thời điểm bạn nhận ra cuộc hội thoại đã trở thành một phần việc thực sự. Sau đó, bạn có thể resume phiên đã đặt tên bằng tên của phiên ngay từ shell.

Phiên không đặt tên vẫn nhận được một tiêu đề được tạo tự động. Tiêu đề này được ghi bởi một request chạy nền đến một model nhỏ, nhanh, dùng để tóm tắt prompt đầu tiên của bạn. Tiêu đề giúp bạn nhận ra dòng tương ứng trong bộ chọn, nhưng không phải là handle để resume. claude --resume <name> chỉ khớp với những tên do bạn tự đặt.

Tìm session phù hợp bằng cách grep transcript

Đôi khi bạn chỉ nhớ một cụm từ mà không nhớ thêm gì khác. Transcript là các file văn bản, nên bạn có thể tìm kiếm trong đó.

grep -rl "nftables" ~/.claude/projects/

Lệnh này in ra đường dẫn của các transcript khớp. Tên file không có phần mở rộng .jsonl là session ID, và claude --resume <session-id> nhận giá trị này. Dùng grep để xác định session bạn muốn, sau đó resume session hoặc export session để đọc nội dung.

Có 2 điểm cần lưu ý. Nội dung được escape theo JSON, nên một cụm từ chứa ký tự dấu ngoặc kép hoặc bị ngắt qua dòng mới có thể không khớp với chuỗi literal. Ngoài ra, kết quả khớp bên trong kết quả của tool chỉ cho biết Claude đã thấy đoạn văn bản đó, không có nghĩa là có người đã nhập nó.

Đọc và xuất một cuộc hội thoại

/export kết xuất cuộc hội thoại hiện tại dưới dạng văn bản thuần, trong đó tin nhắn và output của tool được ghi theo định dạng dễ đọc thay vì JSON. Khi không có đối số, lệnh mở menu cho phép chọn clipboard hoặc một file. Khi có tên file, /export handover.txt ghi thẳng vào đường dẫn đó. Đây là cách phù hợp để chuyển một cuộc hội thoại từ server về laptop hoặc đính kèm vào ticket.

Với các tác vụ tự động, hãy dùng những interface được thiết kế để ổn định. Hook và lệnh status line nhận trường transcript_path làm input, nên hook SessionEnd có thể lưu trữ transcript khi một session kết thúc. Bạn cũng có thể đặt câu hỏi cho một session đã lưu mà không cần mở session đó:

claude -p --resume <session-id> --output-format json "summarize what we changed" | jq -r '.result'

Lệnh này gửi một prompt tiếp theo vào cuộc hội thoại cũ và trả về JSON có cấu trúc. Đây là nền tảng tốt hơn nhiều so với việc parse định dạng JSONL, vốn có thể thay đổi trong bản release tiếp theo.

Bắt đầu phiên mới tốt hơn tiếp tục phiên cũ

Tiếp tục phiên cũ sẽ khôi phục toàn bộ lịch sử, và mọi request sau đó đều phải mang theo toàn bộ lịch sử này. Một conversation đã chạy trong bốn giờ hôm qua sẽ tốn nhiều chi phí nếu tiếp tục hôm nay. cách mức sử dụng token tăng trong một session dài giải thích chi phí đó thực sự phát sinh từ đâu.

Đôi khi Claude Code cung cấp một lựa chọn trung gian. Với gói Pro hoặc Max, nếu bạn tiếp tục một session đã idle khoảng một giờ và chứa hơn 100,000 token, một dialog sẽ mở ra trước message đầu tiên của bạn. Đến lúc đó, prompt cache đã hết hạn. Vì vậy, request tiếp theo sẽ xử lý lại toàn bộ lịch sử một lần, bất kể bạn chọn tùy chọn nào.

  • Resume from summary chạy compaction ngay lập tức. Các request sau đó chỉ mang theo summary thay vì toàn bộ lịch sử. Chi phí mỗi request thấp hơn, nhưng mọi nội dung bị loại khỏi summary sẽ không còn khả dụng.
  • Resume full session as-is tải conversation không thay đổi. Mọi chi tiết vẫn được giữ lại, nhưng chi phí mỗi request tăng theo kích thước của conversation.

Tùy chọn thứ ba tiếp tục phiên đầy đủ và ngăn dialog xuất hiện trong những lần tiếp tục sau.

Quyết định này đơn giản hơn bạn nghĩ. Hãy tiếp tục session khi nội dung bạn sắp nhập phụ thuộc vào những gì đã được nói trước đó. Hãy bắt đầu session mới khi không phụ thuộc. Bạn có thể dễ dàng nhận ra context bị trôi nếu chú ý: Claude nhắc đến một file bạn đã xóa từ một giờ trước, hoặc tranh luận lại một quyết định bạn đã chốt ở đầu session. Đó là stale context. Việc giữ nó lại vừa tốn token vừa làm giảm độ chính xác.

Nếu phần hữu ích trong conversation cũ là một quyết định hoặc thông tin bạn sẽ cần lại, đừng dựa vào việc resume để giữ nó. Hãy ghi lại ở nơi mọi session đều có thể xem được. Đây là mục đích của các memory file của Claude Code.

/branch cũng đáng biết trong trường hợp này. Nó sao chép conversation đến thời điểm hiện tại rồi chuyển bạn sang bản sao, còn bản gốc vẫn nguyên vẹn và vẫn xuất hiện trong picker. Dùng tùy chọn này để thử một hướng tiếp cận thứ hai mà không làm mất hướng đầu tiên.

Resume khác compaction và memory

Ba khái niệm này thường bị nhầm lẫn, nhưng chúng giải quyết các vấn đề khác nhau.

Resume là việc khôi phục một conversation sau khi bạn đã thoát, reboot hoặc chuyển sang tác vụ khác. Compaction liên quan đến context window trong một conversation đang hoạt động: /compact thay thế phần context mà Claude đang giữ bằng một bản tóm tắt, để các request sau gửi ít token hơn. Nếu vấn đề của bạn là context window đã đầy, hãy dùng compaction. Quản lý context window của Claude Code giải thích đầy đủ vấn đề này.

Memory lại khác. Các file CLAUDE.md và auto memory chứa instruction và fact được load khi bắt đầu mỗi session, nên chúng không phải là một conversation để bạn quay lại. Đó là những gì bạn ghi lại để không bao giờ cần quay lại một conversation cụ thể.

Nếu bạn muốn chạy đồng thời 2 conversation và để chúng phối hợp với nhau, đó là một cơ chế riêng. Các session Claude Code có thể nhắn tin cho nhau khi cả 2 vẫn đang hoạt động. Đây là vấn đề khác với việc lấy session của ngày hôm qua trở lại từ disk.

FAQ

Claude Code lưu lịch sử session ở đâu?

Mặc định, Claude Code lưu tại ~/.claude/projects/<project>/<session-id>.jsonl trong thư mục cấu hình, trong đó <project> là đường dẫn thư mục làm việc với các ký tự không phải chữ và số được thay bằng dấu gạch nối. Mỗi file dùng định dạng JSONL: mỗi dòng là một đối tượng JSON tương ứng với một message, lần dùng tool hoặc mục metadata. CLAUDE_CONFIG_DIR chuyển thư mục cấu hình sang vị trí khác. cleanupPeriodDays trong settings.json đặt thời gian lưu transcript, mặc định là 30 ngày và tối thiểu là 1 ngày.

Vì sao tôi không thấy session VPS trong picker trên laptop?

Vì transcript được ghi vào ổ đĩa của máy đang chạy agent và không có cơ chế đồng bộ giữa các máy. Một cuộc trò chuyện bạn thực hiện bên trong tmux trên VPS chỉ tồn tại trên VPS. Hãy resume session đó trên VPS qua SSH. Hoặc chạy /export bên trong session rồi sao chép file văn bản sang laptop nếu bạn muốn lưu bản cục bộ.

Tôi có thể resume session đã bắt đầu trong thư mục khác không?

Có, nếu bạn có session ID. claude --resume <session-id> trước tiên tìm trong thư mục project hiện tại và các git worktree của project đó, sau đó tìm trong mọi project khác trên cùng máy. Trong picker, Ctrl+A mở rộng danh sách đến mọi project trên máy, còn Ctrl+W mở rộng danh sách đến mọi worktree của repository hiện tại. Nếu không có kết quả phù hợp, Claude Code báo No conversation found with session ID: <session-id>.

Tôi nên resume session cũ hay bắt đầu session mới?

Hãy resume khi message tiếp theo phụ thuộc vào nội dung đã trao đổi trong conversation đó. Hãy bắt đầu session mới khi không có sự phụ thuộc này, vì resume sẽ tải toàn bộ lịch sử và mọi request sau đó đều tiếp tục mang theo lịch sử này. Hãy chú ý hiện tượng context bị lệch: nếu session liên tục nhắc đến các file bạn đã xóa, session đó đang chứa context cũ. Context này làm tăng số token sử dụng và giảm độ chính xác ở mọi lượt trao đổi.

Tôi có thể ngăn Claude Code ghi transcript vào ổ đĩa không?

Có. CLAUDE_CODE_SKIP_PROMPT_HISTORY tắt việc ghi transcript. --no-session-persistence tắt việc ghi transcript cho một lần chạy claude -p non-interactive. Trước tiên hãy hiểu rõ đánh đổi, vì resume đọc dữ liệu từ transcript. Khi tắt ghi transcript, --continue--resume sẽ không có dữ liệu để tải. Nếu bạn chỉ lo ngại vị trí lưu file chứ không muốn xóa việc lưu transcript, hãy trỏ CLAUDE_CONFIG_DIR đến một encrypted volume và giảm cleanupPeriodDays thay vì tắt hoàn toàn.