Katakan saya di repositori Git. Saya menghapus file dan melakukan perubahan itu. Saya terus bekerja dan membuat lebih banyak komitmen. Kemudian, saya merasa saya harus mengembalikan file itu.
Saya tahu saya dapat checkout file menggunakan git checkout HEAD^ foo.bar
, tetapi saya tidak benar-benar tahu kapan file itu dihapus.
- Apa cara tercepat untuk menemukan komit yang menghapus nama file yang diberikan?
- Apa cara termudah untuk mengembalikan file itu ke copy pekerjaan saya?
Saya berharap saya tidak harus secara manual menelusuri log saya, checkout seluruh proyek untuk SHA yang diberikan dan kemudian secara manual menyalin file itu ke checkout proyek asli saya.
git
file-io
git-checkout
avdgaag
sumber
sumber
git log --diff-filter=D -- path/to/file
git checkout deletedFile
akan membatalkan penghapusandeletedFile
jika sudah dihapus tetapi penghapusan itu belum dilakukan atau dilakukan . Bukan itu yang ditanyakan di sini; pertanyaan ini adalah tentang cara mengembalikan file yang penghapusannya dilakukan beberapa kali lalu.Jawaban:
Temukan komit terakhir yang memengaruhi jalur yang diberikan. Karena file tidak ada dalam HEAD commit, commit ini harus menghapusnya.
Kemudian checkout versi di komit sebelumnya, menggunakan
^
simbol tanda sisipan ( ):Atau dalam satu perintah, jika
$file
file tersebut dipertanyakan.Jika Anda menggunakan zsh dan mengaktifkan opsi EXTENDED_GLOB, simbol caret tidak akan berfungsi. Anda bisa menggunakannya
~1
.sumber
± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^
Saya beralih ke bash & itu bekerja dengan baik.error: pathspec <filename> did not match any file(s) known to git.
. Solusinya adalah menggunakan git bash.git checkout <deleting-commit>~1 -- <file-path>
~ X memungkinkan Anda untuk menentukan komit X sebelum komit yang ditentukan, jadi ~ 1 adalah komit sebelumnya, ~ 2 adalah dua komitmen sebelumnya, dll^
karakter adalah karakter pelarian! Oleh karena itu, pada cmd, Anda harus mengetik^^
untuk memberi tahu cmd Anda menginginkan satu literal ^ dan bahwa Anda tidak melarikan diri dari sesuatu yang lain setelahnya. Apa yang terjadi pada banyak orang adalah bahwa^
diikuti oleh spasi. Jadi cmd berpikir Anda melarikan diri dari ruang - yang menghasilkan karakter ruang saja. Jadi, pada saat git mendapatkan argumen cli, ia melihatSHA1
dan tidakSHA1^
. Benar-benar menjengkelkan.~
bukan karakter pelarian, jadi itu sebabnya itu masih berfungsi. (PS. Jika Anda berpikir para googler menginginkan informasi ini, harap beri komentar dengan komentar)git log --diff-filter=D --summary
untuk mendapatkan semua komit yang memiliki file yang dihapus dan file yang dihapus;git checkout $commit~1 path/to/file.ext
untuk mengembalikan file yang dihapus.Di mana
$commit
nilai komit yang Anda temukan pada langkah 1, mise4cf499627
sumber
git log -- *PartOfMyFileName*
. Terima kasih untuk$commit~1
git checkout $commit~1 filename
sintaks bekerja sempurna untuk file individual, dan juga bekerja untuk seluruh direktori. yaitu: untuk mengembalikan semua gambar dihapus di ./images dari sha 12345:git checkout 12345~1 images
. terima kasih atas jawaban ini!$commit~1
berarti Anda harus menambahkan nama komit. Sesuatu seperti1d0c9ef6eb4e39488490543570c31c2ff594426c
dimana$commit
.Untuk mengembalikan semua file yang dihapus di folder, masukkan perintah berikut.
sumber
git
membuat tugas yang paling sederhana sekalipun.ls-files
sub-perintah berguna, tetapi tampaknya tidak bekerja untuk file yang telah dihapus dengangit rm
yaitu dipentaskan, apalagi berkomitmen, yang adalah apa yang OP bertanya.M myChangedFile
setelahnyagit checkout
?Saya sampai pada pertanyaan ini mencari untuk mengembalikan file yang baru saja saya hapus tetapi saya belum melakukan perubahan. Jika Anda menemukan diri Anda dalam situasi ini, yang perlu Anda lakukan adalah yang berikut:
git checkout HEAD -- path/to/file.ext
sumber
Jika Anda gila, gunakan
git-bisect
. Inilah yang harus dilakukan:Sekarang saatnya menjalankan tes otomatis. Perintah shell
'[ -e foo.bar ]'
akan mengembalikan 0 jikafoo.bar
ada, dan 1 jika tidak. Perintah "jalankan"git-bisect
akan menggunakan pencarian biner untuk secara otomatis menemukan komit pertama di mana pengujian gagal. Mulai setengah rentang yang diberikan (dari yang baik ke yang buruk) dan memotongnya menjadi dua berdasarkan hasil tes yang ditentukan.Sekarang Anda berada di komit yang menghapusnya. Dari sini, Anda dapat melompat kembali ke masa depan dan menggunakan
git-revert
untuk membatalkan perubahan,atau Anda dapat kembali satu komit dan memeriksa kerusakan secara manual:
sumber
git bisect run '[ -e foo.bar ]'
?git bisect run
memberitahu Git untuk mengotomatisasi pembagian dua dengan menjalankan perintah berikut kata 'jalankan' di mana perintah harus kembali0
untukgood
versi (lihatgit help bisect
untuk detail). Ini'[ -e foo.bar ]'
adalah ekspresi standar untuk pengujian jika filefoo.bar
memang ada (implementasinya biasanya dalam file/usr/bin/[
yang biasanya di-hardlink/usr/bin/test
) dan tanda kuasi tunggal digunakan untuk menempatkan semua itu sebagai argumen baris perintah tunggal.Alias favorit baru saya, berdasarkan bonyiii 's jawaban (upvoted), dan jawaban saya sendiri tentang ' Lulus argumen untuk perintah alias Git ':
Saya kehilangan file, terhapus karena kesalahan beberapa komitmen lalu?
Cepat:
Krisis dihindari.
Peringatan, dengan Git 2.23 (Q3 2019) hadir perintah eksperimental bernama
git restore
(!).Jadi ganti nama alias ini (seperti yang ditunjukkan di bawah ini).
Robert Dailey mengusulkan dalam komentar alias berikut:
Dan jegan menambahkan dalam komentar :
sumber
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Expansion of alias 'restore' failed; '!git' is not a git command
Jika Anda tahu nama file, ini adalah cara mudah dengan perintah dasar:
Daftar semua komitmen untuk file itu.
Komit terakhir (paling atas) adalah yang menghapus file. Jadi, Anda perlu mengembalikan komit kedua ke terakhir.
sumber
Untuk mengembalikan file yang dihapus dan berkomitmen:
Itu diuji pada Git versi 1.7.5.4.
sumber
error: pathspec 'foo' did not match any file(s) known to git.
memastikan bahwa nama file itu benar. Git versi 2.7.0git add -A
, tetapi file yang dipulihkan masih dalam tahap tidak berkomitmen.Jika Anda hanya membuat perubahan dan menghapus file, tetapi tidak melakukan itu, dan sekarang Anda putus dengan perubahan Anda
tetapi file yang dihapus tidak kembali, Anda cukup melakukan perintah berikut:
Dan presto, file Anda kembali.
sumber
Saya punya solusi ini .
Dapatkan id komit tempat file dihapus menggunakan salah satu cara di bawah ini.
git log --grep=*word*
git log -Sword
git log | grep --context=5 *word*
git log --stat | grep --context=5 *word*
# disarankan jika Anda hampir tidak ingat apa punAnda harus mendapatkan sesuatu seperti:
3 . Sekarang menggunakan commit id bfe68bd117e1091c96d2976c99b3bcc8310bebe7 lakukan:
Sebagai komit referensi referensi komit di mana file itu sudah dihapus, Anda perlu referensi komit sebelum bfe68b yang dapat Anda lakukan dengan menambahkan
^1
. Ini berarti: beri saya komit sebelum bfe68b.sumber
sumber
git undelete path/to/file.ext
Masukkan ini ke dalam
.bash_profile
(atau file relevan lainnya yang dimuat saat Anda membuka shell perintah):Kemudian gunakan:
Alias ini terlebih dahulu memeriksa untuk menemukan komit terakhir di mana file ini ada, dan kemudian melakukan checkout Git dari path file itu dari komit terakhir di mana file ini ada. Sumber .
sumber
Dalam banyak kasus, berguna untuk menggunakan coreutils (grep, sed, dll.) Dalam hubungannya dengan Git. Saya sudah tahu alat ini cukup baik, tetapi Git kurang begitu. Jika saya ingin melakukan pencarian untuk file yang dihapus, saya akan melakukan hal berikut:
Ketika saya menemukan revisi / komit:
Seperti yang orang lain katakan di depan saya.
File sekarang akan dikembalikan ke keadaan sebelum dihapus. Jangan lupa komit kembali ke pohon kerja jika Anda ingin menyimpannya.
sumber
Saya harus mengembalikan banyak file yang dihapus dari komit tertentu, dan saya berhasil dengan dua perintah:
(Perhatikan spasi tambahan di akhir setiap perintah.)
File-file tersebut telah ditambahkan ke file .gitignore dan kemudian dihapus
git rm
. Saya perlu mengembalikan file, tetapi kemudian unstage. Saya memiliki ratusan file untuk dipulihkan, dan mengetikkan secara manual untuk setiap file seperti pada contoh lain akan terlalu lambat.sumber
Sebenarnya, pertanyaan ini langsung tentang Git, tetapi seseorang seperti saya bekerja dengan alat GUI seperti WebStorm VCS selain mengetahui tentang perintah Git CLI.
Saya klik kanan pada path yang berisi file yang dihapus, dan kemudian pergi ke Git dan kemudian klik Show History .
Alat VCS memperlihatkan semua revisi kereta dan saya bisa melihat semua komitmen dan perubahan dari masing-masing revisi.
Lalu saya memilih komit yang teman saya hapus
PostAd.js
file. sekarang lihat di bawah:Dan sekarang, saya bisa melihat keinginan saya menghapus file. Saya cukup klik dua kali pada nama file dan pulih.
Saya tahu jawaban saya bukan perintah Git, tetapi cepat, dapat diandalkan, dan mudah bagi pengembang pemula dan profesional. Alat WebStorm VCS luar biasa dan sempurna untuk bekerja dengan Git dan tidak memerlukan plugin atau alat lain.
sumber
Saya punya pertanyaan yang sama. Tanpa menyadarinya, saya telah membuat komit menggantung .
Buat daftar komitmen menjuntai
git fsck --lost-found
Periksa setiap komit yang menggantung
git reset --hard <commit id>
File saya muncul kembali ketika saya pindah ke komit menggantung.
git status
untuk alasan:“HEAD detached from <commit id where it detached>”
sumber
Pulihkan file yang dihapus:
sumber
Jika Anda tahu komit yang menghapus file, jalankan perintah ini di mana
<SHA1_deletion>
komit yang menghapus file:Bagian sebelum pipa mencantumkan semua file yang dihapus di komit; mereka semua keluar dari komit sebelumnya untuk mengembalikannya.
sumber
Temukan komit yang menghapus file Anda:
Output sampel:
Pada Git 2.23 sebenarnya ada
restore
perintah. Ini masih eksperimental tetapi untuk mengembalikan sesuatu yang Anda hapus dalam komit (4711174 dalam kasus ini) Anda kemudian dapat mengetik:Catat ^ setelah id komit karena kami ingin mengembalikan sesuatu dari komit sebelumnya yang menghapus file.
The
--source
Argumen menceritakanrestore
perintah mana untuk mencari file (s) untuk mengembalikan dan dapat setiap komit dan bahkan indeks.Lihat: git-restore doc untuk git 2.23.0
sumber
Dalam kasus kami, kami secara tidak sengaja menghapus file dalam komit dan beberapa komit kemudian kami menyadari kesalahan kami dan ingin mendapatkan kembali semua file yang dihapus, tetapi tidak yang dimodifikasi.
Berdasarkan jawaban Charles Bailey yang sangat baik, berikut ini kalimat saya:
sumber
Sederhana dan tepat-
Pertama-tama, dapatkan komitmen stabil terbaru di mana Anda memiliki file itu dengan -
Katakan Anda menemukan $ commitid 1234567 ..., lalu
Ini akan mengembalikan versi file yang ada di komit itu.
sumber
Untuk cara terbaik untuk melakukannya, cobalah.
Pertama, cari id komit dari komit yang menghapus file Anda. Ini akan memberi Anda ringkasan komit yang menghapus file.
Catatan:
84sdhfddbddd
adalah milik Andacommit id
Melalui ini Anda dapat dengan mudah memulihkan semua file yang dihapus.
sumber
Anda selalu dapat
git revert
komit Anda yang menghapus file. ( Ini mengasumsikan bahwa penghapusan adalah satu-satunya perubahan dalam komit. )Dan jika Anda terus bekerja, dan menyadari kemudian bahwa Anda tidak ingin melakukan komitmen penghapusan itu, Anda dapat mengembalikannya menggunakan:
Sekarang
git log
menunjukkan:Dan
readme.md
telah dikembalikan ke repositori.sumber
Saya juga mengalami masalah ini menggunakan kode di bawah ini untuk mengambil file sebelumnya ke direktori lokal:
Contoh di bawah ini berfungsi untuk saya:
git checkout resources/views/usaSchools.blade.php
sumber
sumber
Jika penghapusan belum dilakukan, perintah di bawah ini akan mengembalikan file yang dihapus di pohon kerja.
Anda bisa mendapatkan daftar semua file yang dihapus di pohon kerja menggunakan perintah di bawah ini.
Jika penghapusan telah dilakukan, cari komit tempat terjadinya, kemudian pulihkan file dari komit ini.
Jika Anda mencari jalur file untuk dipulihkan, perintah berikut akan menampilkan ringkasan semua file yang dihapus.
sumber
Untuk mengembalikan semua file yang dihapus dengan Git, Anda juga dapat melakukan:
Di mana
git ls-files --deleted
daftar semua file yang dihapus dangit checkout $(git command)
mengembalikan daftar file dalam suatu parameter.sumber