Yanıtlar:
Kirli bir çalışma kopyasına saklanmış değişiklikler uygulamak zorunda kaldığımda, örneğin saklamak için birden fazla changeet pop, aşağıdakileri kullanıyorum:
$ git stash show -p | git apply -3 && git stash drop
Temelde
Neden yukarıdaki tek astarlı gibi davranması gereken bir -f(kuvvet) seçeneği olmadığını merak ediyorum git stash pop.
Bu arada, bu tek astarı git takma adı olarak eklemek isteyebilirsiniz:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
@SamHasler, -3çakışmaları doğrudan 3 yönlü birleştirme yoluyla çözmeyi sağlayan parametreye işaret ettiği için .
git stash applykirli çalışan bir kopyanız varsa, saklanan değişiklikleri uygulamaz. Yani bir git stash show -p | git applyçeşit zorlanmış zulası uygularken görebilirsiniz .
error: <file> does not match indexdeğiştirilen her dosya için başarısız oldu . Ancak, başka bir çözüm işe yaradı.
Bu şekilde yaparım:
git add -A
git stash apply
ve sonra (isteğe bağlı olarak):
git reset
git add -u, -Aizlenmeyen dosyalar eklememesi dışında.
Bunu, bir yama dosyası olarak istediğiniz zulayı dışa aktararak ve manuel olarak uygulayarak mevcut değişikliklerinizi saklamak zorunda kalmadan yapabilirsiniz.
Örneğin, kirli bir ağaca stash @ {0} uygulamak istediğinizi varsayalım:
Stash @ {0} bir düzeltme eki olarak dışa aktarın:
git stash gösterisi -p stash @ {0}> Stash0.patch
Değişiklikleri manuel olarak uygulayın:
git Uygula Stash0.patch
İkinci adım başarısız olursa, herhangi bir hatayı düzeltmek için Stash0.patch dosyasını düzenlemeniz ve ardından git Apply komutunu tekrar denemeniz gerekir.
Çalışma dizininizi git reset ile temizleyin, değişiklikleri uygulayın veya mevcut değişiklikleri saklamak istiyorsanız şunları deneyin:
$ git stash save "mevcut değişikliklerin açıklaması"
$ git stash pop stash @ {1}
Bu, geçerli değişiklikleri saklayacak ve daha sonra yığın yığınından ikinci saklamayı açacaktır.
Mathias'ın çözümü kesinlikle git stash pop --force'a en yakın olanıdır (ve gerçekten Git devs, şimdi bu seçeneği alalım!)
Ancak, aynı şeyi yalnızca git komutlarını kullanarak yapmak istiyorsanız, şunları yapabilirsiniz:
Başka bir deyişle, mevcut değişikliklerinizi taahhüt edin (ki asla itmeyeceğiz). Artık çalışma alanınız temiz, zulanızı patlatın. Şimdi, daha önceki taahhüdünüzde bir değişiklik olarak saklı değişiklikleri yapın. Şimdi yaptığınız her iki değişiklik kümesini tek bir işlemde ("Fixme") birleştirdiğinizde; sadece sıfırlayın (--soft NOT --hard böylece hiçbir şey gerçekten kaybolmaz) ödeme "o taahhüt önce bir" ve şimdi tamamen taahhüt edilmemiş, her iki değişiklik kümesi var.
** DÜZENLE * *
Aslında bunun daha da kolay olduğunu fark ettim; 3. adımı tamamen atlayabilirsiniz, bu yüzden ...
(Geçerli değişiklikleri yap, saklı değişiklikleri kapat, her iki değişiklik kümesini de taahhüt edilmemiş bir durumda bir araya getirme taahhüdünü sıfırla.)
Bugün yaptığım gibi kendinizi bu durumda bulursanız, bu cevapların hiçbiri işe yaramaz. Kaç tane git reset --hardyaptığımdan bağımsız olarak , beni hiçbir yere götürmedi. Cevabım (hiçbir şekilde resmi değil):
git reflog --allMathias Leppich'in harika çalışma çözümünü de buldum, bu yüzden global .gitconfig'ime bir takma ad ekledim
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Şimdi yazabilirim
git apply-stash-to-dirty-working-tree
bu benim için harika çalışıyor.
(Kilometreniz bu uzun takma ad adına göre değişebilir. Ancak bash tamamlamasıyla geldiğinde bir doz ayrıntı vermeyi seviyorum.)
Yaptığınız git adddeğişiklikleri yapmak için bir "kirli" ağaca bir zulası uygulayabilir ve böylece ağacı temizleyebilirsiniz. Sonra git stash popsaklı değişiklikleri yapabilir ve uygulayabilirsiniz, sorun değil.
Değiştirilmiş, ancak kaydedilmemiş dosyalarınız var. Ya:
git reset --hard HEAD (to bring everything back to HEAD)
veya değişikliklerinizi kaydetmek istiyorsanız:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
Bunların çoğunu çalıştıramadım; bir nedenle her zaman bir dosyada yerel değişikliklerim olduğunu düşünüyor. Zımba uygulayamam, yamalar uygulanmaz checkoutve reset --hardbaşarısız olur. Sonunda işe yarayan, saklamayı bir şube olarak kaydetmek git stash branch tempbranchnameve daha sonra normal bir şube birleştirmesi yapmaktı: git checkout masterve git merge tempbranchname. Http://git-scm.com/book/en/Git-Tools-Stashing adresinden :
Depolanmış değişiklikleri tekrar test etmenin daha kolay bir yolunu istiyorsanız, sizin için yeni bir dal oluşturan git çalışmasını şubeyi çalıştırabilir, çalışmanızı sakladığınız sırada taahhüdünüzü kontrol edebilir, çalışmanızı orada yeniden uygulayabilir ve ardından bırakabilirsiniz. başarıyla uygulanırsa saklamak
git stash show -p | git applyFarklı mıgit stash apply?