SORU
10 EYLÜL 2011, CUMARTESİ


Geri reset --hard salonda kaydedilmemiş dosyaları ile git

İşimi kurtarmak için çalışıyorum. Ben aptalca tek yaptığım git reset --hard ama önce get add . mi git commit yapmadı. Yardım lütfen! İşte benim günlük:

MacBookPro:api user$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)

#   modified:   .gitignore
...


MacBookPro:api user$ git reset --hard
HEAD is now at ff546fa added new strucuture for api

Bu durumda git reset --hard geri almak mümkün mü?

CEVAP
11 EYLÜL 2011, Pazar


Endeksi (e.eklediğiniz tüm dosyaları geri kurtarmak gerekir iş biraz olabilir, ancak g, durumu, git add .) gibi. Dizine bir dosya eklemek için, git çöp toplama henüz yaşamadığın sürece kurtarılamaz anlamına gelen nesne veritabanına ekler. Bunu yapmak için nasıl bir örnek Jakub Narębski's answer burada verilen var:

Ancak, denediğim bir test deposu ve orada bir kaç sorunlar --cached --cache ve bulduğum olmadı aslında oluştur .git/lost-found dizin. Ancak, aşağıdaki adımları benim için çalıştı:

git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")

Bu reflog üzerinden herhangi bir hakem tarafından erişilebilir olmayan nesne veritabanı, dizin veya tüm nesneler çıktı. Çıkış bu gibi bir şey olacaktır

unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03

... ve bu lekeler her biri için, bunu yapabilirsiniz:

git show 907b308

Çıktı dosyasının içeriğini.


Çok fazla çıktı?

seheyanıt olarak güncelle'yorum aşağıda:

Eğer taahhüt ve ağaçlar bu komut çıktısı listelenen tane bulursanız, başvurulmayan, başvurulan nesneleri tamamlar çıktısı kaldırmak isteyebilirsiniz. (Bu geri dönebilirsin genellikle reflog) neyse kaydeder - sadece dizin için eklenmiş ama hiç bir tamamlama yoluyla bulunabilir nesneleri ilgileniyoruz.)

İlk olarak, komut çıktısı ile kaydedin:

git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all

Şimdi o ulaşılamaz iptalleri nesne isimleri ile bulunabilir:

egrep commit all | cut -d ' ' -f 3

Sadece dizini değil, herhangi bir noktada kararlı, eklenen ağaçlar ve nesneleri bulmak:

git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
  $(egrep commit all | cut -d ' ' -f 3)

Bu son derece dikkate almak gerekir nesnelerin sayısını azaltır.


Güncelleme:Philip Oakley aşağıda sadece .git/objects altında en son değiştirilen dosyaları göz önünde olan, göz önünde nesneler, sayısını aşağı kesim başka bir yol öneriyor. Bunlar: bulabilirsiniz

find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort

(find*. *35) çağırma bulundu Bu listenin sonu gibi görünebilir:

2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a

Bu nesneleri görebilirsiniz

git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a

(Nesnenin adını almak için yolun sonunda / kaldırmak zorunda olduğunu unutmayın.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • HowcastTechGadgets

    HowcastTechG

    22 EYLÜL 2010
  • TheScorpioTechno

    TheScorpioTe

    15 Aralık 2010