Git theo dõi nội dung tệp, không theo dõi tên tệp. Vì vậy, việc đổi tên tệp mà không thay đổi nội dung của nó rất dễ dàng để git phát hiện. (Git không theo dõi, nhưng thực hiện phát hiện ; sử dụng git mv
hoặc git rm
và git add
hiệu quả là như nhau.)
Khi một tệp được thêm vào kho lưu trữ, tên tệp sẽ nằm trong đối tượng cây. Nội dung tệp thực tế được thêm vào dưới dạng một đối tượng lớn nhị phân ( blob ) trong kho lưu trữ. Git sẽ không thêm một blob khác cho các tệp bổ sung có cùng nội dung. Trên thực tế, Git không thể vì nội dung được lưu trữ trong hệ thống tệp với hai ký tự đầu tiên của băm là tên thư mục và phần còn lại là tên tệp bên trong nó. Vì vậy, để phát hiện đổi tên là một vấn đề so sánh các băm.
Để phát hiện những thay đổi nhỏ đối với tệp đã đổi tên, Git sử dụng một số thuật toán nhất định và giới hạn ngưỡng để xem đây có phải là đổi tên hay không. Ví dụ, hãy xem -M
lá cờ cho git diff
. Ngoài ra còn có các giá trị cấu hình như merge.renameLimit
(số lượng tệp cần xem xét khi thực hiện phát hiện đổi tên trong quá trình hợp nhất).
Để hiểu cách git xử lý các tệp tương tự (tức là những biến đổi tệp nào được coi là đổi tên), hãy khám phá các tùy chọn cấu hình và cờ có sẵn, như đã đề cập ở trên. Bạn không cần phải xem xét với cách làm. Để hiểu cách git thực sự hoàn thành các nhiệm vụ này, hãy xem các thuật toán để tìm sự khác biệt trong văn bản và đọc mã nguồn git.
Các thuật toán chỉ được áp dụng cho các mục đích khác biệt, hợp nhất và ghi nhật ký - chúng không ảnh hưởng đến cách git lưu trữ chúng. Bất kỳ thay đổi nhỏ nào trong nội dung tệp có nghĩa là một đối tượng mới được thêm vào cho nó. Không có delta hoặc khác biệt xảy ra ở cấp độ đó. Tất nhiên, sau này, các đối tượng có thể được đóng gói trong đó các delta được lưu trữ trong các gói dữ liệu, nhưng điều đó không liên quan đến việc phát hiện đổi tên.