Đọc hiểu lịch sử commit: git log, diff và commit message chuẩn
Bài trước bạn đã biết cách tạo commit — tức là đã biết "chụp ảnh" dự án. Nhưng chụp xong mà không biết xem lại album thì chụp làm gì? Bài này sẽ biến bạn từ người "commit cho có" thành người đọc lịch sử Git như đọc truyện: biết ai làm gì, khi nào, và quan trọng nhất — tại sao.
Đây cũng là kỹ năng khiến bạn ghi điểm cực mạnh khi vào team: dev mới mà biết lần ngược lịch sử để hiểu code là dev khiến senior phải nhìn bằng con mắt khác.
git log — cuốn nhật ký của dự án
Mặc định, git log hiển thị đầy đủ thông tin từng commit:
git log
Output:
commit f4e5d6a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4
Author: Dat Nguyen <datngo.it@gmail.com>
Date: Wed Jun 10 09:15:00 2026 +0700
Thêm mô tả mục tiêu học tập
Đầy đủ nhưng dài dòng. Thực tế ít ai dùng git log "chay". Đây mới là bộ ba bạn sẽ gõ mỗi ngày:
1. --oneline: gọn trong một dòng
git log --oneline
f4e5d6a Thêm mô tả mục tiêu học tập
a1b2c3d Thêm file README cho dự án
Mỗi commit một dòng: hash rút gọn + tiêu đề. Nhanh, gọn, đủ dùng cho 90% trường hợp.
2. --graph: vẽ sơ đồ nhánh
git log --oneline --graph --all
* f4e5d6a (HEAD -> main) Thêm mô tả mục tiêu học tập
* a1b2c3d Thêm file README cho dự án
Bây giờ repo còn thẳng tuột nên chưa thấy gì hay. Nhưng khi dự án có nhiều nhánh, --graph vẽ cho bạn cây lịch sử bằng ASCII — nhìn phát hiểu ngay nhánh nào tách từ đâu, gộp vào đâu. Cứ nhớ combo này: git log --oneline --graph --all.
3. --format: tùy biến theo ý mình
git log --format="%h | %an | %ar | %s" -5
f4e5d6a | Dat Nguyen | 2 hours ago | Thêm mô tả mục tiêu học tập
a1b2c3d | Dat Nguyen | 3 hours ago | Thêm file README cho dự án
Vài placeholder hay dùng: %h hash ngắn, %an tên tác giả, %ar thời gian tương đối, %s tiêu đề commit. Số -5 nghĩa là chỉ lấy 5 commit gần nhất.
Mẹo lọc nhanh khi cần "điều tra":
git log --oneline --author="Dat" # commit của một người
git log --oneline -- README.md # commit đụng vào một file
git log --oneline --grep="login" # tìm theo nội dung message
git show — soi chi tiết một commit
git log cho cái nhìn toàn cảnh, còn muốn soi kỹ một commit cụ thể:
git show f4e5d6a
commit f4e5d6a...
Author: Dat Nguyen <datngo.it@gmail.com>
Date: Wed Jun 10 09:15:00 2026 +0700
Thêm mô tả mục tiêu học tập
diff --git a/README.md b/README.md
@@ -1 +1,2 @@
# Học Git
+Ghi chú học Git mỗi ngày
Bạn thấy đủ: ai, khi nào, message gì, và chính xác những dòng nào đã thay đổi. Dòng bắt đầu bằng + là thêm vào, - là xóa đi. Không cần hash cũng được — git show không tham số sẽ hiển thị commit mới nhất.
git diff — so sánh trước khi chốt
Đây là lệnh "kiểm hàng trước khi đóng gói". Có 3 phép so sánh bạn cần phân biệt:
git diff # Working Directory vs Staging Area
git diff --staged # Staging Area vs commit gần nhất
git diff a1b2c3d f4e5d6a # giữa 2 commit bất kỳ
Nhớ lại 3 vùng ở bài trước nhé:
git difftrả lời: "mình vừa sửa gì mà chưa add?"git diff --stagedtrả lời: "nếu commit ngay bây giờ thì cái gì sẽ được lưu?"
Thói quen vàng của dân thực chiến: luôn chạy git diff --staged trước khi commit. Chỉ mất 5 giây, nhưng cứu bạn khỏi vô số lần commit nhầm dòng console.log debug hay file config chứa mật khẩu.
Viết commit message chuẩn Conventional Commits
Lịch sử Git chỉ hữu ích khi commit message tử tế. So sánh hai album sau:
update
fix bug
fix bug 2
final
final that bug
và:
feat: thêm trang đăng nhập với Google OAuth
fix: sửa lỗi crash khi email rỗng
docs: bổ sung hướng dẫn cài đặt
Album thứ hai viết theo Conventional Commits — quy ước được hầu hết team chuyên nghiệp sử dụng. Cấu trúc:
<type>: <mô tả ngắn gọn ở thì hiện tại>
Các type chính bạn cần nhớ:
feat:— thêm tính năng mớifix:— sửa bugdocs:— thay đổi tài liệurefactor:— sửa code nhưng không đổi hành vitest:— thêm hoặc sửa testchore:— việc lặt vặt (nâng version, config...)
Ba quy tắc viết mô tả: ngắn dưới 50–70 ký tự; mô tả cái gì thay đổi chứ không phải bạn đã làm gì ("thêm validate email" thay vì "tôi đã thêm validate email"); và nếu cần giải thích tại sao, viết thêm phần thân sau một dòng trống:
git commit -m "fix: chặn submit form khi email rỗng" -m "Người dùng bấm submit liên tục khiến server nhận request rác. Validate ngay phía client để giảm tải."
Sau này dùng git log --grep="fix:" là lọc ra toàn bộ lịch sử sửa bug — đó là phần thưởng cho việc commit có kỷ luật.
Thực hành 2 phút
Mở repo hoc-git từ bài trước và chạy thử:
echo "- Học xong bài 3" >> README.md
git diff # xem mình vừa sửa gì
git add README.md
git diff --staged # kiểm hàng lần cuối
git commit -m "docs: ghi nhận tiến độ học bài 3"
git log --oneline --graph # ngắm thành quả
git show # soi chi tiết commit vừa tạo
Chạy đủ chuỗi này vài lần là tay bạn tự nhớ, không cần học thuộc.
Tổng kết
git log --onelinexem nhanh lịch sử; thêm--graph --allđể thấy cấu trúc nhánh;--formatkhi cần tùy biến.git show <hash>soi chi tiết một commit: ai, khi nào, sửa dòng nào.git diffso Working Directory với Staging;git diff --stagedkiểm tra lần cuối trước khi commit — tập thành thói quen.- Viết commit message theo Conventional Commits (
feat:,fix:,docs:...) — lịch sử đẹp là tài sản của cả team.
Đến giờ mọi commit của bạn vẫn nằm trên một đường thẳng. Nhưng sức mạnh thật sự của Git nằm ở chỗ khác: làm nhiều việc song song mà không ai giẫm chân ai. Bài sau chúng ta sẽ học về Branch — tạo nhánh, chuyển nhánh, và quy trình feature branch mà mọi team chuyên nghiệp đều dùng. Hẹn gặp ở Bài 4!
Series Git cơ bản — Bài 3/10