Saya memiliki repositori Git dengan n commit.
Saya punya file yang saya butuhkan, dan dulu di repositori, dan tiba-tiba saya mencari dan berpikir, "Oh! Kemana perginya file itu?"
Apakah ada (seri) perintah Git yang akan memberi tahu saya bahwa "file really_needed.txt telah dihapus di commit n-13"?
Dengan kata lain, tanpa melihat komit setiap individu, dan mengetahui bahwa repo Git saya memiliki setiap perubahan setiap file, dapatkah saya dengan cepat menemukan komit terakhir yang MEMILIKI file itu, sehingga saya bisa mendapatkannya kembali?
Jawaban:
git log --full-history -- [file path]
menunjukkan perubahan file, bekerja bahkan jika file itu dihapus.Contoh:
Jika Anda ingin melihat hanya komit terakhir, yang menghapus file gunakan -1 sebagai tambahan, misalnya,
git log --full-history -1 -- [file path]
Lihat Komit mana yang menghapus file
sumber
git log -- */<<filename>>.<<file extension>>
tidak mengetahui seluruh jalur file.Jawaban singkat:
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: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:Perhatikan bagaimana
git log -- bar
pembuangan terminal di atas menghasilkan benar-benar tidak ada output; Git "menyederhanakan" sejarah menjadi sebuah fiksi di manabar
tidak pernah ada.git log --full-history -- bar
, di sisi lain, memberi kita komit yang dibuatbar
dan komit yang menghapusnya.Agar lebih jelas: masalah ini bukan hanya teoretis. Saya hanya melihat ke dokumen dan menemukan
--full-history
bendera karenagit 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.sumber
git log
output itu sendiri, sama sekali tidak jelas bahwa komit terakhir telah menghapus file. Saya juga mencobagit log --name-status --full-history -- file_name
dangit log -p --stat --full-history -- file_name
, tetapi keduanya tidak secara eksplisit menunjukkan bahwa file itu dihapus di komit terbaru. Ini seperti bug.mkdir somedir && cd somedir && git init && touch foo && git add foo && git commit -m "Added foo" && git checkout -b newbranch && touch bar && git add bar && git commit -m "Added bar" && git checkout master && git rm foo && git commit -m "Deleted foo" && git checkout newbranch && git rm bar && git commit -m "Deleted bar" && git checkout master && git merge newbranch && git log --name-status --full-history -- bar
termasukD bar
danA bar
bagi saya dalam keluaran log dengan Git 2.12.2. Apakah Anda tidak melihat garis-garis di output? Versi apa yang kau miliki?git version 2.15.1
Ya, urutan perintah Anda melaporkanD bar
danA bar
. Mungkin masalah saya khusus untuk riwayat file saya. Saya sedang menelusuri sejarah.htaccess
file yang gitignor dan dihapus. Saya akhirnya menemukan itu dan menambahkan file kembali. Ketika saya memasukkan--name-status
dalamgit log
perintah, saya melihat duaA .htaccess
entri (karena saya menambahkannya kembali di komit terbaru) tetapi tidakD .htaccess
. Jadi sepertinya dalam beberapa kasus, meskipun file telah dihapus dari repositori,git log
tidak akan menampilkanD file_name
entri eksplisit ..htaccess
ditambahkan dalam komit X tapi kemudian tidak termasuk dalam komit gabungan yang membawa X ke master? Itulah satu-satunya hal yang dapat saya pikirkan bahwa saya mungkin bisa berdebat seharusnya terlihat seperti file yang telah ditambahkan dan tidak pernah dihapus tetapi masih tidak ada. Akan menarik untuk mencoba dan mencari MCVE, lalu mencari tahu apakah itu bug Git, dan jika tidak, apakah mungkin untuk mengubah jawaban saya untuk menangani kasus Anda.Git log tetapi Anda harus awalan path dengan
--
Misalnya:
sumber
Saya baru saja menambahkan solusi di sini (adakah cara di git untuk membuat daftar semua file yang dihapus di repositori?) Untuk menemukan commit dari file yang dihapus dengan menggunakan regexp:
Ini mengembalikan semua yang dihapus dalam direktori bernama
some_dir
(cascading). Sed sed regexp ada di mana\/some_dir\/
akan dilakukan.OSX (terima kasih kepada @triplee dan @keif)
sumber
sed: 1: "/^commit/h;/\/some_dir\ ...": bad flag in substitute command: '}'
sed
tampaknya tidak selalu baik dengan titik koma sebagai pemisah perintah. Coba ubah menjadi baris baru, atau alihkan kesed -n -e '/^commit/h' -e '\:/some_dir/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
bekerja untuk saya di OSX.Anda dapat menemukan komit terakhir yang menghapus file sebagai berikut:
Informasi lebih lanjut tersedia di sini
sumber
Mencoba:
sumber