Xem thay đổi với git diff
Viewing Changes with git diff
Trước khi commit, bạn cần biết chính xác mình đã đổi những gì. Lệnh git diff cho bạn xem từng dòng thay đổi giữa các trạng thái khác nhau của dự án — đây là công cụ kiểm tra quan trọng nhất trong quy trình hằng ngày.
Ba trạng thái cần phân biệt
Git theo dõi file qua ba "vùng":
- Thư mục làm việc working directory — file thật bạn đang sửa trên đĩa.
- Vùng staging staging area (còn gọi là index) — những thay đổi bạn đã
git add, sẵn sàng để commit. HEAD— commit gần nhất, tức ảnh chụp đã được lưu vào lịch sử history.
git diff so sánh hai trong ba vùng đó, tùy tham số bạn dùng.
git diff: working vs staged
Chạy git diff không tham số sẽ so sánh working directory với staging area — tức những thay đổi chưa được git add:
# Xem thay đổi chưa được stage
git diff
Nếu một file đã được git add toàn bộ, nó sẽ không xuất hiện ở đây nữa.
git diff --staged: staged vs HEAD
Để xem những gì đã stage và sẽ đi vào commit tiếp theo, dùng --staged (hoặc --cached, hai cờ này tương đương):
# Xem thay đổi đã stage, sắp được commit
git diff --staged
Đây là bước kiểm tra cuối cùng nên làm ngay trước khi git commit.
git diff HEAD: tất cả thay đổi
Muốn xem mọi thay đổi so với commit cuối — cả staged lẫn chưa stage — dùng HEAD:
# So sánh working directory với commit cuối cùng
git diff HEAD
| Lệnh | So sánh |
|---|---|
git diff | working vs staged (chưa add) |
git diff --staged | staged vs HEAD (sắp commit) |
git diff HEAD | working vs HEAD (toàn bộ) |
Đọc diff output
Một đoạn diff điển hình trông như sau:
diff --git a/app.js b/app.js
index 83db48f..f735c2d 100644
--- a/app.js
+++ b/app.js
@@ -10,3 +10,4 @@ function start() {
const port = 3000;
- console.log("old");
+ console.log("new");
+ console.log("extra line");
Cách đọc:
--- a/app.jslà phiên bản cũ,+++ b/app.jslà phiên bản mới.- Dòng
@@ -10,3 +10,4 @@là hunk header: cho biết đoạn thay đổi bắt đầu ở dòng nào và dài bao nhiêu dòng ở mỗi bên. - Dòng bắt đầu bằng dấu trừ là dòng bị xóa; dấu cộng là dòng được thêm; dòng không dấu là ngữ cảnh context giữ nguyên.
So sánh giữa hai commit
Bạn cũng có thể so sánh trực tiếp hai commit hoặc nhánh: git diff abc123 def456 hay git diff main feature. Thêm tên file ở cuối để chỉ xem một file: git diff HEAD -- app.js.
Trọng tâm thi
Ghi nhớ cặp đối lập: git diff (chưa stage, working vs index) khác hẳn git diff --staged (đã stage, index vs HEAD). Nhầm hai cái này là lỗi phổ biến nhất khi đọc thay đổi.
Tóm tắt
- Git có ba vùng: working directory, staging area và
HEAD. git diffso sánh working vs staged (thay đổi chưaadd).git diff --stagedso sánh staged vsHEAD(thay đổi sắp commit).git diff HEADcho thấy toàn bộ thay đổi so với commit cuối.- Đọc diff: dấu trừ là xóa, dấu cộng là thêm, hunk header
@@ ... @@chỉ vị trí.