Saya punya file a.txt
.
cat a.txt
> hello
Isi dari a.txt
is "hello".
Saya membuat komitmen.
git add a.txt
git commit -m "first commit"
Saya kemudian pindah a.txt
ke test
dir.
mkdir test
mv a.txt test
Saya kemudian membuat komitmen kedua saya.
git add -A
git commit -m "second commit"
Akhirnya, saya mengedit a.txt
untuk mengucapkan "selamat tinggal" sebagai gantinya.
cat a.txt
> goodbye
Saya membuat komitmen terakhir saya.
git add a.txt
git commit -m "final commit"
Sekarang inilah pertanyaan saya:
Bagaimana cara saya membedakan konten a.txt
antara komit terakhir dan komit pertama saya?
Saya sudah mencoba:,
git diff HEAD^^..HEAD -M a.txt
tetapi tidak berhasil. git log --follow a.txt
mendeteksi penggantian nama dengan benar, tetapi saya tidak dapat menemukan padanan untuk git diff
. Apakah ada?
Jawaban:
Masalah dengan perbedaan antara
HEAD^^
danHEAD
apakah Anda memiliki filea.txt
di kedua komit, jadi hanya dengan mempertimbangkan dua komit tersebut (yang dilakukan diff), tidak ada penggantian nama, ada salinan dan perubahan.Untuk mendeteksi salinan, Anda dapat menggunakan
-C
:Hasil:
Kebetulan, jika Anda membatasi diff hanya pada satu jalur (seperti yang Anda lakukan di
git diff HEAD^^ HEAD a.txt
Anda tidak akan pernah melihat penggantian nama atau salinan karena Anda telah mengecualikan semuanya selain dari satu jalur dan mengganti nama atau salinan - menurut definisi - melibatkan dua jalur.sumber
-- <old-path> <new-path>
... lihat jawaban saya.git show -C [commit]
dan itu mengenali file yang diganti namanya dan menunjukkan kepada saya perbedaan antar file. Sempurna.Untuk membedakan mengubah nama file tertentu, gunakan
-M -- <old-path> <new-path>
(-C
juga berfungsi).Jadi jika Anda berdua mengganti nama dan mengubah file di komit terakhir, Anda dapat melihat perubahannya dengan:
Ini menghasilkan:
(
// a.txt
baris ditambahkan untuk membantu git mendeteksi penggantian nama)Jika git tidak mendeteksi penggantian nama, Anda dapat menentukan ambang kesamaan rendah dengan
-M[=n]
, katakanlah 1%:Dari dokumen git diff :
sumber
git diff HEAD^^ HEAD -M -- a.txt test/a.txt
Anda juga bisa melakukan:
git diff rev1:file1 rev2:file2
yang, untuk contoh Anda, adalah
git diff HEAD^^:./a.txt HEAD:./test/a.txt
Perhatikan eksplisitnya
./
- format ini jika tidak mengasumsikan jalur menjadi relatif terhadap root repo. (Jika Anda berada di root repo, tentu saja Anda dapat mengabaikannya.)Ini sama sekali tidak bergantung pada deteksi penggantian nama, karena pengguna secara eksplisit menyatakan apa yang harus dibandingkan. (Oleh karena itu, ini juga berguna dalam beberapa keadaan lain, seperti membandingkan file antara cabang svn yang berbeda di lingkungan git-svn.)
sumber
Jika pengubahan nama Anda dilakukan bertahap tetapi belum dilakukan, Anda dapat menggunakan:
sumber