Hướng dẫn · 17/10/2026

Git diff --no-index: So sánh file ngoài repository

Bạn nhận hai bản cấu hình hoặc hai thư mục mã nguồn được giải nén từ ZIP và muốn biết chúng khác nhau ở đâu. Không nhất thiết phải tạo repository rồi commit từng bản. Git diff --no-index cho phép đối chiếu trực tiếp hai đường dẫn trên đĩa, phù hợp với bước kiểm tra trước khi thay thế file hoặc bàn giao.

Git diff --no-index: So sánh file ngoài repository

Bạn nhận hai bản cấu hình hoặc hai thư mục mã nguồn được giải nén từ ZIP và muốn biết chúng khác nhau ở đâu. Không nhất thiết phải tạo repository rồi commit từng bản. Git diff --no-index cho phép đối chiếu trực tiếp hai đường dẫn trên đĩa, phù hợp với bước kiểm tra trước khi thay thế file hoặc bàn giao.

1. Chọn hai đầu vào rõ ràng

Đặt bản làm mốc ở bên trái, bản cần kiểm tra ở bên phải. Ví dụ hai file JSON thử nghiệm đều không chứa secret:

git --no-pager diff --no-index --no-ext-diff --no-textconv -- before.json after.json

Theo tài liệu git diff, dạng no-index so sánh hai đường dẫn, kể cả ngoài repository. Các tùy chọn trên tắt helper diff bên ngoài và text conversion; -- phân cách tùy chọn với đường dẫn. File có khoảng trắng cần đặt trong dấu ngoặc kép.

Lệnh chỉ phục vụ đối chiếu, không thay nội dung hai file. Tuy vậy, hãy dùng bản sao ổn định: nếu ứng dụng đang ghi file trong lúc kiểm tra, kết quả có thể không phản ánh một thời điểm nhất quán.

2. Đọc thay đổi theo đúng chiều

Với bản trước chứa {"timeout":10} và bản sau chứa {"timeout":30}, phần nội dung thay đổi sẽ có dạng:

-{"timeout":10}
+{"timeout":30}

Dòng dấu trừ thuộc đầu vào bên trái; dòng dấu cộng thuộc đầu vào bên phải. Đảo thứ tự file sẽ đảo cách trình bày thêm và bớt. Vì vậy, hồ sơ review cần ghi rõ bản nào là baseline, thay vì chỉ đính kèm một ảnh chụp diff.

Đây là so sánh văn bản, không phải phân tích ý nghĩa JSON. Đổi thứ tự key hoặc cách xuống dòng có thể tạo diff lớn dù ý nghĩa tương tự. Nếu cần chuẩn hóa, tạo bản dẫn xuất riêng để đối chiếu và giữ nguyên file gốc làm bằng chứng.

3. Khác nhau không đồng nghĩa lệnh bị lỗi

Khi phép so sánh thực hiện thành công, no-index trả 0 nếu không có khác biệt và 1 nếu có khác biệt. Tuy nhiên, một số lỗi đầu vào cũng có thể trả 1. Ví dụ PowerShell dưới đây kiểm tra file trước, nhưng vẫn cần đọc thông báo lỗi của Git:

if (!(Test-Path -LiteralPath before.json -PathType Leaf) -or
    !(Test-Path -LiteralPath after.json -PathType Leaf)) {
    throw "Both input files must exist"
}
git --no-pager diff --no-index --no-ext-diff --no-textconv -- before.json after.json
$comparisonExit = $LASTEXITCODE
if ($comparisonExit -eq 0) {
    Write-Output "No differences reported"
} elseif ($comparisonExit -eq 1) {
    Write-Output "Exit 1: inspect diff and stderr before classifying"
} else {
    throw "Comparison failed: exit $comparisonExit"
}

Không bỏ qua stderr hoặc mặc định mọi mã 1 là diff hợp lệ. Kiểm tra tồn tại không bảo đảm quyền đọc hay file không thay đổi sau đó. Pipeline cần lưu chẩn đoán và dừng để kiểm tra khi không phân loại chắc chắn. Đừng dùng việc có diff làm lý do tự động chép đè bản đang chạy: reviewer vẫn phải quyết định thay đổi nào đúng.

4. Đối chiếu thư mục theo hai lượt

git --no-pager diff --no-index --no-ext-diff --no-textconv --stat -- before/ after/
git --no-pager diff --no-index --no-ext-diff --no-textconv -- before/config.json after/config.json

Lượt đầu xem phạm vi, lượt sau đọc file cần quan tâm. Chuẩn bị hai thư mục chỉ chứa dữ liệu được phép kiểm tra; không trỏ bừa vào toàn bộ ổ đĩa, thư mục cá nhân hoặc cây dữ liệu production. Đừng dựa vào .gitignore như một hàng rào bảo vệ secret trong phép so sánh đường dẫn này.

Với gói bàn giao lớn, loại cache và dependency khỏi bản sao dùng để review theo quy tắc được ghi lại. Không xóa chúng khỏi nguồn gốc chỉ để làm báo cáo ngắn hơn.

5. Giữ phép so sánh trung thực

Không bật bỏ qua whitespace ngay từ đầu. Khoảng trắng có thể mang ý nghĩa trong mã nguồn hoặc định dạng cấu hình. Khi cần giảm nhiễu, ghi rõ tùy chọn đã dùng và giữ một kết quả không lọc để kiểm tra lại.

Binary khác nhau có thể chỉ được báo là khác mà không có diff dòng hữu ích. Một báo cáo diff cũng không thay thế kiểm thử ứng dụng hoặc kiểm kê toàn bộ quyền file, ACL và metadata hệ điều hành. Chọn công cụ bổ sung theo điều kiện bàn giao thực tế.

6. Checklist trước khi chia sẻ kết quả

  • Ghi nguồn gốc và thứ tự hai đầu vào.
  • Dùng snapshot ổn định, không trộn dữ liệu đang thay đổi.
  • Phân biệt không khác, có khác và lỗi thực thi.
  • Rà soát secret trong cả dòng xóa, dòng thêm và dòng ngữ cảnh.
  • Không đưa báo cáo chứa dữ liệu nhạy cảm lên log CI hoặc ticket công khai.
  • Kiểm thử thay đổi đã duyệt trước khi thay file thật.

Git diff --no-index là một bước review gọn cho dữ liệu ngoài lịch sử Git. Hiệu quả của nó đến từ việc chọn đúng đầu vào và diễn giải đúng kết quả, không phải từ việc tạo ra càng nhiều dòng diff càng tốt.

Thảo luận

Bình luận 0

Đăng nhập để bình luận

Bạn cần có tài khoản để tham gia thảo luận và trả lời độc giả khác.

Đăng nhậpĐăng ký

Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.