git-stash ve git-branch karşılaştırması


92

Bir de önceki Git soruya Daniel Benamy Git bir iş akışı bahsediyordu:

Usta üzerinde çalışıyordum ve bazı şeyler yaptım ve sonra bu çalışmayı beklemeye almaya karar verdim. Birkaç taahhüdü yedekledim ve sonra boktan işime başlamadan önce dallandım.

Mevcut değişikliklerini kaybetmeden çalışma durumunu önceki bir noktaya geri yüklemek istedi. Tüm yanıtlar, çeşitli şekillerde, örneğin

git branch -m master crap_work
git branch -m previous_master master

Bu nasıl karşılaştırılır git stash? Her şey zaten dallanarak ele alınmış gibi göründüğünde buradaki farklı kullanım durumunun ne olduğunu görmeye çalışırken biraz kafam karıştı git stash...


@ Jordi Bunster : Teşekkürler, bu işleri düzeltir . Sanırım "zulayı" hafif, isimsiz bir dal gibi düşünebilirim. Yani zulanın yapabileceği her şey, şube de yapabilir ama daha fazla kelime ile. Güzel!

Yanıtlar:


109

"zula", çalışma kopyanızdaki taahhüt edilmeyen, " kirli " şeyleri alır ve saklayarak size temiz bir çalışma kopyası bırakır.

Gerçekten dallanmıyor. Daha sonra zulayı başka herhangi bir dalın üzerine uygulayabilirsiniz. Veya Git 1.6'dan itibaren şunları yapabilirsiniz:

git stash branch <branchname> [<stash>]

zulayı yeni bir dalın üstüne uygulamak için hepsi tek bir komutta.

Öyleyse, henüz " yanlış " dala bağlanmadıysanız , zula harika çalışıyor .

Zaten taahhüt verdiyseniz, sorunuzda tanımladığınız iş akışı daha iyi bir alternatiftir. Ve bu arada, haklısın: Git çok esnektir ve bu esneklikle birlikte örtüşen işlevsellik gelir.


1
beni ısırtan bir şey var ... bir [<stash>] 'in nasıl göründüğünü yazabilir misin? Dokümanlarda bu gösterime koydular, ancak bunun 1 mi, @ mi olması gerektiği {1} ya da ne olduğu açık değil.
Gregg Lind

1
Belirli bir "N" zulasına atıfta bulunmak istiyorsanız, stash @ {N}
Jordi Bunster

9
git stash listZulalarınızın adlarına bakın .
idbrii

6
Gregg, evet yapabilirsin: git stash save (zulanızın adı). Her bir zulanın ne yaptığını bilmeniz için onu çok kullanırsanız daha kullanışlı hale getirir. Bir zulanın yamasını göstermek için git stash show -p (isim) 'i kullanabilirsiniz.
Thomas Vander Stichele

7
ayrıca, git stash show -uçalışma kopyasına karşı zulanın bir farkını göstermek için.
ken

49

Zulanızı geri yüklediğinizde, değişiklikleriniz yeniden uygulanır ve kodunuz üzerinde çalışmaya devam edersiniz.

Mevcut değişikliklerinizi saklamak için

$ git stash save 
Saved "WIP on master: e71813e..."

Ayrıca birden fazla zulaya sahip olabilirsiniz. Zula bir yığın gibi çalışır. Her yeni zula kaydettiğinizde, yığının üstüne yerleştirilir.

$ git stash list
stash@{0}: WIP on master: e71813e..."

Parçayı not et stash@{0}? Bu senin zula kimliğin. Daha sonra geri yüklemek için buna ihtiyacınız olacak. Bunu hemen şimdi yapalım. Zula kimliği, yaptığınız her zulada değişir. stash @ {0}, yaptığınız son zulayı ifade eder.

Zula uygulamak için

$ git stash apply stash@{0}

Zulayı uyguladıktan sonra hala orada olduğunu fark edebilirsiniz. Artık ihtiyacın yoksa bırakabilirsin.

$ git stash drop stash@{0}

Veya zula bir yığın gibi davrandığından, kaydettiğiniz son zulayı kaldırabilirsiniz:

$ git stash pop

Tüm zulalarınızı silmek istiyorsanız, 'temizle' komutunu çalıştırın:

$ git stash clear

Zulaları o kadar sık ​​kullanmaman çok iyi olabilir. Değişikliklerinizi daha sonra geri yüklemek için hızlıca saklamak istiyorsanız, saklama kimliğini dışarıda bırakabilirsiniz.

$ git stash
...
$ git stash pop

Gerçekten önemli bazı işlerde kullanmadan önce zulayı denemekten çekinmeyin.

Ayrıca blogumda bunun daha derinlemesine bir versiyonu da var .


sözde 'en iyi' cevaptan çok daha yararlı bir kaynak ... (en iyi cevap onu çok açık hale
getirse

11

Her zaman git zulasına karşı temkinliyimdir. Birkaç kez saklarsanız, işler karışmaya meyillidir. git stash list, oluşturduğunuz zulaların numaralandırılmış bir listesini, sağladıysanız mesajlarla birlikte görüntüler ... Ancak sorun, zulaları acımasız bir git zulası temizleme (hepsini kaldıran) dışında temizleyememeniz gerçeğinde yatmaktadır. . Dolayısıyla, zulalarınız için sürekli olarak süper açıklayıcı mesajlar vermezseniz (zulanın felsefesine aykırıdır), anlaşılmaz bir yığın zulaya sahip olursunuz.

Hangisinin gitk'i kullanmak olduğunu anlamanın bildiğim tek yolu - hepsini ve zulaları tespit et. En azından bu, zulanın hangi kayıt üzerinde oluşturulduğunu ve bu zulada bulunan her şeyin farkını görmenizi sağlar.

Git 1.5.4.3'ü kullandığımı ve 1.6'nın git stash pop eklediğini unutmayın, sanırım bu seçili zulayı uygular ve listeden çıkarın. Bu çok daha temiz görünüyor.

Şimdilik, o zulaya aynı gün, hatta bir saat içinde geri döneceğime kesinlikle emin olmadıkça, her zaman dallanmaya çalışıyorum.


3
Faydalı isimler vermeden şubeler yapıyor musunuz? Değilse, o zaman neden aynı şeyi zulada yapmadığınızı anlamıyorum. Ne içerdiklerini gerçekten bilmek istiyorsanız, hangi dosyaların değiştiğini göstermek için git-stash show'u ya da gerçek farkları görmek için git-stash uygulayıp git-diff'i kullanın. Zulaları kırpılmış halde tutmak, dallarınızı kontrol altında tutmakla aynı şeydir.
Xiong Chiamiov

18
aslında tek bir git stash drop [<stash>]
zulayı

1
Doğru, git uzun zamandır git zulasını düşürüyor. Şimdi kullanmak için bir PITA'dan çok daha az. Her gün ve hatta artık uzun zaman aralıklarında kullanıyorum.
webmat

3

Git stash'tan daha uygun bir iş akışı arıyorsanız git-bottle'a bakmak isteyebilirsiniz . Bu, çeşitli git çalışma durumlarını normal git taahhütleri olarak kaydetmek ve geri yüklemek, çalışma ağacınızın mevcut ve ilgili durumunun ve git durumu altında gösterilen tüm çeşitli dosya durumlarının etkin bir şekilde anlık görüntüsünü almak için bir yardımcı programdır .

Aşağıdakilerden temel farklılıklar git stash:

  • git stashkirli git durumunu dar bir şekilde kaydeder (değiştirilmiş dosyalar ve dizine eklenen dosyalar), oysa farklı olan her şeyigit-bottle kaydetmek için tasarlanmıştır ve değiştirilmiş, değiştirilmiş ve eklenmemiş, eklenmemiş, birleştirilmemiş yollar arasında koruyarak farklılaşır, ve tam yeniden bağlama / birleştirme durumları (yalnızca altındaki yollar kaydedilmez).HEAD.gitignore
  • git stashayrı ayrı izlemeniz gereken nesneleri saklamak için kaydeder. 2 hafta önce bir şeyi sakladıysam hatırlamayabilirim, oysa mevcut şubeye geçici taahhütlergit-bottle olarak kaydeder . Tersi eylem, pop'un eşdeğeridir . Bu taahhütleri depolar arasında itmek ve paylaşmak mümkündür. Bu, uzaktaki bir sunucuda başka bir deponuzun olduğu uzak derlemeler için veya çatışma çözümü konusunda diğer insanlarla işbirliği yapmak için yararlı olabilir.git-unbottlegit stash
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.