git silme işleminden sonra hiçbir işlem yapılmayan silinen dosyayı kurtar


812

Bazı dosyaları sildim.

Henüz taahhüt etmedim.

Dosyaları kurtarmak için çalışma alanımı sıfırlamak istiyorum.

Ben yaptım git checkout ..

Ancak silinen dosyalar hala eksik.

Ve git statusgösterir:

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

Neden git checkout .çalışma alanını sıfırlamıyor HEAD?


16
Silme işleminden sonra değişikliklerinizi git checkout .yapmamış olsaydınız, iyi çalışırdı.
faizal

10
@faizal ve bunu yaparsanız değişikliklerinizi kaybedersiniz.
Vasiliy Yorkin

1
Silinmiş öğedeki git gui'deki Ctrl-J tuşlarına basmanız yeterlidir.
ajeh

git checkout - cc.properties mağazası / README mağazası / cc.properties
Vinod Pasi

Şu yanıta bakın: quora.com/…
live-love

Yanıtlar:


787

Çıktı size ne yapmanız gerektiğini söyler. git reset HEAD cc.propertiesvb.

Bu işlem rm işlemini bozacaktır. Bundan sonra, git statustekrar çalıştırmak git checkout -- cc.propertiesdosyayı geri almak için bir yapmanız gerektiğini söyleyecektir .

Güncelleme: Bunu yapılandırma dosyamda var

$ git config alias.unstage
reset HEAD

ki bu genellikle öğütleri bozmak için kullanıyorum.


5
Birden fazla silinen dosya için bunu nasıl yaparsınız? Git reset HEAD <<filename>> çalıştırmak birden çok kez hantal olur, bunu yapmanın etkili bir yolu var mı?
SubSul

70
git reset HEAD \*ve sonragit checkout -- .
Noufal İbrahim

3
ama dosyaları değiştirdim.
Jiang YD

@RauliRajande Durumunuzun orijinal soruda açıklanan durumdan farklı olması muhtemeldir.
Noufal Ibrahim

1
rm -r ./engines- ayy. Şimdi git reset engines; git checkout engines.
Kris

209

Silme işlemini sahnelediniz ve yapmanız gerekenler:

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

git checkout . yalnızca silme işleminin önceden sahnelendiği dizinden kontrol edilir.


177

Sadece yap git checkout path/to/file-I-want-to-bring-back.txt


8
yalnızca dosyalar engellenmiş ve aktarılmışsa çalışır.
mahen3d

23
Benim için çalışmadı, git dosya izlenmesine rağmen, bu adla herhangi bir dosya bilmediğini söyledi. Ben de taahhüt etmedim, sadece netbeans'ın bağlam menüsünü yanlışlıkla kullanarak bir dosyayı sildim.
Zelphir Kaltstahl

4
Ziletir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov

@ user3479125 Sanırım dosyanız hiçbir zaman işleme konmadı. Bu konuda ne git statusdiyor?
ki92

12
Git durumu yeşil "delated file.ext" dosyasının git checkout HEAD -- file.extgeri yüklenmesine yardımcı olduğunu gösterdi .
Ivan Borshchov

143

Her bir yolu belirtmeden tüm etiketsiz silme işlemlerini bir kerede, otomatik olarak kurtarmak için :

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

Tüm aşamalı silme işlemlerini, her bir yolu belirtmeden otomatik olarak bir kerede kurtarmak için :

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --

12
Yanlışlıkla 500'den fazla dosyayı sildim ve tüm geçerli değişiklikleri (ilk satır kullandığım) tuttuğu için bu bir tedavi yaptı. Teşekkürler.
Guy Lowe

1
Başarılı bir derlemeden hemen sonra bir depodaki tüm içeriği yanlışlıkla sildi. İlk komut pastırmamı kurtardı.
MonaLisaOverdrive

2
Bu benim için işe yaramadan önce kaçmam gerekiyordu git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn

1
Çok yararlı, izlenmemiş dosyaları tutmak istedim ama silinmiş ve değiştirilmiş kurtulmak istedim, sadece değiştirilmiş -d değiştirmek için -d değiştirildi.
RaisinBranCrunch

5
Dosya adlarınız / yollarınızda boşluk varsa bunun işe yaramadığını unutmayın. Bence git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --işe yarayacak.
parsley72

79

Bir yaptığınız için git checkout ., şubenizi son taahhüt durumuna geri yüklemeye çalıştığınız anlaşılıyor.

Bunu bir git reset HEAD --hard

Uyarı

Bunu yapmak, en son değişikliklerinizin tümünü kaldırabilir ve değişikliklerinizi bozabilir, örneğin, işinizi kaybedebilirsiniz. İstediğiniz şey olabilir , ancak emin olmak için dokümanlara göz atın .


39
Woww !! Bu dikkatli !!!! Haklı olabilirsiniz, ancak birisi şaşkın olabilir ve tüm kodunu patlatabilir. Daha büyük bir uyarı eklerseniz iyi olur.
santiagobasulto

3
Tam da ihtiyacım olan şey bu. Tüm kodunuzu patlatmaz - sadece en son taahhüdünüzü geri getirir.
Andrew Hendrie

2
Bir noktada yüzlerce kayıp dosya buldum. Sorunu çözmenin tek pratik yolu budur. Teşekkürler!
Jonathan Benn

66

kullandıysan

git rm filename

bir dosyayı silmek için

git checkout path/to/filename

çalışmıyor, bu durumda

git checkout HEAD^ path/to/filename

çalışmalı


2
Bu cevabı beğendim. Şüphesiz, yalnızca kaldırdığınız dosyayı etkilediğinizden emin olabilirsiniz. 1) git çıkış yolu / / / dosyaadı 2) git çıkış - yolu / / / dosyaadı
Dağın

Mükemmel. git checkout HEAD^ path/to/filenamedosyayı işlemediğim için benim için çalıştı.
Moses Ndeda

29

İşte mac'umda bana yardımcı olan komut. Diğer çözümlerden birkaçını denedim ama benim için çalışmadılar.

OSX Mavericks'teki Git sürümü

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

komuta

git checkout HEAD -- path/to/file/file.cc



17

Tüm dosyaları bir kerede geri yüklemek istiyorsanız

Dönemi kullanmayı unutmayın çünkü git'e tüm dosyaları almasını söyler.

Bu komut kafayı sıfırlar ve tüm değişikliklerden çıkarır:

$ git reset HEAD . 

Sonra tüm dosyaları geri yüklemek için bunu çalıştırın:

$ git checkout .

Sonra git durumunu yaptığınızda şunları elde edersiniz:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Bu en basit çözümdür ve bir grup dosya için çalışır (birden fazla dosya / klasörü sildiğinizi varsayalım). iyi iş dostum +
Gkiokan

9

Gördüğünüz istiyor olabilir musunuz bu

kullandığınız durumlar için geçerli

git checkout -- .

bir şey yapmadan önce.

Ayrıca henüz oluşturulmamış oluşturulan dosyalardan kurtulmak isteyebilirsiniz. Ve sen onları istemiyorsun. İle :

git reset -- .

Kopyaladığınız yanıtı tam olarak bildirmediniz. Aslında git checkout -- .silinen dosyaları kurtarmak için yardımcı ve asker çalıştığınız şeyi eşdeğerdir değildir: git checkout .. Teneke işleri kopyalamak vermedi biridir kısmı: git checkout <file_path>.
Jean Paul

6

Bu yayını, başka birinin dalından birleştirme işleminden sonra çalışma dizinimde silinen bir dosyanın silinmesinin nasıl kaldırılacağıyla ilgili cevapları ararken buldum. Birleşmeden sonra henüz bir taahhütte bulunulmadı. Devam eden bir birleştirme olduğundan, sadece kullanarak geri ekleyemedim:

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

Dosyayı geri getirmek için sıfırlamaya ek olarak başka bir adım yapmak zorunda kaldım:

$ git checkout -- file.cpp

4

Herhangi bir değişiklik yapmadıysanız, yapmanız gereken tek şey bu değişiklikleri saklamaktır ve son çalışma taahhüdüne geri dönersiniz.

git stash
git stash clear
git clean 

Zımba yığınına koymak bir çözüm değildir. Bu bir hack.
Robert Dolca

2
Thisc güzel bir çözümdür çünkü saklamak için kullanabilirsiniz. Eğer bir kesmek ya da değil, bu tat meselesi. Stash'ın tüm fikri zeki bir hack'tir.
Eino Mäkitalo

@ EinoMäkitalo size yardımcı olabileceğine sevindim :)
Rick

Listelenenlerin en iyisi bu yaklaşımı seviyorum
ckapilla

3

silinmiş bir dizin arıyorsanız.

 git checkout ./pathToDir/*

3

İşte başkalarına yardım etmek için farklı durumlar:

Silme varsa işlendiği değil , aşağıda komut çalışma ağaçta silinen dosyayı geri yükleyecektir.

$ git checkout -- <file>

Aşağıdaki komutu kullanarak çalışma ağacındaki tüm silinen dosyaların bir listesini alabilirsiniz .

$ git ls-files --deleted

Silme işlemi tamamlandıysa , bulunduğu yeri bulun, sonra dosyayı bu işlemden kurtarın.

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

Size şöyle bir şey vermelidir c46e81aa403ecb8a0f7a323a358068345, Şimdi burada # kullanın

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

Bunun gibi bir şey: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

Kurtarılacak dosyanın yolunu arıyorsanız, aşağıdaki komut silinen tüm dosyaların bir özetini görüntüler.

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

Sadece dosya listesini görüntülemek istiyorsanız:

git log --diff-filter=D --summary | grep "delete mode"

2

Benim için işe yarayan neydi git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Örneğin git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(dosyanın içeri girmesini istediğimiz dalda yürütülür)

Bu komut yürütüldükten sonra, geri yüklenen dosya orijinal konumunda (işlenmesi gerekir)


ve / veya basitçe bir, git checkout master path/to/the/file.binböylece yapmış olabileceğiniz başka bir değişikliği kaybetmeden bu dosyayı silme işlemini geri alabilirsiniz. Not: Bu kabul edilen cevap olmalı ...
Edoardo

1

ToroiseGIT'i yüklediyseniz, üst klasör açılır menüsü için "Geri al ..." menü öğesini seçmeniz yeterlidir.


1

1. kullanarak geri almak istediğiniz belirli bir taahhüt bulun:

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

2. kullanarak taahhüt taahhüt:

    git revert <commit id> 

Şimdi yerel şubenizde tüm dosyalar


Değişikliklerinizi zaten taahhüt ettiyseniz, bu işe yarar.
canlı aşk

1

DİKKAT: önce saklamak istediğiniz her işi yapın.

Çalışma alanınızı sıfırlayabilir (ve silinen dosyaları kurtarabilirsiniz)

git checkout ./*

2
FYI ... bu komut tüm çalışma dosyalarımı sildi ve silinen dosyayı kurtarmadı ..beware
hendr1x

Bu nedenle çalışma alanınızı sıfırlamak için bu komutu kullanırsınız. Bunun açıklayıcı olacağını düşündüm.
Henrique Florêncio

1
Bu komut çalışmaz, çünkü dosya silinirse tarafından yakalanmaz ./*.
Jean Paul

@ JeanPaul belki yanlış anlıyorum ama benim çalışma alanı orijinal durumuna (silinmiş dosya şimdi mevcut) koydu.
Marc

@Marc Ancak dizinde görünür bir dosya yoksa işe yarayabilir, çünkü aksi takdirde git'e ./*gönderilmeden önce bu dosyalarla eşleşmesi için bash tarafından genişletilir.
Jean Paul

0

Aynı sorunu yaşadım, ancak yukarıdaki çözümlerin hiçbiri benim için işe yaramadı. Yaptığım şey şuydu:
- aynı ada sahip boş bir dosya oluşturmak
- bu dosyayı yerel geçmişi ile karşılaştırmak
- geçmişi boş dosyaya kopyalamak.


-1

Aynı sorunu yaşadım ve burada denediğim cevapların hiçbiri benim için çalışmadı. Intellij kullanıyorum ve git checkout -b minimalExamplebir grup dosyayı silerek ve bir grup projede değişiklik yaparak bazı sayının yeni dalında "minimal örnek" oluşturmak için yeni bir dal kontrol ettim . Ne yazık ki, yeni "minimal örnek" dalında herhangi bir değişiklik yapmadığım halde, "orijinal" dalımı tekrar kontrol ettiğimde "minimal örnek" dalındaki tüm değişiklikler ve silme işlemleri " orijinal "dalı da (ya da öyle görünüyordu). git statusSilinen dosyalara göre her iki şubeden de gitmişti.

Neyse ki, Intellij beni "bu dosyaları silmek tamamen kurtarılamayabilir" diye uyarmış olsa da, projeyi sağ tıklayıp Yerel Geçmiş'i seçerek (gerçekte silindikleri minimum örnek dalda) geri yükleyebildim > Geçmişi Göster (ve ardından istediğim en son geçmiş öğesinde Geri Yükle). Intellij "minimal örnek" dalındaki dosyaları geri yükledikten sonra, şubeyi başlangıç ​​noktasına doğru ittim. Sonra "orijinal" yerel şubeme git pull origin minimalExampledöndüm ve onları da "orijinal" şubeye geri götürdüm.

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.