Hãy nhớ rằng trong lịch sử của Git, đổi tên tệp là không được lưu dưới dạng "tên này đã được đổi tên từ X thành Y". Thay vào đó, tệp X tồn tại trong một bản sửa đổi và trong bản sửa đổi tiếp theo Y tồn tại (và X không). Ví dụ:
Revision | Files
---------+----------------------------------
HEAD^ | a.cpp x.cpp z.cpp
HEAD | a.cpp y.cpp z.cpp
Trong biểu đồ trên, mỗi sửa đổi là một hàng và mỗi tệp chứa ba tệp. Giữa hai phiên bản, x.cpp
đã được đổi tên thành y.cpp
. Thông tin duy nhất mà kho lưu trữ là nội dung của mỗi phiên bản riêng biệt.
Khi Git (hoặc công cụ khác đọc kho lưu trữ Git) xem lịch sử ở trên, nó nhận thấy rằng y.cpp
là tệp mới trong HEAD
. Sau đó, nó xem xét trước đó sửa đổi để xem liệu một tệp tương tự đã tồn tại hay chưa. Trong trường hợp đổi tên tập tin thẳng, sau đó có, một tập tin gọi là x.cpp
với nội dung giống hệt nhau tồn tại trong bản sửa đổi trước đó (và không còn tồn tại trong bản sửa đổi hiện tại). Vì vậy, tệp mới được hiển thị dưới dạng tên đổi từ x.cpp
thành y.cpp
.
Trong trường hợp đổi tên và sửa đổi, Git sẽ xem xét các tệp của bản sửa đổi trước đó để xem một tệp có gần tệp mới (về nội dung của tệp) hay không. Nếu hầu hết các dòng đều giống nhau, thì Git sẽ hiển thị nó như một sự đổi tên, nhưng nếu có đủ dòng thay đổi so với các dòng không đổi, thì Git sẽ đơn giản nói nó giống như một tập tin mới.
Để trả lời câu hỏi của bạn, cách tốt nhất để xử lý các đổi tên lớp resharper là chỉ cần thực hiện và cam kết các tệp mới. Git lưu trữ các tệp cũ và mới trong kho lưu trữ của nó. Đổi tên phát hiện được xử lý sau đó, tại thời điểm bạn thực sự hỏi về lịch sử. Đây là lý do tại sao các lệnh như git log
có các tùy chọn như --find-copies
và --find-copies-harder
.
Nguồn
2011-06-30 04:34:08
Git không theo dõi đổi tên một cách rõ ràng. Nó được suy ra một cách nhanh chóng, do đó, không có cách nào để làm cho Git đối xử với một cái gì đó như đổi tên nếu nó không thể phát hiện ra nó. – hammar