Bạn muốn xem file đã commit trong khi working tree đang sửa dở. Không cần chuyển nhánh hay hoàn tác file hiện tại chỉ để đọc nội dung. git show nhận tên object, trong đó cú pháp có dấu hai chấm giúp chỉ ra phiên bản file trong commit hoặc index.
Các lệnh bên dưới đã được chạy với Git 2.54.0 trong repository tạm độc lập. Tài liệu git-show, gitrevisions và git-ls-files được đối chiếu ngày 02/11/2026. Không fetch, push hoặc sửa repository của blog. Bài tập trung file text thông thường, chưa kiểm tra Git LFS, submodule hay xung đột merge thực tế.
Tạo ba nội dung khác nhau một cách có chủ ý
Snippet chạy trong subshell Bash, thư mục tạo bằng mktemp được in để bạn nhận biết. Nó để lại repository thử cho bạn xem tiếp; không có lệnh xóa thư mục tự động:
(
set -eu
demo_dir=$(mktemp -d)
echo "$demo_dir"
cd "$demo_dir"
git init -q
git config user.name 'AeDev Demo'
git config user.email '[email protected]'
printf 'committed\n' > note.txt
git add note.txt
git -c core.hooksPath=/dev/null commit -qm 'Initial note'
printf 'staged\n' > note.txt
git add note.txt
printf 'working\n' > note.txt
git show HEAD:note.txt
git show :note.txt
cat note.txt
git status --short
)
Kết quả đã kiểm tra lần lượt là committed, staged, working; status có MM note.txt. Ba nơi đang giữ ba snapshot riêng: HEAD là commit hiện tại, index chứa phần đã stage cho commit tiếp theo, working tree là file bạn đang đọc bằng công cụ thông thường.
Fixture cố ý dùng file mới đơn giản và tắt hook cho lần commit demo. Trong lần kiểm tra biên tập, cấu hình Git global/system cũng được cô lập. Với máy có cấu hình ký commit toàn cục, có thể cần cấu hình repository thử phù hợp trước khi chạy; lệnh demo không điều chỉnh cấu hình toàn máy.
Dấu hai chấm là một phần tên object
HEAD:note.txt nói “blob ở đường dẫn note.txt trong tree của HEAD”. :note.txt nói “blob tại đường dẫn đó trong index, stage 0”. Đừng biến chúng thành git show HEAD -- note.txt: dạng đó có mục đích xem commit và giới hạn path trong phần thay đổi, không phải yêu cầu in nguyên blob bằng cùng cú pháp.
Nếu đường dẫn có khoảng trắng, quote cả đối số, chẳng hạn git show 'HEAD:docs/design note.md'. Bình thường path sau dấu hai chấm được hiểu từ gốc repository; dùng ./ hoặc ../ có quy tắc tương đối được tài liệu gitrevisions mô tả. Khi chưa chắc, chạy từ gốc repository và ghi đường dẫn rõ ràng sẽ dễ review hơn.
Kiểm tra thao tác đọc không làm đổi dữ liệu
Trong thư mục thử đã in ra, bạn có thể chạy thêm:
git ls-files --stage -- note.txt
git diff --cached -- note.txt
git diff -- note.txt
git show HEAD:note.txt
git show :note.txt
cat note.txt
Các thao tác đọc trên đã được kiểm tra giữ nguyên nội dung working tree, blob index và HEAD của fixture. Trong output ls-files --stage, số stage là 0 khi chưa có xung đột. File chưa từng add không có entry index để :path đọc; file không có trong commit cũng không thể đọc bằng HEAD:path.
Nếu đang merge conflict, stage 0 có thể không tồn tại và các stage 1, 2, 3 mang vai trò khác nhau. Hãy xem index và trạng thái merge trước, không suy rằng lỗi đọc :path nghĩa Git làm mất file. Bài này không đưa quy trình giải quyết conflict tự động.
Tránh biến một lần xem thành một lần ghi
git show HEAD:note.txt in ra stdout. Nếu bạn thêm > note.txt, chính shell sẽ mở file để ghi và thay nội dung working tree. Đó là thao tác khác, không còn chỉ xem. Với file binary, tránh in trực tiếp vào terminal; chọn đích xuất riêng sau khi xác định rõ nhu cầu.
Khi điều tra một lỗi, ghi lại commit hoặc ref đã đọc cùng đường dẫn. HEAD có thể đổi sau một commit mới, còn object ID cụ thể giúp người khác mở đúng snapshot. Chọn đúng nguồn HEAD, index hay working tree trước khi đọc giúp bạn hiểu thay đổi mà không phải làm gián đoạn phần đang sửa.


