“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.