SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-09-12

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

Hướng dẫn resume Claude Code bằng tên, ID hoặc picker, kèm vị trí transcript plaintext trên máy chạy agent và lưu ý khác biệt giữa các phiên bản.

Cách tiếp tục một session Claude Code

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

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

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

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

Session thực sự là gì

Một session là một cuộc hội thoại đã lưu, gắn với một thư mục project. 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ề. Claude Code liên tục ghi session vào disk trong lúc 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 hội thoại vẫn tồn tại sau khi bạn đóng terminal hoặc mất kết nối SSH.

Resume khôi phục nhiều hơn phần văn bản. Toàn bộ lịch sử hội thoại đượ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ệ để đảm bảo 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ẽ bắt đầu.

Một số thiết lập không được khôi phục vì chúng là flag lúc khởi chạy, không phải state đã lưu. Các directory được thêm bằng --add-dir và những option như --mcp-config, --settings, --plugin-dir phải được truyền lại khi resume. Các file cấu hình như settings.json được đọc lại lúc khởi chạy, nên những thiết lập nằm trong đó không cần nhập lại. Credential cũng thuộc nhóm này: Claude Code xác định cách authenticate lúc khởi chạy, dựa trên thông tin đăng nhập và environment của bạn, thay vì khôi phục credential cùng conversation. Vì vậy, một session được resume trên VPS có ANTHROPIC_API_KEY không mong muốn lọt vào shell sẽ gặp lỗi API key không hợp lệ, dù lần trước session vẫn chạy bình thường.

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 chạy agent. Nó không nằm trong tài khoản của bạn và không được đồng bộ lên cloud. Đây 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 trình 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 được 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, máy chủ sẽ là nơi tích lũy lịch sử hội thoại thực tế, còn trình chọn phiên bạn thấy trên máy cục bộ sẽ hiển thị một tập phiên khác và nhỏ hơn nhiều.

Sự phân tách tương tự cũng áp dụng giữa các giao diện. Ứng dụng desktop và extension 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. Cowork còn tách biệt hơn nữa vì chạy trong sandbox của Anthropic thay vì trên phần cứng do bạn sở hữu. Vì vậy, nếu bạn đang cân nhắc Cowork và Claude Code, vị trí lưu bản ghi phiên là một phần của quyết định.

Trong 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 thư mục đó, sau đó tìm trong mọi project khác trên máy. Cụm từ cần nhớ là “trên máy đó”. ID phiên từ mộ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ử phiên ở đâ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 nối. Vì vậy, một phiên 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 đó rồi thêm hash của toàn bộ đường dẫn. Nhờ vậy, tên thư mục vẫn nằm trong giới hạn của filesystem.

File này dùng định dạng JSONL: mỗi dòng là một JSON object, có thể là message, lần dùng tool hoặc mục metadata. Đây là text có thể đọc được và bạn có thể đọc file này.

Không nên viết parser dựa 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 cập nhật nào. Tài liệu chính thức của Anthropic khuyến nghị dùng /export hoặc các giao diện script được tài liệu hóa. Đây là khuyến nghị phù hợp chính vì lý do đó.

Có 2 setting thay đổi vị trí và thời gian lưu. CLAUDE_CONFIG_DIR di chuyển toàn bộ thư mục cấu hình. Đây là cách 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.

Thực sự có gì bên trong các file transcript

Mọi kết quả của tool đều được ghi lại. Vì vậy, transcript chứa nội dung 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 ở dạng plaintext cục bộ trong ~/.claude/projects/.

Hãy xem điều này có ý nghĩa gì trên server. Nếu Claude đọc một file .env để tìm nguyên nhân khiến một service không khởi động, nội dung 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ó, và chính vì vậy bạn phải tính nó vào threat model.

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

Nếu bạn không muốn có transcript, CLAUDE_CODE_SKIP_PROMPT_HISTORY sẽ ngăn việc ghi transcript, còn --no-session-persistence sẽ ngăn việc ghi transcript 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 này. Resume dựa vào transcript, nên không có transcript thì không thể resume.

Cách tìm một cuộc trò chuyện cũ

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

Trình 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ị session 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 git branch hiện tại. Nhấn Space để xem trước nội dung của một session trước khi chọn tiếp tục, và Ctrl+R để đổi tên session đang được chọn.

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

Session chưa đặt tên vẫn được gán một tiêu đề tự động. Tiêu đề này được tạo bởi một request chạy nền đến một model nhỏ, nhanh, có nhiệm vụ 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 trình chọn, nhưng không thể dùng làm tên để 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ừ và không nhớ gì khác. Transcript là 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> chấp nhận ID đó. Dùng grep để xác định session bạn muốn, sau đó resume session hoặc export session để đọc nội dung thực tế.

Có 2 điểm cần lưu ý. Nội dung được escape theo định dạng 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 nguyên văn. 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 túy. Tin nhắn và output của tool được ghi lại theo cách dễ đọc thay vì dưới dạng JSON. Nếu 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 sang laptop hoặc đính kèm cuộc hội thoại vào một 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, vì vậy hook SessionEnd có thể lưu trữ transcript khi 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 release tiếp theo.

Khi 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 token usage cộng dồn trong một session dài giải thích chi phí này thực sự phát sinh từ đâu.

Claude Code đôi khi cung cấp một lựa chọn trung gian. Với gói Pro hoặc Max, khi bạn tiếp tục một session đã idle khoảng một giờ và có 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 thông tin bị summary loại bỏ 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.

Có một tùy chọn thứ ba: tiếp tục phiên đầy đủ và không hiển thị dialog này 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 resume 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 có sự phụ thuộc đó. Drift rất dễ nhận ra nếu bạn 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 đã chốt ở đầu session. Đó là context cũ. Mang context đó sang phiên tiếp theo vừa tốn token vừa làm giảm độ chính xác.

Nếu phần hữu ích của conversation cũ là một quyết định hoặc thông tin bạn sẽ cần dùng 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ể đọc được. Đó là mục đích của các file memory 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 khác mà không làm mất hướng ban đầu.

Resume khác gì compaction và memory

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

Resume là việc mở lại một cuộc trò chuyện 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 cuộc trò chuyện đang chạy: /compact thay thế phần context mà Claude đang giữ bằng một bản tóm tắt, nên các request sau đó gửi ít token hơn. Nếu vấn đề là context window đã đầy, hãy dùng compaction. Quản lý context window của Claude Code giải thích đầy đủ cách 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 cuộc trò chuyện để bạn quay lại. Đó là những thông tin bạn ghi lại để không bao giờ cần quay lại một cuộc trò chuyện.

Nếu bạn muốn hai cuộc trò chuyện chạy đồng thời và 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ả hai vẫn đang chạy. Đây là một vấn đề khác với việc lấy session của ngày hôm qua từ disk và mở lại.

FAQ

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

Mặc định, lịch sử được lưu trong thư mục cấu hình tại ~/.claude/projects/<project>/<session-id>.jsonl. 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 chứa một JSON object cho một message, một lần tool được sử dụng hoặc một 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 chạy agent. Không có cơ chế đồng bộ transcript giữa các máy. Conversation bạn thực hiện trong tmux trên VPS chỉ tồn tại trên VPS. Hãy resume session đó qua SSH, hoặc chạy /export bên trong session rồi copy text file sang máy local nếu muốn lưu bản ghi 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 thư mục đó, 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 để tìm trong mọi project trên máy. Ctrl+W mở rộng danh sách để tìm trong 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 phụ thuộc, vì resume sẽ tải toàn bộ lịch sử và mọi request sau đó đều phải mang theo lịch sử này. Hãy chú ý hiện tượng lệch ngữ cảnh: nếu session liên tục nhắc đến những file bạn đã xóa, session đang mang context cũ. Context đó làm tốn token và giảm độ chính xác ở mỗi lượt.

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 này cho một lần chạy claude -p non-interactive. Trước tiên cần hiểu rõ đánh đổi, vì resume đọc transcript. Khi tắt ghi transcript, --continue và --resume sẽ không có dữ liệu để tải. Nếu bạn chỉ lo về vị trí lưu file chứ không phải việc file tồn tại, hãy trỏ CLAUDE_CONFIG_DIR đến một encrypted volume và giảm cleanupPeriodDays thay vì tắt hoàn toàn.