Bagaimana cara mengembalikan "git rm -r."?

378

Saya tidak sengaja berkata git rm -r .. Bagaimana saya pulih dari ini?

Saya tidak berkomitmen.

Saya pikir semua file ditandai untuk dihapus dan juga dihapus secara fisik dari checkout lokal saya.

EDIT: Saya bisa (jika saya tahu perintah) kembali ke komit terakhir. Tetapi akan jauh lebih baik jika saya bisa membatalkannya git rm -r .. Karena saya tidak begitu yakin apa yang saya lakukan setelah komit terakhir dan sebelum git rm -r ..

pengguna89021
sumber
3
Untuk pertanyaan khusus ini, reset --hard adalah solusi yang bagus ... sudah terdaftar jadi saya hanya akan menyebutkan dalam komentar ini bahwa Anda mungkin ingin memeriksa dokumentasi untuk git-reflog.
William Pursell
8
Perhatikan bahwa karena Anda tidak menyediakan -funtuk git rmgit tidak akan menghapus file apa pun yang telah melakukan perubahan stage atau unstaged sehingga git reset; git checkout .harus memulihkan semuanya.
CB Bailey
Hanya waspada - checkout git. akan menghapus semua perubahan yang tidak dipentaskan.
PeterB
1
Saya baru saja melakukan sesuatu seperti ini, dan saya tidak mengerti mengapa file lokal saya dihapus (dan, seperti OP, saya belum berkomitmen.)
Xonatron
Dengan Git 2.23+ (Agustus 2019), Anda akan mengembalikan file dengan git restore: git restore -s@ -SW -- .. Lihat jawaban saya di bawah ini .
VonC

Jawaban:

468
git reset HEAD

Harus melakukannya. Jika Anda tidak memiliki perubahan tanpa komitmen yang Anda pedulikan, maka

git reset --hard HEAD

harus secara paksa mengatur ulang semuanya ke komit terakhir Anda. Jika Anda memiliki perubahan yang tidak dikomit, tetapi perintah pertama tidak berhasil, simpan perubahan yang tidak dikomit itu dengan git stash:

git stash
git reset --hard HEAD
git stash pop
Brian Campbell
sumber
22
Perhatikan bahwa git reset --hard HEADhancurkan setiap perubahan yang berguna yang telah Anda buat di direktori induk dari direktori kerja saat ini.
Alex Brown
10
@Mild: Saya masih berkeringat dingin!
hoipolloi
6
Saya tidak memilih, tetapi saya hanya mencoba menyimpan, mengatur ulang dengan keras, muncul dan kehilangan semua perubahan saya baru-baru ini. Mungkin saya salah membaca jawabannya.
Greg M. Krsak
1
Ini jarang bekerja untuk saya, dan saya senang saya bekerja di folder Dropbox. Bentuk yang buruk, tetapi menyelamatkan saya setiap kali ...
Nuby
3
Ketika saya melakukan git simpanan pop, itu hanya menghapus file lagi, tentu saja karena menyembunyikan fakta bahwa saya (tidak sengaja) menghapus beberapa file. Jawaban ini tidak berfungsi jika Anda memiliki perubahan tanpa komitmen yang ingin Anda pertahankan.
sudo
252

Saya git-rm beberapa file dan terus melakukan perubahan sebelum komit berikutnya ketika saya menyadari saya perlu beberapa file kembali. Daripada menyimpan dan mengatur ulang, Anda dapat checkout file-file individual yang Anda lewatkan / hapus jika Anda mau:

git checkout HEAD path/to/file path/to/another_file

Ini membuat perubahan Anda yang tidak dikomit lainnya tetap utuh tanpa penyelesaian.

Jaime Bellmyer
sumber
6
Ini membantu karena saya memiliki perubahan lain yang tidak dikomit.
Dan
4
Jawaban ini membantu bagi kita yang menemukan pertanyaan ini yang ingin mengembalikan satu git rmdaripada seluruh rekursif git rm -r. Untuk penghapusan rekursif penuh, solusi lain mungkin lebih baik, tergantung pada jumlah file yang dihapus.
tresf
Anda, sobat, pantas mendapatkan penghargaan.
Salamit
Jika aku bisa, aku akan mengkliknya 100 kali!
Wagner Braga
57

Untuk mendapatkan kembali beberapa file atau folder, Anda dapat menggunakan yang berikut ini

git reset -- path/to/file
git checkout -- path/to/file

Ini pertama akan membuat ulang entri indeks untuk path/to/filedan membuat ulang file seperti di komit terakhir, yaitu HEAD.

Petunjuk: seseorang dapat mengirimkan hash komit ke kedua perintah untuk membuat ulang file dari komit yang lebih lama. Lihat git reset --helpdan git checkout --helpuntuk detailnya.

Arne L.
sumber
Jawaban Terbaik. 'Membatalkan' git rmoperasi tunggal yang mudah tanpa menghapus perubahan lain yang tidak dikomit.
wberry
Bantu aku! jawaban Terbaik.
Akram
28

Memperbarui:

Karena git rm .menghapus semua file dalam direktori ini dan direktori anak di checkout yang berfungsi serta dalam indeks, Anda harus membatalkan setiap perubahan ini:

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

Ini harus melakukan apa yang Anda inginkan. Itu tidak memengaruhi folder induk dari kode atau indeks Anda yang sudah keluar.


Jawaban lama yang bukan:

reset HEAD

akan melakukan triknya, dan tidak akan menghapus perubahan yang tidak dikomit yang Anda buat pada file Anda.

setelah itu Anda perlu mengulangi git addperintah yang telah Anda antri.

Alex Brown
sumber
1
maaf, saya selalu mengatur git alias.co="checkout"agar git cocheckout.
Alex Brown
25

Jika Anda berakhir dengan tidak ada yang bekerja di atas, Anda mungkin dapat mengambil data menggunakan saran dari sini: http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>
Skippy VonDrake
sumber
4 tahun kemudian, masih hidup!
ThievingSix
Saya menulis program c ++ untuk menggabungkan hasilnya (saya punya sekitar 100 objek yang menggantung di repo saya, membuat ini perlu). Cukup kompilasi dan jalankan, lalu kirimkan direktori lokal git repo Anda. raw.githubusercontent.com/bluuman/git-recover-files/master/…
James Meas
15

batalkan git rm

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD

batalkan git rm -r

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD

batalkan git rm -rf

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.

Uncommitted changestermasuk not staged changes, staged changes but not committed.

lagu xu
sumber
Tentu saja, tidak ada yang dapat diurungkan git rm -rf, karena dapat menghapus file yang tidak dilacak atau dipentaskan (hanya) juga.
jpaugh
git rm -rf filedan git rm -rf dirtidak akan menghapus file yang tidak terlacak.
Lagu xu
10

Jika Anda sudah berkomitmen dan mendorong perubahan, Anda dapat melakukan ini untuk mendapatkan file kembali

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file
Cory Danielson
sumber
Ini berfungsi untuk 'Perubahan yang harus dikomit:' di mana file dihapus dari git cherry-pick tua yang masih saya butuhkan. Saya telah mencoba git reset HEAD ~ <number> <file> yang tidak berfungsi.
Mushcraft
7

Sudah ada beberapa jawaban yang baik, tetapi saya mungkin menyarankan sintaks yang sedikit digunakan yang tidak hanya berfungsi dengan baik, tetapi sangat eksplisit dalam apa yang Anda inginkan (karenanya tidak menakutkan atau misterius)

git checkout <branch>@{"20 minutes ago"} <filename>
mehtunguh
sumber
3

Dapatkan daftar komitmen

git log  --oneline

Misalnya, komit Stabil memiliki hash: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master
Apakah Nhu Vy
sumber
1

Saya memiliki situasi yang identik. Dalam kasus saya, solusinya adalah:

git checkout -- .
Artur
sumber
0

Dengan Git 2.23+ (Agustus 2019), perintah yang tepat untuk mengembalikan file (dan indeks) adalah menggunakan ... git restore(bukan reset --hardatau perintah membingungkangit checkout )

Itu adalah:

git restore -s=HEAD --staged --worktree -- .

Atau bentuknya yang disingkat:

git restore -s@ -SW -- .
VONC
sumber
-1

Saya memiliki masalah yang sama persis: membersihkan folder saya, mengatur ulang dan memindahkan file. Saya masuk: git rm . dan tekan enter; dan kemudian merasakan perutku sedikit mengendur. Untungnya, saya tidak mengetik git commit -m "" langsung.

Namun, perintah berikut

git checkout .

memulihkan segalanya, dan menyelamatkan hidupku.

Wai-Ming Lee
sumber