Jawaban singkat:
git log --full-history -- your_file
akan menunjukkan semua komit dalam riwayat repo Anda, termasuk gabungan komit, yang tersentuh your_file
. Yang terakhir (atas) adalah yang menghapus file.
Beberapa penjelasan:
The --full-history
bendera di sini adalah penting. Tanpa itu, Git melakukan "penyederhanaan riwayat" ketika Anda meminta log file. Dokumen ringan tentang detail cara kerjanya dan saya tidak memiliki grit dan keberanian yang diperlukan untuk mencoba mencari tahu dari kode sumber, tetapi dokumen git-log memiliki banyak hal untuk dikatakan:
Mode standar
Sederhanakan sejarah ke sejarah paling sederhana yang menjelaskan kondisi akhir pohon. Paling sederhana karena memangkas beberapa cabang samping jika hasil akhirnya sama (yaitu menggabungkan cabang dengan konten yang sama)
Ini jelas memprihatinkan ketika file yang riwayatnya kita inginkan dihapus , karena riwayat paling sederhana yang menjelaskan status akhir dari file yang dihapus bukanlah riwayat . Apakah ada risiko bahwa git log
tanpa --full-history
akan dengan mudah mengklaim bahwa file itu tidak pernah dibuat? Sayangnya ya. Ini sebuah demonstrasi:
mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo"
[master (root-commit) ddff7a7] Added foo
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"
[newbranch 7f9299a] Added bar
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"
rm 'bar'
[newbranch 873ed35] Deleted bar
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log -- foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log -- bar
mark@lunchbox:~/example$ git log --full-history -- foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery
Date: Tue Jan 12 22:51:36 2016 +0000
Merge branch 'newbranch'
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log --full-history -- bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery
Date: Tue Jan 12 22:51:29 2016 +0000
Deleted bar
commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery
Date: Tue Jan 12 22:50:38 2016 +0000
Added bar
Perhatikan bagaimana git log -- bar
pembuangan terminal di atas menghasilkan benar-benar tidak ada output; Git "menyederhanakan" sejarah menjadi sebuah fiksi di mana bar
tidak pernah ada. git log --full-history -- bar
, di sisi lain, memberi kita komit yang dibuat bar
dan komit yang menghapusnya.
Agar lebih jelas: masalah ini bukan hanya teoretis. Saya hanya melihat ke dokumen dan menemukan --full-history
bendera karena git log -- some_file
gagal bagi saya di repositori nyata di mana saya mencoba untuk melacak file yang dihapus. Penyederhanaan riwayat kadang-kadang bisa membantu ketika Anda mencoba memahami bagaimana file yang saat ini ada dalam keadaan saat ini, tetapi ketika mencoba melacak penghapusan file, itu lebih cenderung untuk mengacaukan Anda dengan menyembunyikan komit yang Anda pedulikan. . Selalu gunakan --full-history
bendera untuk use case ini.