“Git rm -r” nasıl geri alınır?


378

Yanlışlıkla dedim git rm -r .. Bundan nasıl kurtulurum?

Ben taahhüt etmedim.

Tüm dosyaların silinmek üzere işaretlendiğini ve yerel ödememden fiziksel olarak kaldırıldığını düşünüyorum.

EDIT: Ben (komutu biliyor olsaydım) son taahhüt geri dönebilir. Ama geri alabilirsem çok daha iyi olurdu git rm -r .. Çünkü son işlemden sonra ve işten önce ne yaptığımdan emin değilim git rm -r ..


3
Bu özel soru için, reset --hard iyi bir çözümdür ... zaten listelenmiştir, bu yüzden sadece bu yorumda git-reflog belgelerini kontrol etmek isteyebileceğinizden bahsedeceğim.
— William Pursell

8
Not arz etmedi çünkü o -fkadar git rmGit bir nedenle sahnelenen veya unstaged değişiklikler olmuştu herhangi bir dosya kaldırmış olmayacak git reset; git checkout .şeyi kurtarmak gerekir.
— CB Bailey

Sadece dikkat edin - git checkout. işaretlenmemiş tüm değişiklikleri silecektir.
— PeterB

1
Sadece böyle bir şey yaptım ve yerel dosyalarımın neden silindiğini anlamıyorum (ve OP gibi henüz
— işlemedim

Git 2.23+ (Ağustos 2019) ile, birlikte dosyaları geri istiyorum git restore: git restore -s@ -SW -- .. Bkz aşağıda Cevabımı .
— VonC

Yanıtlar:


468
git reset HEAD

Yapmalı. Önem verdiğiniz herhangi bir taahhüt edilmemiş değişikliğiniz yoksa,

git reset --hard HEAD

her şeyi zorla son taahhüdüne sıfırlamalısın. Taahhüt edilmemiş değişiklikleriniz varsa, ancak ilk komut çalışmazsa, taranmamış değişikliklerinizi aşağıdakilerle kaydedin git stash:

git stash
git reset --hard HEAD
git stash pop

22
git reset --hard HEADGeçerli çalışma dizininin üst dizinlerinde yaptığınız tüm faydalı değişiklikleri yok ettiğine dikkat edin.
— Alex Brown

10
@Mild: Hala soğuk bir ter giyiyorum!
— hoipolloi

6
Ben oy vermedim, ama sadece saklamak denedim, sert sıfırlama, pop ve son değişiklikleri tüm kaybetti. Belki de cevabı yanlış okudum.
— Greg M. Krsak

1
Bu nadiren benim için çalışıyor ve bir Dropbox klasöründe çalıştığım için çok mutluyum. Kötü form, ama beni her zaman kurtarıyor ...
— Nuby

3
Git stash pop yaptığımda, sadece dosyaları tekrar kaldırdım, elbette çünkü ben (yanlışlıkla) bazı dosyaları kaldırdığımı saklıyor. Saklamak istediğiniz değişmemiş değişiklikleriniz varsa bu cevap işe yaramaz.
— sudo

252

Birkaç dosyaya git-rm'd ve bir sonraki işlemimden önce değişiklik yapmaya devam ettim ve dosyalardan bazılarına ihtiyacım olduğunu fark ettim. İstif ve sıfırlama yerine, kaçırdığınız / çıkardığınız dosyaları tek tek kontrol edebilirsiniz:

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

Bu, diğer taahhüt edilmemiş değişikliklerinizi hiçbir geçici çözüm olmadan sağlam bırakır.


6
Bu, başka taahhüt edilmemiş değişikliklerim olduğu için yardımcı oldu.
— Dan

4
Bu cevap, bu soruyu tökezleyenlere, git rmtüm özyinelemeden ziyade tek bir şeyi geri döndürmek isteyenlere yardımcı olur git rm -r. Tam bir özyinelemeli silme için, kaldırılan dosya miktarına bağlı olarak diğer çözümler daha iyi olabilir.
— tresf

Sen, benim adamım, bir ödülü hak ediyorsun.
— Salamit

Eğer yapabilirsem 100.times tıklayın!
— Wagner Braga

57

Bazı dosya veya klasörleri yeniden kazanmak için aşağıdakiler kullanılabilir

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

Bu, ilk olarak dizin girişlerini path/to/fileyeniden oluşturur ve dosyayı son işlemde olduğu gibi yeniden oluşturur HEAD.

İpucu: eski bir komuttan dosyaları yeniden oluşturmak için her iki komuta da bir karma karması iletilebilir. Ayrıntılar için git reset --helpve bölümüne bakın git checkout --help.


En iyi cevap. git rmDiğer işlem görmemiş değişiklikleri silmeden tek bir operasyonun kolay cerrahi 'geri alınması' .
— wberry

Bana yardım etti! en iyi cevap.
— Akram

28

Güncelleme:

Yana git rm .çalışan çıkış yanı sıra endekste bu siler tüm dosyaları ve alt dizinleri, bu değişikliklerin her geri almak gerekir:

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

Bu istediğinizi yapmalı. Teslim alma kodunuzun veya dizininizin üst klasörlerini etkilemez.


Eski olmayan cevap:

reset HEAD

hile yapar ve dosyalarınızda yaptığınız herhangi bir taahhüt edilmemiş değişikliği silmez .

bundan sonra git addkuyruğa aldığınız komutları tekrarlamanız gerekir .


1
üzgünüm, her zaman kurulum git alias.co="checkout"böylece git coödeme yapar.
— Alex Brown

25

Yukarıdaki çalışmaların hiçbiriyle sonuçlanmazsanız, buradan gelen öneriyi kullanarak veri alabilirsiniz: http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

4 yıl sonra, hala bir cankurtaran!
— ThievingSix

Sonuçları birleştirmek için bir c ++ programı yazdım (repoumda sarkan 100 tane nesne vardı, bunu gerekli kılıyor). Sadece derleyin ve çalıştırın, sonra git repo yerel dizini geçmek. raw.githubusercontent.com/bluuman/git-recover-files/master/…
— James Meas

15

git rm'yi geri al

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

geri al rm -r

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

geri al git rm -rf

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

Uncommitted changesiçerir not staged changes, staged changes but not committed.


Elbette, hiçbir şey geri alınamaz git rm -rf, çünkü izlenmemiş veya aşamalı (yalnızca) dosyaları da silebilir.
— jpaugh

git rm -rf fileve git rm -rf dirizlenmeyen dosyaları silmez.
— şarkı xu

10

Değişiklikleri taahhüt edip ittiyseniz, dosyayı geri almak için bunu yapabilirsiniz

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file

Bu, hala gerekli olan eski bir git-kiraz seçiminden bir dosyanın silindiği 'Taahhüt edilecek değişiklikler:' için çalıştı. Git sıfır HEAD ~ <sayı> <file> çalışmamıştı.
— mushcraft

7

Zaten bazı iyi cevaplar var, ama sadece harika çalışmayan, aynı zamanda ne istediğinizde çok açık olan az kullanılan bir sözdizimi önerebilirim (bunun için korkutucu veya gizemli değil)

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

3

Liste taahhüdünü al

git log  --oneline

Örneğin, Kararlı taahhüt karma: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master

1

Aynı bir durum yaşadım. Benim durumumda çözüm şuydu:

git checkout -- .


-1

Tam olarak aynı sorun vardı: Klasörlerimi temizliyorum, dosyaları yeniden düzenleyip taşıyordum. Girdim: git rm . ve enter tuşuna basın; ve sonra bağırsaklarımın biraz gevşediğini hissettim. Neyse ki hemen git -m "" yazmadım.

Ancak, aşağıdaki komut

git checkout .

her şeyi restore etti ve hayatımı kurtardı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.