Mengapa "git log -‌- foo" tidak berfungsi untuk file foo yang dihapus?

89

Repositori saya mengalami perubahan seperti:

  1. ... beberapa komitmen yang tidak terkait ...
  2. Komit file baru foodengan 100 baris konten
  3. ... melakukan intervensi, beberapa di antaranya menyentuh foo...
  4. Sisipkan konten foodi bagian atas file yang ada bardan git rm foodi komit yang sama
  5. ... lebih banyak komitmen yang tidak terkait ...

Sekarang saya ingin melihat log dari file yang dihapus foo. Semua yang saya baca, termasuk di SO, mengatakan saya harus bisa git log -- foo, tetapi perintah itu tidak menghasilkan keluaran.

Jika saya menemukan komit yang menyertakan penghapusan, foosaya bisa git log 1234abcd -- foodan melihat lognya, jadi menurut saya jalur ke foobukan masalah. Juga perhatikan bahwa git merge-base HEAD 1234abcdkeluaran 1234abcd[...], jadi saya pikir itu harus membuktikan bahwa komit dapat dijangkau dari HEAD. Perhatikan bahwa tidak ada file foodi pohon kerja saya (jelas, sejak dihapus). Menggunakan Git 1.7.1.1 di OS X.

Mengapa tidak git log -- fooberhasil untuk saya dan bagaimana cara memperbaikinya? Terima kasih!

pengguna385804
sumber
5
Apakah Anda mencoba git log --follow -- fooatau git log --follow -M -- foo? (untuk memaksa deteksi penggantian nama)
VonC
1
Sial, saya memang mencoba --follow--tapi membaca historysaya lihat saya sudah melakukannya di tempat lain ketika saya mencobanya, membuat jalurnya tidak valid. git log --follow -- fooberhasil ketika saya mencoba dari titik awal yang benar. Saya kira Git dianggap bergulir fooke dalam barsebagai semacam mengubah nama? Bagaimanapun, terima kasih! Saya akan dengan senang hati memberi kredit ini jika Anda akan memposting ulang sebagai jawaban.
pengguna385804
1
Mengganggu yang --diubah menjadi dalam judul pertanyaan ...
Cascabel

Jawaban:

118

Anda ingin menggunakan --followopsi on git log, yang dijelaskan di halaman manual sebagai:

Continue listing the history of a file beyond renames.

Secara efektif, ini tidak hanya memungkinkan Anda melihat riwayat file yang diubah namanya, tetapi ini juga memungkinkan Anda untuk melihat riwayat file tidak lagi di pohon kerja. Jadi, perintah yang harus Anda gunakan akan terlihat seperti ini:

git log --follow -- foo

Memperbarui:

Git 2.9+ sekarang telah mengaktifkan ini secara default untuk semua git diffdan git logperintah:

Perintah level Porcelain yang dihadapi pengguna akhir dalam kelompok "git diff" dan "git log" secara default mengaktifkan deteksi penggantian nama; Anda masih dapat menggunakan variabel konfigurasi "diff.renames" untuk menonaktifkannya.

Terima kasih untuk x-yuri atas perhatiannya!

Nathan Kleyn
sumber
1
Ini berhasil untuk saya tanpa --followbagian. Saya hanya perlu menambahkan --. Saya sedang berlari git-2.9.0.
x-yuri