git memulihkan file yang dihapus di mana tidak ada komit dibuat setelah penghapusan

812

Saya menghapus beberapa file.

Saya belum berkomitmen.

Saya ingin mengatur ulang ruang kerja saya untuk memulihkan file.

Saya melakukan git checkout ..

Namun file yang dihapus masih hilang.

Dan git statusmenunjukkan:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

Mengapa tidak git checkout .mereset ruang kerja ke HEAD?

Homan
sumber
16
jika Anda tidak melakukan perubahan setelah penghapusan, git checkout .akan berfungsi dengan baik.
faizal
10
@faizal dan Anda akan kehilangan perubahan jika melakukannya.
Vasiliy Yorkin
1
Cukup tekan Ctrl-J di git gui pada item yang dihapus.
ajeh
git checkout - cc.properties store / README store / cc.properties
Vinod Pasi
Lihat jawaban ini: quora.com/…
live-love

Jawaban:

787

Keluaran memberi tahu Anda apa yang perlu Anda lakukan. git reset HEAD cc.propertiesdll.

Ini akan menghentikan operasi rm. Setelah itu, menjalankan git statuslagi akan memberi tahu Anda bahwa Anda perlu melakukan git checkout -- cc.propertiesuntuk mendapatkan file kembali.

Pembaruan: Saya punya ini di file konfigurasi saya

$ git config alias.unstage
reset HEAD

yang biasanya saya gunakan untuk unstage stuff.

Noufal Ibrahim
sumber
5
Bagaimana Anda melakukan ini untuk banyak file yang dihapus? Menjalankan git reset HEAD <<nama file>> beberapa kali akan merepotkan, ada cara efisien untuk menyelesaikannya?
SubSul
70
git reset HEAD \*dan kemudiangit checkout -- .
Noufal Ibrahim
3
tapi saya sudah memodifikasi file.
Jiang YD
@ RauliRajande Kemungkinan situasi Anda berbeda dari yang dijelaskan dalam pertanyaan awal.
Noufal Ibrahim
1
rm -r ./engines- oops. Sekarang git reset engines; git checkout engines.
Kris
209

Anda telah melakukan penghapusan sehingga perlu Anda lakukan:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . hanya memeriksa dari indeks di mana penghapusan telah dipentaskan.

CB Bailey
sumber
177

Kerjakan saja git checkout path/to/file-I-want-to-bring-back.txt

seddonym
sumber
8
hanya berfungsi jika file belum dilakukan dan didorong.
mahen3d
23
Tidak bekerja untuk saya, git mengatakan tidak tahu file apa pun dengan nama itu, meskipun file tersebut dilacak. Saya juga tidak melakukan, saya hanya menghapus file menggunakan menu konteks netbeans 'keliru.
Zelphir Kaltstahl
4
@Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov
@ user3479125 Saya kira file Anda tidak pernah dikomit. Apa yang git statusdikatakan tentang itu?
ki92
12
Status Git menunjukkan warna hijau "delated file.ext" git checkout HEAD -- file.extmembantu memulihkannya.
Ivan Borshchov
144

Untuk memulihkan semua penghapusan yang tidak bertahap sekaligus, secara otomatis, tanpa menentukan setiap jalur:

git ls-files -z -d | xargs -0 git checkout --

Untuk memulihkan semua penghapusan bertahap , secara otomatis, tanpa menentukan setiap jalur:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --
PaoloC
sumber
12
Saya tidak sengaja menghapus lebih dari 500 file dan ini berhasil karena ia juga menyimpan semua perubahan valid saya (baris pertama adalah apa yang saya gunakan). Terima kasih.
Guy Lowe
1
Secara tidak sengaja menghapus semua konten dari repo setelah pembuatan yang berhasil. Perintah pertama menyelamatkan bacon saya.
MonaLisaOverdrive
2
Sebelum ini berhasil, saya harus berlari git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn
1
Sangat berguna, ingin menyimpan file yang tidak terlacak tetapi menyingkirkan dihapus dan diubah, hanya diubah -d ke -m untuk menangani dimodifikasi.
RaisinBranCrunch
5
Catatan ini tidak berfungsi jika Anda memiliki spasi di nama / jalur file Anda. Saya pikir git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --akan berhasil.
parsley72
79

Karena Anda sedang melakukan git checkout ., sepertinya Anda mencoba mengembalikan cabang Anda kembali ke keadaan komit terakhir.

Anda dapat mencapainya dengan a git reset HEAD --hard

Peringatan

Melakukan hal ini dapat menghapus semua modifikasi terbaru Anda dan membatalkan tahapan modifikasi Anda, misalnya, Anda dapat kehilangan pekerjaan. Ini mungkin apa yang Anda inginkan, tetapi memeriksa dokumentasi untuk memastikan.

Paul T
sumber
39
Woww !! Hati-hati dengan ini !!!! Anda mungkin benar, tetapi seseorang mungkin bingung dan meledakkan seluruh kode mereka. Ini akan keren jika Anda menambahkan peringatan yang lebih besar.
santiagobasulto
3
Inilah yang saya butuhkan. Tidak meledakkan seluruh kode Anda - hanya membawa Anda kembali ke komit terbaru Anda.
Andrew Hendrie
2
Saya berakhir dengan ratusan file yang hilang pada satu titik. Ini adalah satu-satunya cara praktis untuk memperbaiki masalah. Terima kasih!
Jonathan Benn
66

jika kamu digunakan

git rm filename

untuk menghapus file

git checkout path/to/filename

tidak bekerja, jadi dalam hal ini

git checkout HEAD^ path/to/filename

harus bekerja

Aurangzeb
sumber
2
Saya suka jawaban ini. Tidak ada keraguan bahwa Anda hanya memengaruhi file tertentu yang Anda hapus. 1) jalur checkout git / ke / nama file 2) checkout checkout - jalur / ke / nama file
Ed of the Mountain
Luar biasa. git checkout HEAD^ path/to/filenamebekerja untuk saya karena saya belum melakukan file.
Moses Ndeda
29

Inilah perintah yang membantu saya di mac saya. Saya mencoba beberapa solusi lain tetapi tidak berhasil untuk saya.

Versi Git pada OSX Mavericks

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

Perintah

git checkout HEAD -- path/to/file/file.cc
Chris Hinshaw
sumber
19
git checkout HEAD -- client/src/pp_web/index.cljs
Dustin Getz
sumber
17

Jika Anda ingin mengembalikan semua file sekaligus

Ingatlah untuk menggunakan periode karena ia memberitahu git untuk mengambil semua file.

Perintah ini akan mengatur ulang kepala dan menghapus semua perubahan:

$ git reset HEAD . 

Kemudian jalankan ini untuk mengembalikan semua file:

$ git checkout .

Kemudian melakukan status git, Anda akan mendapatkan:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Casper Wilkes
sumber
Ini adalah solusi yang paling sederhana dan berfungsi untuk banyak file (misalkan Anda telah menghapus banyak file / folder). Bung kerja bagus +
Gkiokan
9

Apakah Anda ingin melihat ini

itu berlaku untuk kasus di mana Anda digunakan

git checkout -- .

sebelum Anda melakukan sesuatu.

Anda mungkin juga ingin menyingkirkan file yang dibuat yang belum dibuat. Dan Anda tidak menginginkannya. Dengan:

git reset -- .
Paulo Linhares - Packapps
sumber
Anda tidak melaporkan sepenuhnya jawaban yang Anda salin. Bahkan git checkout -- .tidak membantu untuk memulihkan file dihapus dan setara dengan apa yang penanya mencoba: git checkout .. Bagian yang dapat bekerja adalah yang Anda tidak menyalin: git checkout <file_path>.
Jean Paul
6

Ditemukan pos ini sambil mencari jawaban tentang cara menghapus file yang dihapus di direktori kerja saya setelah penggabungan dari cabang orang lain. Belum ada komit yang dibuat setelah penggabungan. Karena ini merupakan penggabungan dalam proses, saya tidak bisa menambahkannya kembali menggunakan:

$ git reset <commitid#-where-file.cpp-existed> file.cpp

Saya harus melakukan langkah lain selain mengatur ulang untuk mengembalikan file:

$ git checkout -- file.cpp
pengguna2453404
sumber
4

Jika Anda belum melakukan perubahan apa pun yang harus Anda lakukan adalah menyembunyikan perubahan itu dan Anda akan kembali ke komitmen kerja terakhir.

git stash
git stash clear
git clean 
Rick
sumber
Meletakkannya di tumpukan simpanan bukan solusi. Itu adalah hack.
Robert Dolca
2
Ini adalah solusi yang bagus karena Anda dapat menghapusnya dari simpanan. Jika hack atau tidak, itu masalah selera. Gagasan tentang simpanan adalah hack cerdas.
Eino Mäkitalo
@ EinoMäkitalo senang itu bisa membantu Anda :)
Rick
Saya suka pendekatan ini yang terbaik dari semua yang tercantum
ckapilla
3

jika Anda mencari direktori yang dihapus.

 git checkout ./pathToDir/*
PPB
sumber
3

Berikut adalah beberapa kasus yang berbeda sebagai referensi untuk membantu orang lain:

Jika penghapusan belum dilakukan , perintah di bawah ini akan mengembalikan file yang dihapus di pohon kerja.

$ git checkout -- <file>

Anda bisa mendapatkan daftar semua file yang dihapus di pohon kerja menggunakan perintah di bawah ini.

$ git ls-files --deleted

Jika penghapusan telah dilakukan , cari komit tempat terjadinya, kemudian pulihkan file dari komit ini.

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

Seharusnya memberi Anda sesuatu seperti c46e81aa403ecb8a0f7a323a358068345, Sekarang gunakan komit # di sini

$ git checkout <commit>^ -- <file>

Sesuatu seperti ini: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

Jika Anda mencari jalur file untuk dipulihkan, perintah berikut akan menampilkan ringkasan semua file yang dihapus.

$ git log --diff-filter=D --summary

Jika Anda hanya ingin menampilkan daftar file:

git log --diff-filter=D --summary | grep "delete mode"
Muhammad Soliman
sumber
2

Bagi saya yang berhasil adalah git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Sebagai contoh git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(dieksekusi di cabang yang kita inginkan file masuk)

Setelah perintah itu dijalankan, file yang dipulihkan akan ada di lokasi asli (yang perlu dikomit)

Dinis Cruz
sumber
dan / atau hanya git checkout master path/to/the/file.binagar Anda hanya membatalkan penghapusan file itu tanpa kehilangan perubahan lain yang mungkin Anda lakukan. PS: ini seharusnya jawaban yang diterima ...
Edoardo
1

Jika Anda telah menginstal ToroiseGIT maka pilih saja menu "Kembalikan ..." untuk menu pop-up folder induk.

Vasyl Shyrochuk
sumber
1

1. Temukan komitmen tertentu yang ingin Anda kembalikan menggunakan:

   git log
This command will give you a list of commits done by you .

2. Kembalikan pada komitmen tersebut menggunakan:

    git revert <commit id> 

Sekarang cabang lokal Anda akan memiliki semua file pada khususnya

Ashutosh S
sumber
Ini berfungsi jika Anda sudah melakukan perubahan.
live-love
1

PERHATIAN: lakukan pekerjaan apa pun yang ingin Anda pertahankan dulu.

Anda dapat mengatur ulang ruang kerja Anda (dan memulihkan file yang dihapus)

git checkout ./*
Henrique Florêncio
sumber
2
FYI ... perintah ini menghapus semua file kerja saya dan tidak memulihkan file yang dihapus..hati-hatilah
hendr1x
Itu sebabnya Anda menggunakan perintah ini untuk mengatur ulang ruang kerja Anda. Saya pikir itu cukup jelas.
Henrique Florêncio
1
Perintah itu tidak berfungsi karena jika file dihapus, itu tidak akan ditangkap oleh ./*.
Jean Paul
@JeanPaul mungkin saya salah paham tapi itu menempatkan ruang kerja saya di keadaan semula (file yang dihapus sekarang ada).
Marc
@Marc Ini bisa berfungsi tetapi hanya jika tidak ada file yang terlihat di direktori, karena kalau tidak ./*akan diperluas oleh bash untuk mencocokkan file-file tersebut sebelum dikirim ke git.
Jean Paul
0

Saya memiliki masalah yang sama namun tidak ada solusi di atas yang berfungsi untuk saya. Yang akhirnya saya lakukan adalah:
- membuat file kosong dengan nama yang sama
- membandingkan file ini dengan riwayat lokal
- menyalin riwayat menyeberang ke file kosong.

theEUG
sumber
-1

Saya memiliki masalah yang sama dan tidak ada jawaban di sini yang saya coba. Saya menggunakan Intellij dan saya telah memeriksa cabang baru git checkout -b minimalExampleuntuk membuat "contoh minimal" pada cabang baru dari beberapa masalah dengan menghapus banyak file dan memodifikasi banyak lainnya dalam proyek. Sayangnya, meskipun saya tidak melakukan perubahan apa pun pada cabang "contoh minimal" yang baru, ketika saya memeriksa kembali cabang "asli" saya, semua perubahan dan penghapusan dari cabang "contoh minimal" telah terjadi di " cabang asli "juga (atau begitulah tampaknya). Berdasarkangit status file yang dihapus hanya hilang dari kedua cabang.

Untungnya, meskipun Intellij telah memperingatkan saya "menghapus file-file ini mungkin tidak sepenuhnya dapat dipulihkan", saya dapat mengembalikannya (pada contoh cabang minimal tempat mereka sebenarnya dihapus) dengan mengklik kanan pada proyek dan memilih Sejarah Lokal > Tampilkan Riwayat (dan kemudian Kembalikan pada item riwayat terbaru yang saya inginkan). Setelah Intellij memulihkan file di cabang "contoh minimal", saya mendorong cabang ke asal. Kemudian saya beralih kembali ke cabang lokal "asli" dan berlari git pull origin minimalExampleuntuk mendapatkannya kembali di cabang "asli" juga.

genSummons
sumber