Domain 2 · 8 phút đọc

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ệnhSo sánh
git diffworking vs staged (chưa add)
git diff --stagedstaged vs HEAD (sắp commit)
git diff HEADworking 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.js là phiên bản cũ, +++ b/app.js là phiên bản mới.
  • Dòng @@ -10,3 +10,4 @@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 diff so sánh working vs staged (thay đổi chưa add).
  • git diff --staged so sánh staged vs HEAD (thay đổi sắp commit).
  • git diff HEAD cho 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í.