Dapatkah saya memulihkan file yang terhapus (membatalkan `git clean -fdx`)?

119

Saya mengikuti instruksi membuat halaman github , dan lupa pindah ke sub direktori git saya. Akibatnya, saya baru saja memasukkan seluruh direktori dokumen dengan git clean -fdx.
Adakah cara agar saya dapat membatalkan kesalahan besar ini?

Eric
sumber
2
Saya tidak tahu pasti, tapi saya rasa itu tidak mungkin dilakukan dengan git. Namun utilitas yang tidak dihapus untuk sistem file Anda mungkin bisa membantu.
static_rtti
9
Menariknya, Buku Komunitas Git juga menyarankan git clean -fdxtanpa peringatan bahwa pengoperasian itu sangat berbahaya. Saya bertanya-tanya berapa banyak orang yang secara tidak dapat ditarik kembali menghancurkan file mereka dengan saran yang tampaknya tidak bersalah ini.
catpnosis
5
Pastikan untuk memeriksa apakah IDE Anda memiliki "Riwayat Lokal" seperti yang dimiliki Eclipse atau IntelliJ IDE. Itu dapat menyelamatkan Anda dari banyak sakit hati atas git cleanpanggilan yang tidak disengaja . Selain itu, usahakan untuk keluar dari kebiasaan membersihkan tanpa memeriksa. Buat skrip Powershell atau Bash yang dapat dipanggil yang akan berjalan git clean -fdxndengan prompt konfirmasi sebelum Anda benar-benar menjalankan pembersihan yang sangat merusak.
Josh Burgess

Jawaban:

129

Tidak. File-file itu hilang.

(Baru saja memeriksa di Linux: panggilan bersih gitunlink() , dan tidak mencadangkan apa pun sebelumnya.)

Tikar
sumber
32
Jika Anda menggunakan IDE tingkat lanjut seperti RubyMine, Eclipse, dll, kemungkinan besar itu akan memiliki riwayat lokal dari file yang dihapus dan Anda mungkin dapat memulihkannya.
Usman
1
@Usman dalam kasus saya secara git cleantidak sengaja menghapus perubahan yang disimpan di dalam .ideafolder tersembunyi dan Riwayat Lokal menyelamatkan saya!
emkman
2
Tip bagus oleh @Usman. Dengan Eclipse, saya bisa mendapatkan file saya kembali dengan opsi "Pulihkan dari Riwayat Lokal ...": i.imgur.com/XWNLOk5.gifv
brandizzi
1
Sebenarnya ini MUNGKIN tetapi dengan metode hacky. Lihat jawaban ini: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow
4
Di PyCharm Anda juga dapat memulihkannya. Klik kanan di folder yang memilikinya, klik di Riwayat lokal, temukan penghapusan dan klik kembalikan.
Juanjo Conti
48
git clean -fdxn

Akan melakukan dry run , dan menunjukkan kepada Anda file apa yang akan dihapus jika Anda menjalankan

git clean -fdx

(tentu saja ini hanya membantu jika Anda mengetahui hal ini sebelumnya, tetapi untuk waktu berikutnya)

Peter Ajtai
sumber
7
Untuk menambahkannya, -nbekerja pada sebagian besar perintah git (dan banyak perintah * nix lainnya).
Nick McCurdy
23

IntelliJ / Android Studio memungkinkan pemulihan file dari riwayat lokal .

Y2i
sumber
3
PyCharm juga mendukung ini! Terima kasih atas jawaban ini. Saya sangat senang saya membaca sisa jawaban setelah 3 teratas adalah "tidak, maaf Anda kurang beruntung".
Bryson
18

Tidak. "Git clean -fdx" akan menghapus semua file dan direktori yang tidak dilacak git dari direktori kerja Anda. Karena Git tidak melacak file-file ini, Git tidak akan memiliki backup dari file-file ini. Setidaknya tidak biasanya.

Jika Anda telah melakukan 'git add' pada salah satu file ini baru-baru ini (tetapi membatalkan komit), ada kemungkinan Anda dapat menemukannya dengan 'git fsck --lost-found'. Ini patut dicoba, tetapi jangan terlalu berharap terlalu banyak.

Di masa depan, Anda harus mempertimbangkan untuk melakukan beberapa kali terlalu sering daripada beberapa kali terlalu jarang. Dengan cara itu Anda setidaknya akan memiliki cadangan lokal, bahkan jika Anda tidak mendorong komit ini ke remote.

kusma
sumber
Masalah sebenarnya adalah direktori tersebut tidak seharusnya menjadi tempat penyimpanan juga. Melihat kembali log, ternyata saya lupa cd ke direktori repo baru setelah mkdir-ing
Eric
1
Tidak lama setelah membaca pertanyaan ini, saya menulis patch ke Git yang menambahkan variabel konfigurasi untuk mencadangkan setiap file yang dihapus. Mungkin bisa bermanfaat untuk orang lain? github.com/kusma/git/tree/work/clean-backup
kusma
1
Saya beruntung hari ini !!! Berkat "git fsck --lost-found". Saya menggunakan yang berikut ini untuk mendapatkan SEMUA perubahan: git fsck | awk '{print $ 3}' | xargs git show | tee searchresults.log Karena saya ingin seluruh file yang telah saya tambahkan dan kemudian saya hapus, saya bisa mendapatkannya dari log. :)
Marcello de Sales
11

Seperti @kusma yang disebutkan di atas, jika Anda beruntung (jika Anda pernah melakukan "git add"), Anda dapat menggunakan perintah berikut untuk mengekstrak seluruh objek:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

Dengan begitu, ia akan mencari semua jenis potongan, mengumpulkan seluruh perbedaan dan menambahkan ke file yang dapat Anda ekstrak file yang hilang. Dalam kasus saya, saya telah kehilangan seluruh kelas Java.

Marcello de Sales
sumber
8

Jika Anda menggunakan Jetbrains IDE, ada opsi untuk melihat riwayat lokal suatu file. Jika Anda telah melakukannya git clean, Anda dapat membuat ulang file dan memeriksa riwayat lokal file dan memulihkannya dari sana.

Bekerja untuk saya untuk satu file. Untuk direktori lengkap saya tidak tahu bagaimana melakukan itu.

Rajesh Paul
sumber
Buat file di lokasi yang sama dengan nama file yang sama. Di IDE klik kanan dan klik "Show history". Salin dan tempel konten darinya. Saran yang sangat bagus @Rajesh. Terima kasih.
dalam
1
Saya selamat Terima kasih.
Scott
Tidak perlu menyalin konten file, cukup klik kanan file tersebut, dan klik 'kembali' untuk mengembalikannya ke versi itu (bahkan jika Anda menghapusnya)
n00b
7

Saya mengalami masalah ini hari ini.

Seperti yang dikatakan orang lain, git tidak menyimpan file.

Satu-satunya cara untuk membatalkan ini adalah dengan utilitas undelete. Saya menggunakan "extundelete" dan memulihkan semuanya, tetapi jarak tempuh / sistem file Anda mungkin berbeda-beda.

dougallj
sumber
7

Jika Anda sedang mengerjakan Eclipse, salah satu solusi yang mungkin adalah memulihkan dari riwayat lokal Eclipse.

Abhinav
sumber
2
im menggunakan PyCharm dan sejarah lokal menyelamatkan saya
psychok7
1
Hal yang sama di IntelliJ IDEA!
arthurakay
RubyMine juga memiliki sejarah lokal. selamatkan aku!
Usman
Semua browser IntelliJ memiliki sejarah lokal. Syukurlah. Saya menggunakan WebStorm dan hampir mengalami aneurisma sebelum saya menemukannya. 3 hari senilai 12 jam kerja sehari, dan saya dengan serius mempertimbangkan untuk menenggak sebotol minuman keras di meja saya.
Josh Burgess
7

Sebenarnya Ya ! Ini mungkin! Tapi tanpa menggunakan perintah git.
Yang kita butuhkan hanyalah alat pemulihan file seperti Recuva .
Sebutkan saja jalur dari mana itu dihapus, dan biarkan memulihkan file.

Juga berikut adalah beberapa catatan berguna untuk menggunakan aplikasi itu:

  1. Saya sangat menyarankan Anda untuk mencentang kotak ini sebelum memulihkan file (ketika file yang dihapus muncul di jendela pemulihan):
    Advanced Mode-> Options-> Actions-> Restore folder structure
    Dengan ini semua file Anda akan dipulihkan dengan menjaga struktur folder sehingga akan jauh lebih mudah untuk hanya menyeret dan melepas folder itu ke jalur tempat folder itu dihapus.
  2. Memasang alat pemulihan pada perangkat USB jauh lebih disukai (karena peringatan di bawah)
  3. Saat menyebutkan tempat untuk memulihkan file, hindari memilih drive yang sama dari mana file tersebut dihapus (sekali lagi karena peringatan yang disebutkan di bawah), karena file yang saat ini dipulihkan mungkin menimpa file yang dihapus lainnya yang belum dipulihkan. Memulihkan file ke drive USB mana pun selalu merupakan solusi yang baik di sana.

Peringatan! Segera setelah Anda kehilangan (menghapus secara tidak sengaja) file apa pun, cobalah untuk tidak menyentuh (menambah / mengedit file) drive dari mana file itu dihapus untuk meningkatkan kemungkinan pemulihan yang berhasil. Jika tidak, Anda mungkin kehilangan file itu sepenuhnya.

Mengapa berhasil: Saat Anda menghapus file, sebenarnya file itu tidak terhapus. Ini hanya ditandai sebagai "dihapus" jadi lain kali ketika Anda menambahkan / memperbarui file ke drive yang sama, file lama itu ditimpa dengan yang baru. Tetapi sampai mereka ditimpa, masih mungkin untuk membaca (dan tentu saja memulihkan) file.

Hanya Bayangan
sumber
1
Terima kasih Anda menyelamatkan hidup saya. Saya tidak tahu apakah itu jawaban yang benar karena saya tidak dapat memulihkan semuanya tetapi saya beruntung karena saya mendapatkan file paling penting yang saya butuhkan.
XzaR
2

Saya melakukannya dengan kode yang seharusnya saya tambahkan ke repositori saya dan saya membersihkan dengan -dfx saya dapat memulihkan file.

Saya mencoba menggunakan debugfs, melihat dan menautkan dari inode, testdisk, dan banyak alat lain yang muncul dan tidak ada yang menemukan direktori yang tulisan bodoh ini terhapus secara tidak sengaja.

Unduh extundelete dari sourceforge.
Anda mungkin perlu menginstal paket e2fslibs-dev
Run

$ ./configure 
$ make 

Ini akan menghasilkan biner untuk extundelete di dalam folder src Dalam kasus saya, saya telah salah menghapus folder. sebut saja FOOBAR

Saya baru saja berlari:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


dan itu membuat folder bernama RESTORED_FOLDERS

motbus
sumber
Wow! meskipun ini tidak memulihkan file yang saya inginkan, itu adalah sesuatu yang akan saya catat - pasti akan berguna!
vyom
1

Jika Anda menggunakan git dengan MSBuild saya membuat target yang menyalin semua file dan kemudian melakukannya git clean -xdf. Dengan cara ini Anda dapat dengan mudah mengembalikan file jika Anda menyadari bahwa Anda menghapus sesuatu yang tidak ingin Anda hapus. Lihat di sini: http://blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/

Pawel
sumber
1

Jika Anda menggunakan mac dan dicadangkan dengan Time Machine, maka Anda dapat memulihkan

Nullable
sumber
0

Untungnya, saya membuat kesalahan ini saat menggunakan Windows 7. Pergi ke recycle bin, menyorot semua file yang terhapus dan mengklik "Restore". Selesai.

Matt Cashatt
sumber
6
Maksud kamu apa? git cleantidak memindahkan file ke recycle bin.
MEMark
0

Jika Anda belum mendorong perubahan Anda (git push), Anda juga dapat mengembalikan informasi dari server Anda yang belum diperbarui. Saya menggunakan filezilla untuk mengembalikan file yang saya hapus dan salin ke file lokal saya. Ini bukan cara terbaik melakukannya, tetapi bekerja dan menghindari penggunaan konsol

Mbotet
sumber