Yanlışlıkla git stash pop geri alma


187

Karmaşık bir birleştirme yapmadan önce bazı yerel değişiklikleri sakladım, birleştirmeyi yaptım, sonra çalıştırmadan önce aptalca yapmayı unuttum git stash pop. Pop, izlemesi zor olan bazı problemler (büyük bir kod tabanında kötü yöntem çağrıları) yarattı. Koştum git stash show, en azından hangi dosyaların değiştirildiğini biliyorum. Başka bir şey yoksa, sanırım bu daha fazlasını yapmak için bir ders.

Benim sorum: birleştirme de geri almadan stash pop geri almak mümkün mü?


2
Önce git stash poptaahhütte bulunmanıza izin verilmiyor . Bunu başarmak için ne yaptınız?
Chris Jester-Young

Dürüst olmak gerekirse emin değilim (bu dün). Birleşme kendi başına işlemedi çünkü çatışmalar vardı. Bundan sonra stash pop'u bir şekilde çalıştırabildim.
nren

1
Bunu sadece git sürüm 1.7.9.msysgit.0 kullanarak biliyorum yaptım. Dengesiz dosyalarım vardı ve saklı pop sadece her şeyi birleştirdi.
PandaWood

git stash pop2.25.0.windows.1 git
Artem Hevorhian

Eğer varsa endeksli değişiklikleri ve koşarken onları kaybettim stash pop/applybir taahhüt vermeden önce, sen kovabilir git fsck --lost-found. Bu komut (dolayısıyla sarkan) sahnelenen ama kararlı yerde olduğu (git terminolojisine aşina olmayanlar için gerçek dosyaları) sarkan lekeler arasında yineleme ve altına koyacağız .git / / kayıp-bulundu dizini yapabileceğiniz git showonları ve gör bunlar aradığınız dosyalarsa.
Artem Hevorhian

Yanıtlar:


69

Kullanmayı deneyin Git bir düştü zulası kurtarmak için nasıl? attığın zulayı bulmak için. Ben bir zulası için her zaman iki taahhüt olduğunu düşünüyorum, çünkü dizin ve çalışma kopyasını korur (genellikle dizin taahhüdü boş olacaktır). Sonra git showfark görmek ve patch -Ronları uygulamak için kullanın .


6
Vay canına, bu işe yaradı. Ben git fsck --no-reflog | awk '/dangling commit/ {print $3}'(bağlantıdan) stash taahhütleri bulabildim ve ben sadece bu fark bu sorun bulundu. Teşekkürler!
nren

1
fsck büyük bir liste çıkarır. Gitmek her zamanki SHA1'i göstermek sıkıcı. Bunu nasıl yapıyorsun ?
meson10

5
@ meson10: Ne yazık ki, saklananlar, patlamış sakızların tarihine bakmak için (gerçek bir dal olsaydı) bariz bir şekilde bir reflogda tutulur. Ayrıca bir downvote + yardım talebinin en iyi strateji olmadığını öne sürmeme izin verin.
Ben Jackson

2
Bunu düzeltmek biraz karışıklık gerektiriyordu. İşte çalışmalarımın sonucu git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1:; Ben git showönerildiği gibi denedim ama çıktı yama için iyi değildi; Ayrıca ben sağlamak zorunda -p1şerit için yama seçeneği a/..ve b/..o öğeyi git diffdosyalarının önünde koyar aksi takdirde depo kökünden yolları çözmek olmaz. ÖNERİ: dikkatli olun ve yama ile oynamadan önce dağınıklığı ayrı bir dalda tutun.
basilikode

@BenJackson Cevabınızda "her zaman" her ikisi de anlamına gelir stash popve stash pushdizin ve çalışma dizinindeki değişiklikleri kaydedecek bir taahhüdü tetikler, değil mi?
Artem Hevorhian

36

itibaren git stash --help

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP

Bu bana aynı senaryoda kabul edilen cevaptan daha iyi yardımcı oldu.


13
"WIP" aramasını içeren birçok çözümün varsayılan saklama mesajlarına dayandığını unutmayın. Zarflarınıza açık mesajlar verirseniz, WIP içermeyebilirler.
Ben Jackson

Teşekkürler. Okunabilirliği artırmak için --oneline seçeneğini günlük komutuna ekledim.
basslo

Bu, yalnızca saklanma taahhüdünün SHA'sını bulmanıza yardımcı olur. Ancak kabul edilen cevaptan @basilikode yorumu ile entegre edilmişse (git diff SHA ~ 1 SHA | patch -R), iyi çalışır. Kontrol etmek için önce --ry-run yolunu kullanmanızı öneririm.
Jarek C

3

Birleştirme işleminiz çok karmaşık olmasaydı başka bir seçenek olurdu:

  1. Birleştirme değişiklikleri dahil tüm değişiklikleri "git stash" kullanarak tekrar stash'a taşıyın
  2. Birleştirmeyi yeniden çalıştırın ve değişikliklerinizi yapın (bırakılan saklanan değişiklik olmadan)
  3. Dosyalar artık aynı olduğundan, önceki birleştirme işleminizdeki tüm değişiklikleri yoksayması gereken bir "git stash pop" komutunu çalıştırın.

Bundan sonra, sadece erken bıraktığınız saklanan değişikliklerle kalırsınız.

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.