Pertanyaan Git: Bagaimana menemukan file yang dihapus dalam sejarah komit proyek?


Dahulu kala, ada file dalam proyek saya yang sekarang ingin saya dapat dapatkan.

Masalahnya adalah: Saya tidak tahu kapan saya menghapusnya dan di jalur mana itu.

Bagaimana saya bisa menemukan commit file ini ketika ada?


856
2017-08-26 10:43


asal


Jawaban:


Jika Anda tidak tahu jalur yang tepat yang dapat Anda gunakan

git log --all --full-history -- **/thefile.*

Jika Anda tahu path file itu, Anda dapat melakukan ini:

git log --all --full-history -- <path-to-file>

Ini harus menunjukkan daftar commit di semua cabang yang menyentuh file itu. Kemudian, Anda dapat menemukan versi file yang Anda inginkan, dan menampilkannya dengan ...

git show <SHA> -- <path-to-file>

Atau pulihkan ke copy pekerjaan Anda dengan:

git checkout <SHA>^ -- <path-to-file>

Perhatikan simbol tanda sisipan (^), yang mendapat pembayaran sebelumnya untuk yang diidentifikasi, karena pada saat <SHA> commit file dihapus, kita perlu melihat commit sebelumnya untuk mendapatkan isi file yang dihapus


1066
2017-08-26 10:46



Dapatkan daftar file yang dihapus dan salin path lengkap dari file yang dihapus

git log --diff-filter=D --summary | grep delete

Jalankan perintah berikutnya untuk menemukan id commit dari commit dan salin id commit

git log --all -- FILEPATH

Tampilkan diff file yang dihapus

git show COMMIT_ID -- FILE_PATH

Ingat, Anda dapat menulis output ke file menggunakan > seperti

git show COMMIT_ID -- FILE_PATH > deleted.diff

302
2018-02-19 04:53



Tidak dapat mengedit tanggapan yang diterima sehingga menambahkannya sebagai jawaban di sini,

untuk mengembalikan file dalam git, gunakan yang berikut (perhatikan tanda '^' tepat setelah SHA)

git checkout <SHA>^ -- /path/to/file

35
2018-04-03 15:51



@Amber memberi jawaban yang benar! Hanya satu tambahan lagi, jika Anda tidak tahu jalur yang tepat dari file Anda dapat menggunakan wildcard! Ini berhasil bagi saya.

git log --all -- **/thefile.*

21
2018-01-08 16:36



Misalkan Anda ingin memulihkan file yang disebut MyFile, tetapi tidak yakin dengan jalurnya (atau perluasannya, dalam hal ini):

Ujian persiapan.: Hindari kebingungan dengan melangkah ke akar git

Sebuah proyek nontrivial mungkin memiliki banyak direktori dengan nama yang mirip atau identik.

> cd <project-root>
  1. Temukan jalur lengkap

    git log --diff-filter = D --pernyataan | grep delete | grep MyFile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js adalah jalur & file yang Anda cari.

  1. Tentukan semua commit yang mempengaruhi file itu

    git log --oneline --follow - full / path / ke / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. Periksa file

Jika Anda memilih commit pertama terdaftar (yang terakhir secara kronologis, di sini bd8374c), file tidak akan ditemukan, karena sudah dihapus dalam commit tersebut.

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

Cukup pilih awalan sebelumnya (tambahkan tanda sisipan):

> git checkout bd8374c^ -- full/path/to/MyFile.js

15
2018-03-03 15:35



Coba gunakan salah satu pemirsa, seperti gitk sehingga Anda dapat menjelajahi seluruh sejarah untuk menemukan file yang setengah diingat itu. (menggunakan gitk --all jika diperlukan untuk semua cabang)


14
2017-08-26 12:59



Salah satu hal yang membosankan di sini adalah untuk mendapatkan jalur file yang terhapus sehingga saya hanya menuliskan perintah sederhana, di mana pengguna dev atau git dapat memberikan nama file yang dihapus dan mendapatkan riwayat:

git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

Jika ada yang bisa meningkatkan perintah, silakan lakukan.


11
2018-01-30 18:24