Xem lịch sử với git log
Viewing History with git log
Sau khi tích luỹ vài commit, bạn cần xem lại lịch sử dự án: ai đã commit gì, theo thứ tự nào. git log là công cụ chính để đọc lịch sử, và qua đó ta hiểu rõ một commit thực chất là gì.
git log: đọc lịch sử
git log liệt kê các commit từ mới nhất tới cũ nhất:
git log
Mỗi mục hiển thị: mã SHA của commit, tác giả, thời gian và commit message. Đây là cách bạn truy vết một thay đổi đã được đưa vào dự án từ khi nào và vì sao.
Các tuỳ chọn hữu ích
Log mặc định khá dài dòng. Vài cờ giúp đọc nhanh hơn:
# Mỗi commit gọn trên một dòng (SHA rút gọn + message)
git log --oneline
# Vẽ sơ đồ nhánh dạng cây, hữu ích khi có nhiều branch
git log --oneline --graph --all
# Giới hạn số commit gần nhất
git log -5
| Tuỳ chọn | Tác dụng |
|---|---|
--oneline | Mỗi commit một dòng, SHA rút gọn |
--graph | Vẽ cây nhánh bằng ký tự |
--all | Hiện commit của mọi branch |
-n (ví dụ -5) | Chỉ n commit gần nhất |
Commit thực chất là gì
Mỗi commit không chỉ là "một bản lưu" mà là một đối tượng gồm:
- Một snapshot — ảnh chụp toàn bộ trạng thái dự án tại thời điểm commit (không phải chỉ "phần khác biệt").
- Một mã SHA-1 dài 40 ký tự, sinh ra từ nội dung commit. Mã này là định danh duy nhất và bất biến; đổi bất kỳ nội dung nào cũng tạo ra SHA khác.
- Một (hoặc nhiều) con trỏ tới parent — commit ngay trước nó. Chuỗi parent này nối các commit thành lịch sử.
Vì mỗi commit trỏ về parent, lịch sử Git tạo thành một chuỗi liên kết ngược về commit đầu tiên. Commit đầu tiên không có parent.
# Xem chi tiết một commit qua SHA (chỉ cần vài ký tự đầu)
git show a1b2c3d
HEAD: bạn đang ở đâu
HEAD là một con trỏ đặc biệt cho biết bạn đang đứng ở commit nào. Thông thường HEAD trỏ tới branch hiện tại (ví dụ main), và branch đó trỏ tới commit mới nhất.
git log --oneline -1 # commit mà HEAD đang trỏ tới
Khi bạn tạo một commit mới, branch hiện tại tiến lên commit đó và HEAD đi theo. Hiểu HEAD giúp bạn nắm được "mình đang ở đâu" trong cây lịch sử.
Snapshot, không phải diff
Một quan niệm sai phổ biến: nghĩ Git lưu "phần thay đổi" giữa các phiên bản. Thực tế Git lưu snapshot đầy đủ ở mỗi commit (với file không đổi thì tham chiếu lại để tiết kiệm chỗ). Phần "diff" bạn thấy là Git tính ra khi so sánh hai snapshot.
Trọng tâm thi
Nhớ ba ý: (1) commit có SHA bất biến sinh từ nội dung, (2) commit trỏ tới parent tạo thành chuỗi lịch sử, (3) HEAD trỏ tới commit/branch hiện tại. git log --oneline --graph là cách xem nhanh cấu trúc này.
Tóm tắt
git logliệt kê commit mới đến cũ kèm SHA, tác giả, thời gian, message.--onelinegọn một dòng,--graph --allvẽ cây nhánh,-ngiới hạn số commit.- Commit là một snapshot đầy đủ, có SHA bất biến sinh từ nội dung, và trỏ tới parent tạo thành chuỗi lịch sử.
- Git lưu snapshot chứ không lưu diff; diff được tính ra khi so sánh hai snapshot.
- HEAD là con trỏ chỉ commit/branch hiện tại; tạo commit mới thì branch và HEAD cùng tiến lên.