Câu trả lời:
Bạn cần sử dụng -M để cho phép git tự động phát hiện tệp đã di chuyển khi khác. Sử dụng git diff
như knittl đã đề cập không làm việc cho tôi.
Vì vậy, đơn giản: git diff -M
nên làm điều đó.
Tài liệu cho việc chuyển đổi này là:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
~/.gitconfig
không?
git diff
. Chạy git diff -M
trên một tệp (đã đổi tên) không báo cáo đổi tên.
git log --follow -- file_after_move.txt
hoạt động tốt. Nó cho thấy toàn bộ lịch sử, bao gồm cả trước khi di chuyển. Có ý kiến gì không? Tôi đang chạy git version 2.11.0.windows.1
.
-C
tùy chọn cho việc phát hiện bản rất hữu ích và tương tự. Tôi đã sử dụng nó -M
để xem xét một khác biệt nơi tôi đã tái cấu trúc một tệp thành hai (không có tên nào khớp với bản gốc).
Ngoài những gì knittl đã viết , bạn luôn có thể sử dụng:
git diff HEAD:./oldfilename newfilename
trong đó HEAD:./oldfilename
có nghĩa là oldfilename trong lần xác nhận cuối cùng (trong HEAD), liên quan đến thư mục hiện tại.
Nếu bạn không có đủ git mới, bạn sẽ phải sử dụng thay thế:
git diff HEAD:path/to/oldfilename newfilename
git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
git diff branch:old/filen.name newfilename
cd
vào thư mục và không thêm --
trước commit:path
cặp. Git dường như rất kén chọn với cú pháp ở đây.
<commit-ish>:<pathname>
Cú pháp là một định danh đối tượng, một cái gì đó Git-ish; sau khi --
Git chỉ mong đợi tên tập tin.
Với git 2.9 (tháng 6 năm 2016), bạn sẽ không phải thêm -M
nữa. git diff
sử dụng -M
theo mặc định.
Xem cam kết 5404c11 , cam kết 9501d19 , cam kết a9276a6 , cam kết f07fc9e , cam kết 62df1e6 (25 tháng 2 năm 2016) của Matthieu Moy ( moy
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 5d2a30d , ngày 03 tháng 4 năm 2016)
diff
: kích hoạtdiff.renames
theo mặc địnhĐổi tên phát hiện là một tính năng rất thuận tiện và người dùng mới không cần phải tìm hiểu tài liệu để hưởng lợi từ nó.
Sự phản đối tiềm năng để kích hoạt phát hiện đổi tên là đôi khi nó thất bại, và đôi khi nó chậm. Nhưng phát hiện đổi tên đã được kích hoạt theo mặc định trong một số trường hợp như "
git status
" và "git merge
", vì vậy kích hoạtdiff.renames
không làm thay đổi căn bản tình hình. Khi phát hiện đổi tên không thành công, giờ đây nó không thành công giữa "git diff
" và "git status
".Cài đặt này không ảnh hưởng đến các lệnh hệ thống ống nước, do đó các tập lệnh được viết tốt sẽ không bị ảnh hưởng.
git diff -M
kích hoạt phát hiện đổi tên như những người khác đã nói (và như @VonC đã chỉ ra, nó được kích hoạt theo mặc định từ git 2.9). Nhưng nếu bạn có một bộ thay đổi lớn, phát hiện đổi tên không chính xác vẫn có thể bị tắt một lần nữa. Git sẽ hiển thị một cảnh báo như sau, rất dễ bỏ lỡ giữa các khác biệt bạn đang xem:
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
Trong trường hợp đó, hãy đặt tùy chọn cấu hình theo đề xuất của git, ví dụ:
git config diff.renamelimit 450
và chạy lại lệnh diff của bạn.
Vì bất kỳ lý do gì, việc sử dụng HEAD:./oldfilename
(hoặc đường dẫn tuyệt đối) không hiệu quả với tôi, nhưng HEAD:oldfilename
đã làm (cảm ơn cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH
HEAD:./oldfilename
?
chỉ đơn giản là chạy git diff
mà không có bất kỳ đối số, hoặc git diff -- newfilename
. git đủ thông minh để so sánh các tệp / nội dung phù hợp (nghĩa là nội dung gốc trước khi đổi tên với nội dung bị thay đổi sau khi đổi tên)
git mv
một tệp duy nhất và sau đó so sánh trạng thái theo giai đoạn với một nhánh khác giống hệt nhau sẽ tạo ra "mọi thứ đã bị xóa và được tạo lại" khác trừ khi -M
được sử dụng.
git diff -- yourRenamedFile
sẽ là đủ. Xem câu trả lời của tôi dưới đây