Sekali waktu, ada file di proyek saya yang sekarang ingin saya dapatkan.
Masalahnya adalah: Saya tidak tahu kapan saya menghapusnya dan di jalur mana itu.
Bagaimana saya bisa menemukan komit file ini ketika ada?
Sekali waktu, ada file di proyek saya yang sekarang ingin saya dapatkan.
Masalahnya adalah: Saya tidak tahu kapan saya menghapusnya dan di jalur mana itu.
Bagaimana saya bisa menemukan komit file ini ketika ada?
Jawaban:
Jika Anda tidak tahu jalur yang tepat yang dapat Anda gunakan
git log --all --full-history -- "**/thefile.*"
Jika Anda tahu path tempat file itu berada, Anda dapat melakukan ini:
git log --all --full-history -- <path-to-file>
Ini akan menampilkan 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 kembalikan ke copy pekerjaan Anda dengan:
git checkout <SHA>^ -- <path-to-file>
Perhatikan simbol tanda kurir ( ^
), yang mendapatkan checkout sebelum yang diidentifikasi, karena pada saat <SHA>
melakukan file dihapus, kita perlu melihat komit sebelumnya untuk mendapatkan konten file yang dihapus itu
git log -- <path>
akan memiliki output ketika Anda berada di cabang di mana file tidak pernah ada. Anda harus selalu menggunakan git log --all -- <path>
, untuk memastikan Anda tidak ketinggalan perubahan yang terjadi di cabang lain. Perintah git log -- <path>
ini bisa sangat berbahaya jika Anda memiliki lebih dari satu cabang dan cenderung melupakan jalur dan cabang (seperti saya) dan juga berbahaya jika Anda bekerja dengan pengembang lain.
git checkout <SHA>^ -- <path-to-file>
(perhatikan simbol ^), karena pada saat <SHA> komit file dihapus, kita perlu melihat komit sebelumnya untuk mendapatkan konten file yang dihapus
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 komit dari komit itu dan salin id komit
git log --all -- FILEPATH
Tampilkan perbedaan dari file yang dihapus
git show COMMIT_ID -- FILE_PATH
Ingat, Anda dapat menulis output ke file menggunakan >
like
git show COMMIT_ID -- FILE_PATH > deleted.diff
unknown revision or path not in the working tree
.
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }
dan sekarang Anda bisa melakukannya:git-grep-latest some_text
linux pipes
.. Anda akan menyukainya.
Tidak dapat mengedit respons yang diterima sehingga menambahkannya sebagai jawaban di sini,
untuk mengembalikan file di git, gunakan yang berikut (perhatikan tanda '^' tepat setelah SHA)
git checkout <SHA>^ -- /path/to/file
<SHA>~1
harus bekerja sama tanpa perlu membungkusnya dengan tanda kutip.
Misalkan Anda ingin memulihkan file yang dipanggil MyFile
, tetapi tidak pasti lintasannya (atau ekstensi, dalam hal ini):
Prelim .: Hindari kebingungan dengan melangkah ke root git
Proyek nontrivial dapat memiliki banyak direktori dengan nama yang mirip atau identik.
> cd <project-root>
Temukan jalur lengkap
git log --diff-filter = D --summary | grep delete | grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
adalah jalur & file yang Anda cari.
Tentukan semua komit yang memengaruhi 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.
Periksa file
Jika Anda memilih komit yang pertama kali terdaftar (yang terakhir secara kronologis, di sini bd8374c), file tidak akan ditemukan, karena sudah dihapus di komit itu.
> 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 komit sebelumnya (tambahkan tanda sisipan):
> git checkout bd8374c^ -- full/path/to/MyFile.js
git log --diff-filter=D --summary | find "delete" | find "MyFile"
Dan step3, perhatikan tanda kutip di sekitar hash:git checkout "bd8374c^" -- full/path/to/MyFile.js
@Amber memberikan jawaban yang benar! Hanya satu tambahan lagi, jika Anda tidak tahu jalur pasti dari file tersebut, Anda dapat menggunakan wildcard! Ini berhasil untuk saya.
git log --all -- **/thefile.*
Di bawah ini adalah perintah sederhana, di mana pengguna dev atau git dapat meneruskan nama file yang dihapus dari direktori root repositori dan mendapatkan sejarah:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
Jika ada yang dapat meningkatkan perintah, silakan lakukan.
Coba gunakan salah satu pemirsa, seperti gitk
sehingga Anda dapat menelusuri sejarah untuk menemukan file yang setengah diingat itu. (gunakan gitk --all
jika diperlukan untuk semua cabang)
--all
pilihan adalah penting untuk kedua jawaban Anda dan jawaban yang diterima.
Ringkasan:
Anda mencari path lengkap file Anda dalam sejarah file yang dihapus git log --diff-filter=D --summary | grep filename
Anda mengembalikan file Anda dari komit sebelum dihapus
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
Inilah solusi saya:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>