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
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.)
Git bazı dosyaları değişiklikleri geri...
Dosyalar ve klasörler de dahil olmak ü...
Nasıl bir toplu iş dosyası içinde Deği...
Geri alma git reset?...
Git unstaged dosyaları bir geri ödeme ...