Jawaban:
Anda perlu menggunakan -M untuk membiarkan git mendeteksi secara otomatis file yang dipindahkan saat melakukan diffing. Menggunakan sama git diff
seperti knittl yang disebutkan tidak bekerja untuk saya.
Jadi sederhananya: git diff -M
harus melakukannya.
Dokumentasi untuk sakelar ini adalah:
-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
?
git diff
. Berjalan git diff -M
pada satu file (diganti nama) tidak melaporkan penggantian nama.
git log --follow -- file_after_move.txt
bekerja dengan baik. Ini menunjukkan seluruh sejarah, termasuk sebelum pindah. Ada ide? Saya sedang berlari git version 2.11.0.windows.1
.
-C
pilihan untuk mendeteksi salinan berguna dan serupa. Saya menggunakannya dengan -M
untuk melihat diff di mana saya telah refactored satu file menjadi dua (tanpa nama yang cocok dengan aslinya).
Selain apa yang ditulis knittl , Anda selalu dapat menggunakan:
git diff HEAD:./oldfilename newfilename
di mana HEAD:./oldfilename
berarti oldfilename di commit terakhir (di HEAD), relatif terhadap direktori saat ini.
Jika Anda tidak memiliki git yang cukup baru, Anda harus menggunakannya:
git diff HEAD:path/to/oldfilename newfilename
git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
git diff branch:old/filen.name newfilename
cd
ke direktori dan tidak menambahkan --
sebelum commit:path
pasangan. Git tampaknya sangat pemilih dengan sintaksis di sini.
<commit-ish>:<pathname>
Sintaks adalah pengidentifikasi objek, sesuatu Git-ish; setelah --
Git hanya mengharapkan nama file.
Dengan git 2.9 (Juni 2016), Anda tidak perlu menambahkan -M
lagi. git diff
gunakan -M
secara default.
Lihat komit 5404c11 , komit 9501d19 , komit a9276a6 , komit f07fc9e , komit 62df1e6 (25 Feb 2016) oleh Matthieu Moy ( moy
) .
(Digabung oleh Junio C Hamano - gitster
- dalam komit 5d2a30d , 03 Apr 2016)
diff
: aktifkandiff.renames
secara defaultGanti nama deteksi adalah fitur yang sangat nyaman, dan pengguna baru tidak harus menggali dokumentasi untuk mendapat manfaat darinya.
Keberatan potensial untuk mengaktifkan deteksi ganti nama adalah bahwa kadang-kadang gagal, dan kadang-kadang lambat. Tetapi mengubah nama deteksi sudah diaktifkan secara default dalam beberapa kasus seperti "
git status
" dan "git merge
", jadi mengaktifkannyadiff.renames
tidak secara mendasar mengubah situasi. Saat deteksi ganti nama gagal, sekarang gagal secara konsisten antara "git diff
" dan "git status
".Pengaturan ini tidak memengaruhi perintah pipa ledeng, karenanya skrip yang ditulis dengan baik tidak akan terpengaruh.
git diff -M
mengaktifkan rename detection seperti yang dikatakan orang lain (dan seperti yang ditunjukkan @VonC, ini diaktifkan secara default dari git 2.9). Tetapi jika Anda memiliki perubahan besar, deteksi nama yang tidak tepat masih dapat dimatikan lagi. Git akan menampilkan peringatan seperti berikut, yang mudah terlewatkan di tengah-tengah perbedaan yang Anda lihat:
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.
Dalam hal ini, setel opsi konfigurasi seperti yang disarankan oleh git, misalnya
git config diff.renamelimit 450
dan jalankan kembali perintah diff Anda.
Untuk alasan apa pun menggunakan HEAD:./oldfilename
(atau jalur absolut) tidak berfungsi untuk saya, tetapi HEAD:oldfilename
berhasil (terima kasih cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH
HEAD:./oldfilename
?
jalankan git diff
tanpa argumen, atau git diff -- newfilename
. git cukup pintar untuk membandingkan file / konten yang tepat (yaitu konten asli sebelum mengganti nama dengan konten yang diubah setelah mengganti nama)
git mv
dengan memasukkan satu file dan kemudian membandingkan status yang dipentaskan dengan cabang lain yang identik akan menghasilkan perbedaan "semuanya telah dihapus dan diciptakan kembali" kecuali jika -M
digunakan.
git diff -- yourRenamedFile
akan cukup. Lihat jawaban saya di bawah ini