Melihat File yang Dihapus di Git

105

Saya telah menghapus file dengan Git dan kemudian berkomitmen, jadi file tersebut tidak lagi ada dalam copy pekerjaan saya. Saya ingin melihat konten file itu, tetapi tidak benar-benar memulihkannya. Bagaimana saya bisa melakukan ini?

Colin Ramsay
sumber

Jawaban:

145
git show HEAD^:path/to/file

Anda dapat menggunakan pengenal komit eksplisit atau HEAD~nuntuk melihat versi lama atau jika sudah ada lebih dari satu komit sejak Anda menghapusnya.

CB Bailey
sumber
6
Perhatikan bahwa path/to/filejalur lengkap dari atas proyek (direktori atas repositori).
Jakub Narębski
1
Saya punya fatal: Invalid object name 'HEAD^'.(saya harus menyebutkan, bahwa saya hanya memiliki "
Komitmen
1
Jika penghapusan dilakukan secara bertahap tetapi tidak dilakukan, gunakan HEAD sebagai ganti HEAD ^ (karena ada di HEAD). Misalnya, saya pikir saya membutuhkan file, jadi saya menambahkannya dan berkomitmen untuk menyimpan pekerjaan saya, kemudian menghapusnya ketika saya menemukan solusi yang berbeda. Untuk melihat file asli sebelum melakukan lagi, saya melakukan git show HEAD: path / to / file
Tony Wickham
1
Saya rasa perlu juga disebutkan bahwa ini hanya berfungsi jika file telah dihapus di commit terbaru. Jika file dihapus beberapa komit yang lalu, Anda perlu menggunakan salah satu jawaban lainnya.
jayhendren
50

Jika ini adalah file yang telah Anda hapus beberapa waktu lalu dan tidak ingin mencari revisi , Anda dapat menggunakan (nama file foodalam contoh ini; Anda dapat menggunakan jalur lengkap):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

The rev-listDoa terlihat untuk semua revisi footetapi hanya daftar satu. Karena rev-listdaftar dalam urutan kronologis terbalik, maka yang didaftar adalah revisi terakhir yang berubah foo, yang akan menjadi komit yang dihapus foo. (Ini didasarkan pada asumsi bahwa git tidak mengizinkan file yang dihapus diubah dan tetap terhapus.) Anda tidak bisa begitu saja menggunakan revisi yang rev-listkembali apa adanya karena sudah footidak ada lagi. Anda harus meminta yang tepat sebelum itu yang berisi revisi terakhir dari file tersebut, maka ^in git show.

Louis
sumber
2
Anda mungkin perlu mengubah foo terakhir menjadi ./foo. Dan bagi mereka yang tidak menggunakan bash, dapatkan id dengan "git rev-list --max-count = 1 --all - foo" lalu lakukan "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" dengan id (524 .. is id)
Dror
1
Jawaban bagus. Saya harus menggunakan ~ bukan ^. Tidak yakin kenapa. Dan supaya orang mengerti, 'foo' di sini harus merupakan jalur lengkap dari git root.
pedorro
Anda dapat menulis **/foojika Anda tidak mengetahui jalurnya (ini akan bekerja untuk perintah rev-list tetapi bukan perintah show. Namun dengan komit dari perintah rev-list Anda kemudian dapat menemukan jalurnya).
Nickolai
10

Karena Anda mungkin tidak mengingat jalur yang tepat, Anda bisa mendapatkan sha1 dari git log, lalu Anda dapat menerbitkannya

 git cat-file -p <sha1>
pdeschen.dll
sumber
5
Atas nama Samuel Slund : Salah satu cara untuk menemukan jumlah sha1 yang akan digunakan di atas adalah: git whatchanged --no-abbrevyang memberikan keluaran yang mirip dengan git (atau svn) log.
Kebisingan tanpa seni