Bạn đã stage một file có dấu cách thừa cuối dòng, chạy git diff --check và không thấy thông báo. Điều này có thể hoàn toàn đúng: lệnh đang nhìn phần chưa stage, còn lỗi đã nằm trong index.
Bài hướng dẫn cách chọn hai phía của diff trước khi kiểm tra whitespace. Ví dụ được chạy bằng Git 2.54.0 ngày 27/10/2026 trong repository tạm. Các lệnh kiểm tra không tự sửa file; bước tạo fixture ở dưới chỉ ghi dữ liệu giả vào thư mục mới.
1. Phân biệt ba cách kiểm tra
git diff --check
git diff --cached --check
git diff --check HEAD
Lệnh đầu so working tree với index, nên kiểm tra thay đổi chưa stage của file được Git theo dõi. Lệnh thứ hai so index với HEAD, phù hợp với nội dung bạn sắp commit. Lệnh thứ ba so trạng thái file trong working tree với HEAD; nó hữu ích khi muốn nhìn thay đổi hiện tại, nhưng không thay thế việc xác nhận phần staged.
File mới chưa được theo dõi không tự xuất hiện trong diff thông thường. Với file định đưa vào commit, stage đúng file rồi kiểm tra phần cached. Không dùng git add . chỉ để khiến một phép kiểm tra có dữ liệu, vì bạn có thể vô tình đưa thêm file không liên quan vào commit.
2. Tạo một lỗi có thể nhìn thấy
Chạy từng lệnh trong Bash hoặc zsh. Repository thử nghiệm nằm ở đường dẫn do mktemp tạo; biến demo_dir cần được giữ trong cùng phiên terminal.
demo_dir="$(mktemp -d)"
git -C "$demo_dir" init -q
git -C "$demo_dir" -c user.name=Demo -c [email protected] \
-c commit.gpgsign=false commit --allow-empty -qm base
printf 'xin chao \n' > "$demo_dir/demo.txt"
git -C "$demo_dir" add demo.txt
git -C "$demo_dir" diff --check
git -C "$demo_dir" diff --cached --check
Lệnh đầu kiểm tra diff không báo lỗi vì working tree và index giống nhau. Lệnh cuối báo trailing whitespace ở dòng 1 và trả mã thoát khác 0. Hai dấu cách trước \n trong lệnh printf là chủ ý của fixture, không phải lỗi trình bày cần tự xóa trước khi chạy.
Hãy quan sát đường dẫn và số dòng trong thông báo. Chúng giúp bạn quay về đúng thay đổi mới thay vì chạy công cụ xóa whitespace cho cả repository.
3. Sửa file rồi nhớ stage lại
printf 'xin chao\n' > "$demo_dir/demo.txt"
git -C "$demo_dir" diff --cached --check
git -C "$demo_dir" add demo.txt
git -C "$demo_dir" diff --cached --check
Phép kiểm tra cached đầu tiên vẫn báo lỗi: bản cũ còn ở index. Sau lần add tiếp theo, nó không in lỗi và trả mã 0. Đây là lý do việc sửa đúng file trên editor chưa đủ để bảo đảm commit sắp tạo chứa bản đã sửa.
Các thông báo lỗi mong đợi trong fixture không phải sự cố cần bỏ qua mã thoát. Nếu chạy cả bài bằng một script có set -e, script sẽ dừng tại lần kiểm tra cố ý gây lỗi. Để thực hành, chạy các lệnh riêng rồi xem echo $? ngay sau lệnh cần kiểm tra.
4. –check không giống –exit-code
--check tìm lỗi được quy tắc whitespace và conflict marker của Git nhận biết trong thay đổi. Một diff có nội dung mới hợp lệ vẫn có thể trả 0. --exit-code lại dùng mã thoát để cho biết hai phía khác nhau; tài liệu ghi nó không tương thích với --check.
Trong CI, trước tiên xác định bạn muốn kiểm tra gì. Với nội dung đã commit, có thể dùng một khoảng commit rõ ràng:
git diff --check BASE_SHA HEAD
Thay BASE_SHA bằng commit gốc đã xác định cho lượt kiểm tra. Nếu cần so từ merge base, ba chấm có ý nghĩa riêng; đừng đổi hai chấm thành ba chấm mà chưa xác định phạm vi mong muốn. Bài không thiết lập workflow CI hay giả định nhánh mặc định của dự án.
Quy tắc dự án và lỗi thường gặp
core.whitespace điều khiển loại lỗi được xem xét. Mặc định có whitespace cuối dòng và một số mẫu thụt lề không phù hợp; nó không phải lệnh cấm mọi tab. Dự án còn có thể điều chỉnh theo đường dẫn qua thuộc tính whitespace trong .gitattributes.
Nếu cùng thay đổi mà máy bạn và CI cho kết quả khác, đọc cấu hình đang có hiệu lực và attributes của file trước. Đừng đổi cấu hình global chỉ để làm một lần kiểm tra im lặng. Với file cố ý có khoảng trắng mang ý nghĩa, nhóm cần một quy tắc cụ thể và được review.
Giới hạn và bước tiếp theo
Kiểm tra này không chạy ứng dụng, không phát hiện mọi lỗi cú pháp và không thay thế formatter hoặc linter của ngôn ngữ. Mã thoát khác 0 cũng có thể đến từ ref không tồn tại hoặc lỗi sử dụng; hãy đọc thông báo, không diễn giải mọi lỗi thành whitespace.
Trong quy trình commit, chọn đúng file, kiểm tra cached rồi xem lại diff nội dung là một vòng ngắn dễ duy trì. Lợi ích chính là thấy đúng bản sắp commit, thay vì chỉ thấy editor hiện đã sạch.


