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 apply
kirli ç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 index
değ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
, -A
izlenmeyen 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 --hard
yaptığımdan bağımsız olarak , beni hiçbir yere götürmedi. Cevabım (hiçbir şekilde resmi değil):
git reflog --all
Mathias 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 add
değişiklikleri yapmak için bir "kirli" ağaca bir zulası uygulayabilir ve böylece ağacı temizleyebilirsiniz. Sonra git stash pop
saklı 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 checkout
ve reset --hard
başarısız olur. Sonunda işe yarayan, saklamayı bir şube olarak kaydetmek git stash branch tempbranchname
ve daha sonra normal bir şube birleştirmesi yapmaktı: git checkout master
ve 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 apply
Farklı mıgit stash apply
?