Biraz ek açıklama olarak, git stash
iki veya üç commit yaptığına dikkat edin. Varsayılan ikidir; --all
veya --include-untracked
seç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 i
dizin / 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 i
kesinleş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 stash
kod, w
izlenen tüm çalışma ağacı dosyalarınızı (geçici bir yardımcı dizine) kopyalayarak yapar . Git, bu w
commit'in ilk ebeveynini commit'i gösterecek şekilde HEAD
ve ikinci ebeveyni commit'i işaret edecek şekilde ayarlar.i
. Son olarak, stash
şu w
kaydetmeye işaret eder :
...--o--o--o <-- branch (HEAD)
|\
i-w <-- stash
--include-untracked
Veya eklerseniz --all
, Git, u
yapmak i
ve w
. İçin anlık görüntü içeriği u
izlenmeyen ancak yok sayılmayan dosyalar ( --include-untracked
) veya yok sayılsalar bile izlenmeyen dosyalardır ( --all
). Bu ekstra u
taahhüt sahip hiçbir ebeveyn ve sonra ne zaman git stash
yapar w
, bu ayarlar w
'ın üçüncü Buna ebeveyni u
almak, 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 clean
bunu yapmak için kullanarak ).
Bir zulayı geri yükleme
Bir zulayı geri yüklemeye gittiğinizde , onu kullanma --index
ya da kullanmama seçeneğiniz vardır . Bu söyler git stash apply
(veya dahili olarak kullanmak komutların herhangi apply
gibi 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 apply
tamamen yok sayar i
.
Zulada yalnızca iki kaydetme varsa git stash apply
, artık w
kesinleştirme uygulayabilirsiniz . Bunu, git merge
2'yi çağırarak (sonucu normal bir birleştirme olarak işlemesine veya işlemesine izin vermeden), zulanın yapıldığı orijinal taahhüdü ( i
ebeveyn ve w
ilk ebeveyn) birleştirme tabanı w
olarak kullanarak yapar. --theirs
commit 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 apply
kendisi de başarılı olur. Eğer kullanılırsa git stash pop
zulası 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 pop
kod, zulayı korur ve için olduğu gibi aynı hata durumunu verir git stash apply
.
Ancak bu üçüncü taahhüdünüz varsa - u
uyguladığınız zulada bir taahhüt varsa - o zaman işler değişir! Kayıt yokmuş gibi davranma seçeneği u
yoktur. 4 Git tüm dosyaları ayıklanması ısrar gelen o u
işlemek mevcut çalışma-ağaca. Bu, dosyaların ya hiç var olmaması ya da u
kaydetmede olduğu gibi aynı içeriğe sahip olması gerektiği anlamına gelir .
Bunun olmasını sağlamak için git clean
kendinizi 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 -u
veya git stash save -a
bu çalışacaktır, çünkü git clean
senin için. Ancak bu sizi u
daha 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-recursive
doğ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 branch
her şeyi mükemmel bir şekilde kurtarmak için kullanabileceğiniz anlamına gelir . Pekala, bu sinir bozucu u
taahhüdün eksikliğini varsayarsak .
4 Gerçekten olmalı: git stash apply --skip-untracked
veya başka bir şey. Ayrıca, tüm bu u
commit 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