Biraz ek açıklama olarak, git stashiki veya üç commit yaptığına dikkat edin. Varsayılan ikidir; --allveya --include-untrackedseçeneklerinin herhangi bir yazımını kullanırsanız üç elde edersiniz .
Bu iki ya da üç, kaydedilmesini yönden önemi özeldir: onlar üzerinde hiçbir dalda değildirler. Git onları özel adla bulur stash. 1 en önemli şey olsa da, Git sen-ve sağlayan şeydir kılan bu iki veya üç kaydedilmesini ile sen-do. Bunu anlamak için bu taahhütlerde ne olduğuna bakmamız gerekiyor.
Zulanın içinde ne var
Her kayıt, bir veya daha fazla ebeveyn kaydını listeleyebilir . Bunlar, daha sonraki taahhütlerin daha öncekilere işaret ettiği bir grafik oluşturur. Zula normalde idizin / hazırlık alanı içeriği ve wçalışma ağacı içeriği için çağırmaktan hoşlandığım iki commit tutar . Ayrıca her işlemenin bir anlık görüntü içerdiğini unutmayın. Normal bir işlemde bu anlık görüntü yapılır gelen endeks / hazırlık alanlı içerikleri. Yani ikesinleştirme aslında tamamen normal bir işlemdir! Herhangi bir dalda yok:
...--o--o--o <-- branch (HEAD)
|
i
Normal bir zula yapıyorsanız, git stashkod, wizlenen tüm çalışma ağacı dosyalarınızı (geçici bir yardımcı dizine) kopyalayarak yapar . Git, bu wcommit'in ilk ebeveynini commit'i gösterecek şekilde HEADve ikinci ebeveyni commit'i işaret edecek şekilde ayarlar.i . Son olarak, stashşu wkaydetmeye işaret eder :
...--o--o--o <-- branch (HEAD)
|\
i-w <-- stash
--include-untrackedVeya eklerseniz --all, Git, uyapmak ive w. İçin anlık görüntü içeriği uizlenmeyen ancak yok sayılmayan dosyalar ( --include-untracked) veya yok sayılsalar bile izlenmeyen dosyalardır ( --all). Bu ekstra utaahhüt sahip hiçbir ebeveyn ve sonra ne zaman git stashyapar w, bu ayarlar w'ın üçüncü Buna ebeveyni ualmak, böylece taahhüt:
...--o--o--o <-- branch (HEAD)
|\
i-w <-- stash
/
u
Git ayrıca, bu noktada, işlemede ortaya çıkan tüm çalışma ağacı dosyalarını kaldırıru ( git cleanbunu yapmak için kullanarak ).
Bir zulayı geri yükleme
Bir zulayı geri yüklemeye gittiğinizde , onu kullanma --indexya da kullanmama seçeneğiniz vardır . Bu söyler git stash apply(veya dahili olarak kullanmak komutların herhangi applygibi pop) o gerektiğini kullanmaki geçerli dizini değiştirmeye çalışmayın taahhüt. Bu değişiklik şu şekilde yapılır:
git diff <hash-of-i> <hash-of-i's-parent> | git apply --index
(aşağı yukarı; burada temel fikrin yoluna giren bir sürü nitty ayrıntı var).
Atlarsanız --index, kesinliği git stash applytamamen yok sayar i.
Zulada yalnızca iki kaydetme varsa git stash apply, artık wkesinleştirme uygulayabilirsiniz . Bunu, git merge2'yi çağırarak (sonucu normal bir birleştirme olarak işlemesine veya işlemesine izin vermeden), zulanın yapıldığı orijinal taahhüdü ( iebeveyn ve wilk ebeveyn) birleştirme tabanı wolarak kullanarak yapar. --theirscommit ve birleştirme hedefi olarak mevcut (HEAD) taahhüdünüz. Birleştirme başarılı olursa, her şey iyidir - en azından Git öyle düşünüyor - ve git stash applykendisi de başarılı olur. Eğer kullanılırsa git stash popzulası uygulamak, kod artık düşer zulası. 3 Birleştirme başarısız olursa, Git başvurunun başarısız olduğunu bildirir. Kullandıysanızgit stash popkod, zulayı korur ve için olduğu gibi aynı hata durumunu verir git stash apply.
Ancak bu üçüncü taahhüdünüz varsa - uuyguladığınız zulada bir taahhüt varsa - o zaman işler değişir! Kayıt yokmuş gibi davranma seçeneği uyoktur. 4 Git tüm dosyaları ayıklanması ısrar gelen o uişlemek mevcut çalışma-ağaca. Bu, dosyaların ya hiç var olmaması ya da ukaydetmede olduğu gibi aynı içeriğe sahip olması gerektiği anlamına gelir .
Bunun olmasını sağlamak için git cleankendinizi kullanabilirsiniz - ancak izlenmemiş dosyaların (göz ardı edilmiş olsun ya da olmasın) Git deposunda başka bir varlığı olmadığını unutmayın, bu nedenle bu dosyaların tamamen yok edilebileceğinden emin olun! Veya, geçici bir dizin yapmak ve başka yapmak hatta saklanması amacıyla veya orada dosya taşıyabilirsiniz git stash save -uveya git stash save -abu çalışacaktır, çünkü git cleansenin için. Ancak bu sizi udaha sonra uğraşmak için başka bir stil zulasına bırakıyor .
1 Bu aslında refs/stash. Bu, adında bir şube yaparsanız önemlidir stash: şubenin tam adı refs/heads/stash, yani bunlar çelişkili değildir. Ama bunu yapma: Git aldırmaz ama kafanı karıştıracaksın. :-)
2git stash kod aslında kullanır git merge-recursivedoğrudan buraya. Bu, birçok nedenden dolayı gereklidir ve ayrıca Git'in çatışmaları çözdüğünüzde ve tamamladığınızda bunu bir birleştirme olarak değerlendirmediğinden emin olma yan etkisine de sahiptir.
3 Bu yüzden git stash pop, lehine kaçınmayı öneriyorum git stash apply. Neyin uygulandığını gözden geçirme ve gerçekten doğru uygulanıp uygulanmadığına karar verme şansınız olur . Değilse, hala zulanız var, bu da git stash branchher şeyi mükemmel bir şekilde kurtarmak için kullanabileceğiniz anlamına gelir . Pekala, bu sinir bozucu utaahhüdün eksikliğini varsayarsak .
4 Gerçekten olmalı: git stash apply --skip-untrackedveya başka bir şey. Ayrıca, tüm bu ucommit dosyalarını yeni bir dizine bırakma anlamına gelen bir varyant da olmalıdır , örneğin git stash apply --untracked-into <dir>, belki.
git stash show -p | git apply --3