Git deposunda silinmiş bir klasörü geri yükleme


101

Bir klasörün içindeki tüm içeriği sildim ve klasör boş. Uzak depomda hala bir kopyam var. Ama yaptığımda git pull, silinen dosyaları geri koymadı, bunu yapması gerekmiyor mu?

Bu yüzden biraz araştırma yaptım ve şunu yaparak bir dosyayı geri döndürebileceğinizi gördüm: git checkout <revision> -- <name of file>

Ancak bu yalnızca dosyalarda işe yarar.

Dizinin içindeki tüm dosyaları nasıl geri alabilirim?


1
git statushangi komutların çalıştırılacağı konusunda size bir ipucu verecek
Tavian Barnes

1
Uzak deponuzda hala eski dizine sahip olduğunuza benziyor (ve hatta yerel deponuzda da olabilir). GÜÇLÜ ÖNERİ: 1) Uzak deponuzdan YENİ bir depoya "çek" yapın (yerel deponuza daha fazla zarar vermeyin). 2) Yeni, yerel deponuzda "ödeme" yi veya hatta "geri dönmeyi " deneyin: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Her şeyin yolunda olduğundan emin olduğunuzda uzak depoyu güncelleyin.
paulsm4

Yanıtlar:


258

Bir dosyayla yapabileceğiniz her şeyi, bir klasörle de yapabilirsiniz.

Ayrıca Git deposundaki silinmiş bir dosyayı bulma ve geri yükleme


Dosyalar çalışma ağacından silinir ancak henüz kaydedilmemiştir:

Henüz git adddeğişikliklerinizi indekslemediyseniz ( ), bir dizinin içeriğini geri alabilirsiniz:

git checkout -- path/to/folder

Silme zaten dizine eklenmişse, önce onu sıfırlamalısınız:

git reset -- path/to/folder
git checkout -- path/to/folder


Tam çalışma ağacını geri yükleyin (tek bir klasör değil), ancak tüm yapılmamış değişiklikleri kaybedin

git reset --hard HEAD


Geçmişte bazı işlemelerde dosyalar silindiğinde:

Verilen yolu etkileyen son kaydı bulun. Dosya HEAD kaydetmede olmadığından, bu kaydetme onu silmiş olmalıdır.

git rev-list -n 1 HEAD -- <file_path>

Ardından, düzeltme işaretini ( ^) kullanarak kaydetmede sürümü teslim alın :

git checkout <deleting_commit>^ -- <file_path>


Tam çalışma ağacını uzak bir işlemden geri yükleyin

git reset --hard <revision> 

1
git checkout -- path/to/folder/* çalışmıyor Not: soru, bir dosya değil bir klasörün nasıl geri
yükleneceğidir

@gman How can I retrieve all the files inside the directoryhem dizin hem de dosyaları anlamına gelir. Ama bu komut şaşırtıcı bir şekilde benim için de çalışmıyor. Bir yıl önce olduğunu hatırlıyorum.
Nick Volynkin

2
@gman ancak git checkout -- pathveya gibi çalışır git checkout -- 'path/*'. Örnekte sizinle silmek git rmhangi OP yapmak görünmüyordu. Böyle bir durum için talimatlar ekledim. Teşekkürler!
Nick Volynkin

3
Windows'ta şu şekilde alıntı yapmanız gerekir:git checkout "<deleting_commit>^" -- <file_path>
Maor

Sıfırlama komutunda bir klasör belirlememe rağmen, tüm depodaki bir sürü şeyi aşamalandırdı. Bu nasıl mantıklı? Ödemeyi çalıştırdığımda klasörümü geri yükledi gibi görünüyor. Unstage'ın kodumun geri kalanına ne yaptığına dair hiçbir fikrim yok, ah, merkezileştirilmiş depolar için kullanılan bir eşler arası depo yöneticisinin eğlenceleri, ah.
Paul Kenjora

5

Değişikliklerinizi henüz uygulamadıysanız, içeriği veya bir dizini geri alabilirsiniz:

git checkout -- removed_directory

Tüm değişiklikleri geri almak istiyorsanız şunları yapın:

git reset --hard HEAD

3
git checkout -- removed_directory çalışmıyor
gman

git checkout -- removed_directorybenim için çalıştı, ancak bu dizini daha önce oluşturdum (bu dizindeki checkoutdosyalardan biri tarafından ). Oluşturulduktan sonra tüm dosyalar bu komutla klasöre geri yüklendi.
Boolean_Type

5

Git restore ile dosyaları veya klasörü geri yükleyebilirsiniz.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Burada ana ~ 1 , klasörünüzü ana şubenizden "1" revizyonuna geri döndürür.

Kaynak: https://git-scm.com/docs/git-restore


4

Benim için çalışan tek şey, depoyu başka bir klasörde kontrol etmekti. Mevcut reponun içinde olduğunu varsayalım /home/me/current.

Sonra yaptım

git clone /home/me/current /home/me/temp

Bu, deponun ayrı bir klonunu oluşturur. /home/me/temp

Artık gidip /home/me/tempistediğimi yapabilirim. Örneğin

git reset --hard commit-hash-before-delete

Şimdi silinen dosya klasörünü geri kopyalayabilirim

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

Ve geçici klasörü sil

rm -rf /home/me/temp

Örnekleri

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

ÇALIŞMA

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

Gibi diğer örnekler

git reset --hard HEAD

sadece silinen dosyaların ötesinde yıkıcıdır. Diğer tüm değişiklikler de kaybolacaktır.

benzer şekilde

git reset --hard some-commit

sonrasındaki herhangi bir kaydı kaybedecek some-commit


2

Git 2.24.0'dan itibaren, deneysel bir yeni git komutu var: git restore

git restore --staged some/deleted/folder

Bana git gösteriyor: 'geri yükle' bir git komutu değil
Ahmed C

0

Belirli bir dosya belirtmezseniz, belirli bir kaydetmenin tüm içeriğini çekebilmeniz gerekir. Gibi: git checkout 264794319e9695ba843cd6(karmanın tüm dosyalarınızın doğru durumda olduğunu varsayarsak).

pullDosyaları geri yüklemememesinin nedeni , git'in silme işlemlerinizi daha yeni bir değişiklik olarak görmesi ve bunu çektiğiniz her şeyin üzerine uygulamasıdır.

(Yeni bir dalda deneme yapmanızı tavsiye ederim.)


0

Yalnızca silinmiş bir klasörü kurtarmak istiyorsanız ve silme işleminden sonra başka işlemleriniz varsa, projenize github.com adresinden de gidebilirsiniz.

Github.com'dan, klasörünüzün bulunduğu son işleminize gidin. Kaydetme mesajını görmelisiniz ve sağda "Dosyalara Gözat" etiketli bir düğme var. Buna tıklamak sizi işlemenin o aşamasındaki tüm dosyalara götürür.

Oradan kodu klonlayabilir veya kodu zip olarak indirebilirsiniz.


-1

beklenmeyen silme işlemleri için, Bu kadar basit:

git reset HEAD rel / yol / / silindi / dizin / *

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.