Git stash için amaçlanan kullanım durumu nedir?


143

A şubesinde çalışıyorsam ve A şubesinde bir taahhütle hazır olmadan önce aniden B şubesinde çalışmam gerekirse, değişikliklerimi A'da saklarım, B'yi kontrol ederim, işimi orada yaparım, sonra A'yı kontrol ederim ve zulayı uygularım.

A üzerinde çalışıyorsam ve o gün çalışmayı bırakmak istiyorsam, çalışmamı saklayıp ertesi gün (işimi sürdürdüğümde) uygulamalı mıyım yoksa her şeyi olduğu gibi mi bırakmalıyım — taahhüt edilmeyen değiştirilmiş dosyalar çalışma dizini? Bazı güvenlik avantajları dışında, bu durumda neden zula kullanmam gerektiğini anlamıyorum.

Ayrıca başka bir senaryo: Hem işte hem de evde çalışıyorum. Eve gitmek istediğimde bir taahhüt vermeye hazır değilsem, çalışmamı saklayabilir, GitHub'a gönderebilir ve sonra bu zulayı evde çekebilir miyim?


3
varsa, büyük ölçüde şirket politikalarınıza bağlıdır. "Kabul edilen" cevabı nasıl seçeceksiniz?
Daemon Painter

1
Bu soru cümleli olarak sadece fikir sormaktır (git'i bu şekilde mi yoksa bu şekilde mi kullanmalıyım ?) Ve bu nedenle kapatılmalı veya düzenlenmelidir.
TylerH

Yanıtlar:


162

Zula sadece kullanışlı bir yöntemdir. Git'te şubeler çok ucuz ve yönetimi kolay olduğundan, kişisel olarak neredeyse her zaman saklamaktansa yeni bir geçici şube oluşturmayı tercih ederim, ancak bu çoğunlukla bir zevk meselesi.

Saklamaktan hoşlandığım tek yer, son taahhüdümde bir şeyi unuttuğumu ve aynı dalda bir sonraki üzerinde çalışmaya başladığımı fark edersem:

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop

2
Eklediğiniz eksik olan şey, onu çözdüğünüzde zulayla birleştiriliyor mu? (Git'te zaman çizelgesinin nasıl çalıştığı konusunda hala titizim - tarihin üzerine yazdığınızı varsayıyorum ??)
Kiki Jewell

@KikiJewell popped değişiklikler dizine uygulanır - bunlar taahhüt edilmemiştir. yani git stash popiki kez yaparsanız , bu iki değişim seti arasındaki ayrımı kaybedersiniz.
Mureinik

Ekim 2017'nin sonlarından itibaren Git e-posta listesinde, git stash save komutunun mevcut alternatifin lehine kullanımdan kaldırıldığı kapsamlı tartışmalar var git stash push. Bunun ana nedeni, git stash pushseçilen yol türlerini saklama seçeneğini sunmasıdır , bir şey git stash savedesteklemiyor.
Krishna Gupta

@Mureinik, git stash şubesi vs yeni şubeler hakkında ne düşünüyorsun?
Pacerier

@Pacerier, ilk paragrafta da söylediğim gibi, neredeyse her zaman yeni bir şube oluşturmayı tercih ederim, ancak bu muhtemelen herhangi bir sağlam teknik muhakemeden daha fazla bir alışkanlık gücüdür.
Mureinik

41

Cevabı üç paragrafta kıracağım.

Bölüm 1:

git stash(İşlenmemiş değişikliklerinizi bir "zulaya" kaydetmek için. Not: bu, çalışma ağacındaki değişiklikleri kaldırır!)

git checkout some_branch(amaçlanan şubeye geçiş - bu durumda some_branch)

git stash list (zulaları listeleyin)

Şunları görebilirsiniz:
stash @ {0}: {branch_name}: {SHA-1 of last commit} {last commit of
your branch} stash @ {0}: WIP on master: 085b095c6 modification for test

git stash apply (mevcut daldaki çalışma ağacına zula uygulamak için)

git stash apply stash@{12}(Eğer çok sayıda zulanız olacaksa, hangi zulanın uygulanacağını seçebilirsiniz - bu durumda zula uygularız 12)

git stash drop stash@{0}(zula listesinden çıkarmak için - bu durumda zula 0)

git stash pop stash@{1} (seçilen zulayı uygulamak ve zula listesinden çıkarmak için)

Bölüm 2:
Değişikliklerinizi bu komutla gizleyebilirsiniz ancak bu gerekli değildir.
Ertesi gün saklanmadan devam edebilirsiniz.
Değişikliklerinizi gizlemek ve farklı dallarda çalışmak veya kodunuzun bir miktar gerçekleştirilmesi için bu komutlar, dallar ve özel durumunuz olmadan zulalara kaydedin!
Ve daha sonra bazı zulaları kullanabilir ve hangisinin daha iyi olduğunu kontrol edebilirsiniz.

Bölüm 3:
Değişikliklerinizi yerel gizlemek için Stash komutu.
Uzaktan çalışmak istiyorsanız taahhütte bulunmalı ve zorlamalısınız.


10

Ana fikir

Değişiklikleri kirli bir çalışma dizininde saklayın

Yani Basicallly Stash komutu, şu anda ihtiyaç duymadığınız veya istemediğiniz bazı değişiklikleri saklar; ama onlara ihtiyacın olabilir.

Çalışma dizininin ve dizinin mevcut durumunu kaydetmek , ancak temiz bir çalışma dizinine geri dönmek istediğinizde git stash kullanın . Komut, yerel değişikliklerinizi kaydeder ve HEAD yürütme ile eşleşecek şekilde çalışma dizinini geri döndürür .


8

Aşağıdaki komutları kullanabilirsiniz:

  • Gerçekleştirilmemiş değişikliklerinizi kaydetmek için

    git stash

  • Kaydedilmiş zulalarınızı listelemek için

    git stash list

  • X'in 0,1,2 olduğu durumlarda beklenmeyen değişiklikleri uygulamak / geri almak için ...

    git stash apply stash@{x}

Not:

  • Bir zula uygulamak ve zula listesinden çıkarmak için

    git stash pop stash@{x}

  • Bir zula uygulamak ve zula listesinde tutmak için

    git stash apply stash@{x}


4

git stashÇalışma kopyasında (hazırlama alanında değil) değişiklikleriniz olduğunda vurursanız , git saklanan bir nesne oluşturur ve zula yığınına iter (yaptığınız gibi, git checkout -- .ancak değişiklikleri kaybetmezsiniz). Daha sonra yığının tepesinden çıkabilirsiniz.


2

Stash komutu, son taahhüdünüzden bu yana yaptığınız tüm değişiklikleri saklar. Senin durumunda, ertesi gün üzerinde çalışmaya devam edeceksen, saklanman için bir sebep yok. Stash'i yalnızca uygulamak istemediğiniz değişiklikleri geri almak için kullanırdım.


2
Hayır, git stashşubenizi değiştirmeyecek. Özellikle taahhüt edilen değişiklikleri "geri almayacaktır". Yalnızca (geçici) dosyalarınızdaki taahhüt edilmemiş değişiklikleri atar. - Seçici görünebilir, ancak bu tür kelimelerin git bağlamında çok özel bir anlamı vardır. Bunları gerçekten karıştırmamalısın.
michas

Bunu belirttiğiniz için teşekkürler. Cevabımı buna göre değiştirdim.
Severin

Git'te bir "dal", bir dizi kaydetme olarak tanımlanır. git stashhiçbir taahhüde dokunmayacak ve bu nedenle hiçbir şubeyi değiştirmeyecektir. Bir daldan hiçbir şeyi "kaldırmaz" ve hiçbir şekilde "sıfırlamaz". Dal aynı kalır, sadece çalışma ağacındaki dosyalar değişir. - Bunlar tamamen farklı iki şey.
michas

Değişikliklerinizi atmaz, ancak "saklayın"! Git, zulalar için bir LIFO yapısını korur, bu nedenle bir zula aslında bir itmedir ve tepesinden çıkabilirsiniz. "Atma" kelimesi, her şeyi kaybedeceğiniz, ancak kaybedmeyeceğiniz anlamına gelir.
gyorgyabraham

2

StackOverflow'un fikir temelli cevaplar için uygun bir yer olmadığını biliyorum, ancak değişiklikleri bir zulayla ne zaman rafa kaldıracağım konusunda iyi bir fikrim var.

Size deneysel değişiklikler yapmak istemezsiniz

Çalışma alanınızda / çalışma ağacınızda değişiklik yaptığınızda, birleştirme, itme, getirme veya çekme gibi dal tabanlı işlemler yapmanız gerekiyorsa, temiz bir teslim noktasında olmanız gerekir. Dolayısıyla, çalışma alanı değişiklikleriniz varsa, bunları gerçekleştirmeniz gerekir. Ama ya bunları yapmak istemiyorsan? Ya deneysel iseler? Taahhüt tarihinizin bir parçası olmasını istemediğiniz bir şey? GitHub'a bastığınızda başkalarının görmesini istemediğiniz bir şey mi?

Donanımdan sıfırlama ile yerel değişiklikleri kaybetmek istemezsiniz

Bu durumda, donanımdan sıfırlama yapabilirsiniz. Ancak donanımdan sıfırlama yaparsanız tüm yerel bilgilerinizi kaybedersiniz. çalışma ağacı değişikliklerinizi çünkü her şey son işlem sırasında olduğu yere yazılır ve tüm değişikliklerinizi kaybedersiniz.

Bu nedenle, 'ne zaman saklamalısınız' cevabına gelince, yanıt, senkronize bir çalışma ağacı / dizin / kaydetme ile temiz bir kesinleştirme noktasına geri dönmeniz gerektiğinde, ancak yerel değişikliklerinizi kaybetmek istemediğiniz zamandır. süreç. Değişikliklerinizi bir zulada rafa kaldırın ve iyisiniz.

Ve zulanızı yaptıktan ve sonra birleştirdikten veya çekip ittikten sonra, sadece saklayabilir veya uygulayabilirsiniz. ve başladığınız yere geri dönebilirsiniz.

Git stash ve GitHub

GitHub sürekli olarak yeni özellikler ekliyor, ancak şu andan itibaren, orada bir zula kaydetmenin bir yolu var. Yine, zula fikri yerel ve özel olmasıdır. İş istasyonunuza fiziksel erişim olmadan başka hiç kimse zulanıza göz atamaz. Aynı şekilde git reflog özeldir ve git logu geneldir. GitHub'a aktarılsaydı muhtemelen özel olmazdı.

İşin püf noktası, çalışma alanınızın farklılığını yapmak, git deponuzdaki farklılığı kontrol etmek, teslim etmek ve ardından itmek olabilir. Sonra evden çekebilir, farkı alabilir ve sonra gevşetebilirsiniz. Ancak bu, bu sonuçları elde etmenin oldukça karmaşık bir yolu.

git diff > git-dif-file.diff

zulayı aç

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.