Birleştirme çakışmasıyla sonuçlanan git stash pop'u geri al


519

Eski bir konu dalında olduğumu fark etmeyerek kod tabanımda değişiklikler yapmaya başladım. Onları transfer etmek için, onları saklamak ve daha sonra yeni bir şubeye uygulamak istedim. Kullandığım git stash popYeni şube oluşturmadan önce mürşide yeni değişiklikler çekilmiş olmasaydı unutmadan, bu yeni dalına iş-içinde-ilerleme değişiklikleri aktarmak için. Bu, bir sürü birleşme çatışması ve değişikliklerimin temiz bir şekilde saklanmasıyla sonuçlandı (pop kullandığımdan beri).

Yeni dalı doğru bir şekilde yeniden oluşturduktan sonra, saklamak için yaptığım değişiklikleri düzgün bir şekilde uygulamak için nasıl kurtarabilirim?

Yanıtlar:


656

Anlaşıldığı üzere Git, temiz bir şekilde uygulanmazsa bir zulası düşürmeyecek kadar akıllıdır. Aşağıdaki adımlarla istenen duruma gelebildim:

  1. Birleştirme çakışmalarını çözmek için: git reset HEAD .(sondaki noktayı not edin)
  2. Çakışan birleştirmeyi kaydetmek için (ne olur ne olmaz): git stash
  3. Master'a geri dönmek için: git checkout master
  4. En son değişiklikleri çekmek için: git fetch upstream; git merge upstream/master
  5. Yeni şubemi düzeltmek için: git checkout new-branch; git rebase master
  6. Doğru saklanmış değişiklikleri uygulamak için (şimdi yığınta 2. sırada): git stash apply stash@{1}

14
Mükemmel teşekkürler! # 6 gerçekten aradığım cevap. Bir git stash drop# 2 istenmeyen istenmeyen saklanmak kurtulmak için son adım olarak ekleyebilir .
austinmarton

1
Birleştirilmemiş yollar varsa # 2 çalışmaz, bunun yerine burada açıklanan hatayı verir: stackoverflow.com/questions/5483213/…
Étienne

5
Tamamen doğru değil - Git temiz bir şekilde uygulanamazsa, zulayı zu listesinde tutar. Şu git stash popdurumla ilgili şu belgelere bakın : "Durumun uygulanması çakışmalarla başarısız olabilir; bu durumda depo listesinden kaldırılmaz. Çakışmaları elle çözmeniz ve git stash dropdaha sonra manuel olarak aramanız gerekir." ( git-scm.com/docs/git-stash )
Carolyn Conway

4
Bu cevap ve soru yayınlanan nasıl Garip tam aynı dakikada
çağrı-me

14
@ call-me Bu insanların aslında daha sık yapması gerektiğini düşündüğüm bir şey! "Soru sor" formunun, kendi sorunuzu aynı formda yanıtlamanızı sağlayan bir onay kutusuna sahip olduğuna dikkat edin :). Bu bazen başıma gelen bir soruyu yazma aşamasındayken başıma geliyor, ancak sorunun StackOverflow için iyi olmaya ayarlanmasına çalışırken çözümü buluyorum. Bu bir süre önceydi, bu yüzden burada durumun bu olup olmadığını hatırlamıyorum, ama sanırım böyle oldu.
acjay

340

Neyse ki git stash popyok değil bir çatışma durumunda zulası değiştirin!

Yani hiçbir şey, endişelenmenize gerek yok, sadece kodunuzu temizleyin ve tekrar deneyin.

Kod tabanınızın daha önce temiz olduğunu söyleyin, şu duruma geri dönebilirsiniz: git checkout -f
Sonra unuttuğunuz şeyleri yapın, örneğin git merge missing-branch
Bundan sonra git stash poptekrar ateşleyin ve aynı çakılığa sahip olun, daha önce çakıştı.

Dikkat: Stash güvenlidir, ancak çalışma dizinindeki taahhüt edilmemiş değişiklikler değildir. Berbat olabilirler.


16
Anladığım kadarıyla basitçe temizleyip tekrar açabilirsiniz, ancak geri alamazsınız . Pop diğer taahhüt edilmeyen değişikliklerle karışırsa, manuel olarak temizlemeniz gerekir.
haridsv

Bu çok basit bir çözüm ve benim için harika çalıştı. Çoğu durumda işe yaradığını düşündüğüm, yerel olarak değişen her şeyi geri alabileceğinizi varsayar (saklamanın açılmasından önce / sonra değişiklik olmaz). Bunun bir sorun olduğunu fark etmeden önce gerçekleşen bazı ek değişiklikleri kaydetmeniz gerekiyorsa, çoğu durumda bir ödeme yapmaya zorlamadan önce bu dosyaları işleyebilmeniz gerekir.
Project707

Benim için durum böyle değildi. Ben git stash popotomatik birleştirme girişiminde bulundu, çatıştı ve tuttu denir .
Trevor Hickey

1
@TrevorHickey Bu cevabın amacı, sakatlığın bir çatışma durumunda olduğu gibi kalması, çatışma git stash popolmadan bitene kadar ihtiyaç duyduğunuz sıklıkta arayabileceğinizdi . Çatışmadan sonra, evet, çalışma dizini karmaşa içinde, ancak temizleyebilir ve git stash poptekrar arayabilirsiniz .
flori

5
Geçen zulası uygulamak geri alma için bu komut çok kullanışlıdır: git checkout -f!
Lefi Tarik

16

Buradaki talimatlar biraz karmaşıktır, bu yüzden daha basit bir şey sunacağım:

  1. git reset HEAD --hard Geçerli daldaki tüm değişiklikleri terk et

  2. ... Gerektiğinde aracılık çalışması yapın

  3. git stash pop Hazır olduğunuzda daha sonra tekrar saklayın




0

Teşekkürler benim için çalıştı :) Çok teşekkürler.

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.