Tamamlanmamış işiniz varsa ve henüz commit etmeye hazır değilse, ama hemen bağlam değiştirmeniz gerekiyorsa, bir "WIP" commit’i yapmayın. Ayrıca, değişikliklerinizi 2005’teki gibi bir metin dosyasına kopyalayıp yapıştırmayın. git stash ihtiyacınız olan her şeydir.
Bu komut, bağlam değiştirirken commit edilmemiş çalışmaları korumanın başvuru yoludur. Değişiklikleri geçici olarak depolamanıza, diğer dallardaki acil işleri halletmenize ve her şeyi tam bıraktığınız yere geri yüklemenize olanak tanır.
Bu yazıda, git stash pop’ın nasıl çalıştığını, git stash apply yerine ne zaman kullanılacağını ve kaçınılmaz olarak ortaya çıkan çakışmalarda nasıl toparlanacağınızı anlatacağım.
Git’e yeniyseniz ve stash kavramı kafanızı karıştırıyorsa, önce temelleri öğrenmeyi unutmayın. Introduction to Git ve Introduction to GitHub kurslarımız kısa sürede sizi hızlandıracaktır.
Git Stash’i Anlamak
Git stash, commit edilmemiş değişiklikler için geçici depolamanızdır.
Bunu çalışmanız için bir panoya benzetin. Çalışma dizininizde commit etmeye hazır olmayan değişiklikleriniz var, ancak dallar arasında geçiş yapmanız veya uzak depodan güncelleme çekmeniz gerekiyor. Böylece işinizi kaybetmek veya bir WIP commit’i yapmak yerine, onu stash’e alırsınız.
Komut, değişikliklerinizi kaydeder ve çalışma dizininizi HEAD commit’iyle eşleşecek şekilde geri alır.
Git’te stash’lemenin fikri
Stash, basit bir problemi çözer: Git, commit edilmemiş değişiklikler varken dal değiştirmenize izin vermez.
Diyelim ki bir özellik üzerinde çalışırken bir hata raporu geldi. Hemen başka bir dala geçmeniz gerekiyor, ama elinizde yarım kalmış kod ve değiştirilmiş dosyalar var. Commit mantıklı değil çünkü işiniz tamamlanmamış. Zorla checkout yapmak ise değişikliklerinizi kaybettirir.
İşte o zaman stash yaparsınız.
Stash’in işinize yarayacağı en yaygın senaryolar şunlardır:
Acil iş için dal değiştirmek: Bir özelliğin ortasındasınız ve prod’daki bir hatayı düzeltmeniz gerekiyor.
Uzak değişiklikleri çekmek: Ekip arkadaşınız güncellemeleri itti ve sizin de çekmeniz gerekiyor, ancak yerelde değişiklikleriniz var.
Düzensiz commit’lerden kaçınmak: Commit etmeye hazır değilsiniz ama rebase veya merge için temiz bir çalışma dizinine ihtiyacınız var.
Deneysel kodu kaydetmek: Mevcut çalışmanızı kaybetmeden farklı bir yaklaşımı denemek istiyorsunuz
Stash hızlı ve geri alınabilir – commit mesajları veya dal adları hakkında düşünmenize gerek yoktur.
Stash yığını mimarisi
Git, stash’leri son giren ilk çıkar (LIFO) yığını olarak tutar.
Her stash yaptığınızda, Git yığının en üstüne yeni bir kayıt oluşturur. En son stash stash@{0} olur ve eskiler aşağı kayar: stash@{1}, stash@{2}, vb.
Arka planda, her stash aslında bir commit’tir – daha doğrusu, commit’ler kümesidir. Git, şunları depolayan çok ebeveynli bir commit yapısı oluşturur:
Çalışma dizini değişiklikleriniz
Sahnelediğiniz değişiklikler (index)
İzlenmeyen dosyalar (u bayrağını kullandıysanız)
Bu yapı, stash’lerin sadece anlık görüntüler olmadığını gösterir. Git’in daha sonra çalışma dizininize geri birleştirebileceği tam commit’lerdir.
Stash’lere iki şekilde referans verebilirsiniz – stash@{0} sözdizimiyle indeks üzerinden veya git stash list çalıştırıp verdiğiniz mesajı bularak belirli bir stash’e referans vererek. Son stash’ler için indeks daha hızlıdır, ancak birden fazla stash kaydettiğinizde mesajlar daha kullanışlı olur.
Tipik bir stash yığını şöyle görünür:
WIP on öneki, git stash’i mesaj olmadan kullandığınız anlamına gelir. On öneki ise git stash push -m ile özel bir mesaj verdiğinizi gösterir.
Stash’ler yalnızca yerel deponuzda yaşar – uzak depoya itilmezler. Bu da geçici çalışmalarınızı tam olması gerektiği yerde tutar: makinenizde, ihtiyaç duyduğunuzda geri yüklenmeye hazır.
Stash Oluşturma, Yönetme ve İnceleme
Temel git stash komutu başlamak için yeterlidir, ancak tembeldir. İçinde ne olduğunu söylemeyen "WIP on branch-name" kayıtlarından oluşan bir yığınla kalırsınız. Altı hafta sonra, hangi stash’in hata düzeltmesini, hangisinin ise yarım kalmış refactor’ı içerdiğini hatırlamayacaksınız.
Şimdi size en baştan doğru yapmayı göstereceğim.
Uygun meta verilerle stash oluşturma
En basit stash yöntemi sadece git stash yazmaktır:
Fark bariz. Bir kayıt tam olarak ne yaptığınızı söylerken, diğeri sizi tahmin etmeye zorluyor.
Mesajları, gelecekteki kendinize not bırakıyormuş gibi yazın. "Auth mantığını ekle", "Navbar hatasını düzelt" veya "Yeni API tasarımıyla deneme" gibi ifadeler, genel WIP mesajlarına her zaman üstün gelir.
İzlenmeyen veya yok sayılan dosyaları dahil etme
Varsayılan olarak, git stash yalnızca izlenen dosyaları – yani Git’in zaten bildiği dosyaları – kaydeder.
İzlenmeyen dosyalar çalışma dizininizde kalır. Stash yapıp dal değiştirince, yeni dosyalarının hâlâ orada olduğunu görünce birçok kişi şaşırır.
Dosya stash’e alınmadı çünkü Git henüz onu izlemiyor:
Bunu aşmak için, izlenmeyen dosyaları da stash’e almak üzere -u bayrağını kullanın:
git stash push -u-m"Added a Python file for a new cool feature"Altyapı:
Bu, hem izlenen hem izlenmeyen dosyaları stash’e alır. Çalışma dizininiz tamamen temizlenir.
İpucu: Yok sayılan dosyaları da dahil etmek için -a bayrağını ekleyebilirsiniz. Bu, izlenen dosyaları, izlenmeyen dosyaları ve .gitignore içindeki dosyaları stash’e alır. Genellikle derleme sorunlarını ayıklarken veya her şeyin tamamen temiz bir anlık görüntüsünü almak istediğiniz durumlar dışında buna nadiren ihtiyaç duyarsınız.
Hangi bayrağı ne zaman kullanacağınızı bilmeniz için küçük bir özet:
Bayrak yok: Yalnızca mevcut dosyaları değiştirdiniz
u bayrağı: Henüz izlenmeyen yeni dosyalar eklediniz
a bayrağı: Derleme çıktıları veya geçici dosyalar dâhil her şeyi kaydetmeniz gerekiyor
Çoğu zaman -u kullanırsınız. Geliştirme sırasında yeni dosyalar oluşturduğunuzda en güvenli seçenektir.
Kısmi veya seçici stash
Çalışma dizininizdeki her şeyi stash’e almak zorunda değilsiniz.
Diyelim iki hatayı düzelttiniz ama yalnızca birini stash’e almak istiyorsunuz. Ya da beş dosyada değişiklik var, ancak yalnızca üçü kaydetmek istediğiniz özellikle ilgili.
Pathspec ile belirli dosyaları stash’e alabilirsiniz:
Git her değişikliği tek tek dolaşır ve stash’e almak isteyip istemediğinizi sorar. y (evet), n (hayır) veya s (bu parçayı daha küçük parçalara böl) ile yanıt verirsiniz.
Aynı dosyada ilişkili ve ilişkisiz değişiklikler karıştığında kullanışlıdır. Özellik çalışmasını stash’e alır, debug kodunu bırakırsınız.
Etkileşimli istem şu şekilde görünür:
Stash’leri listeleme ve inceleme
Gördüğünüz gibi, git stash list çalıştırarak stash’e aldığınız her şeyi görebilirsiniz:
En son stash her zaman stash@{0}’dır. Eski stash’ler dizinde aşağı kayar.
İyi mesajlar yazdıysanız, bu listeyi tarayarak her bir stash’te ne olduğunu bilirsiniz. Yazmadıysanız, tek tek incelemeniz gerekir.
Özet görmek için git stash show kullanın:
Bu, hangi dosyaların değiştiğini ve kaç satır eklendiğini veya kaldırıldığını gösterir.
Alternatif olarak, tam farkı görmek için git stash show -p kullanın:
-p bayrağı, git diff’te olduğu gibi gerçek kod değişikliklerini gösterir. git stash pop çalıştırmadan önce doğru stash’i açtığınızı bu şekilde doğrularsınız.
Git Stash Pop Gerçekte Ne Yapar
Şimdi git stash pop’ın gerçekte ne yaptığına ve neden kullanacağınıza bakalım.
Temel davranış ve sözdizimi
git stash pop komutu iki şey yapar: stash’e aldığınız değişiklikleri uygular ve ardından o stash’i yığından siler.
Bu, stash@{1}’i uygular ve kaldırır, ancak burada bir püf noktası var – kalan stash’ler yukarı kayar. stash@{2} olan stash@{1} olur, vb.
Git bir stash pop’u nasıl işler
git stash pop çalıştırdığınızda, Git arka planda üç yönlü bir merge gerçekleştirir.
Üç durumu karşılaştırır:
Temeli oluşturan commit (stash’i oluşturduğunuz yer)
Geçerli HEAD commit’iniz
Stash’teki değişiklikler
Merge çakışmasız başarıyla tamamlarsa, Git değişikliklerinizi uygular ve stash’i kaldırır. Çalışma dizininiz, stash öncesiyle birebir aynı görünür.
Basit bir iş akışı örneği:
# Bir özellik üzerinde çalışıyorsunuzecho"new feature code">> feature.py
git stash push -m"Half-finished feature work"# Yeni bir dala geçin ve alakasız değişiklik yapıngit checkout bugfix
echo"bug fix">> bugfix.py
gitadd bugfix.py
git commit -m"Fix critical bug"# Diğer dala geri dönüngit checkout main
# Stash’i açıngit stash popAltyapı:
Git temiz bir şekilde birleştiremiyorsa, çakışma alırsınız. Pop başarıyla tamamlanmadığından stash yığında kalır. Dosyalarınızda, normal bir merge çakışmasındaki gibi çakışma işaretleri görürsünüz.
Çakışmalar olduğunda, onları manuel olarak çözmeli, düzeltilen dosyaları sahnelemeli ve commit etmelisiniz. Stash otomatik olarak kaybolmaz, bu yüzden her şeyi çözdükten sonra git stash drop çalıştırmanız gerekir.
Stash’leri dallar arasında uygulamak
Stash’ler belirli bir dala bağlı değildir.
bugfix üzerinde bir stash oluşturabilir, main’e geçebilir ve stash’i orada açabilirsiniz. Git, stash’in nereden geldiğini umursamaz – sadece mevcut olduğunuz dala değişiklikleri uygulamaya çalışır.
Bu da bazı kullanışlı iş akışlarını mümkün kılar:
Çalışmayı dallar arasında taşımak: Yanlış dalda kod yazmaya başladınız. Sıfırlayıp işi kaybetmek yerine stash’e alın, doğru dala geçin ve orada açın.
Görevleri yeniden düzenlemek: Bir hafta önce deneysel kodu stash’e aldınız. Şimdi onun farklı bir dalda daha iyi çalışıp çalışmadığını denemek istiyorsunuz.
Değişiklikleri farklı bağlamlarda test etmek: Bir hata düzeltmesini stash’e aldınız ve commit etmeden önce onu birden çok dalda test etmek istiyorsunuz. Stash’i saklamak için pop yerine git stash apply kullanın, farklı dallarda test edin, sonra commit etmek istediğiniz dalda pop edin. Birazdan apply hakkında daha fazlası.
Değişiklikler mevcut dalınızla çakışmadığı sürece stash temiz şekilde uygulanır – hatırlamanız gereken temel fikir budur.
Git Stash Pop ve Git Stash Apply Karşılaştırması
Geliştiriciler sık sık git stash pop mı yoksa git stash apply mı kullanılmalı diye düşünür.
Temel fark: stash’in kalıcılığı
Ana fark basittir: pop stash’i uyguladıktan sonra kaldırır, apply ise yığında tutar.
pop ile “Bu stash işim bitti – uygula ve at” demiş olursunuz. apply ile “Buna daha sonra tekrar ihtiyacım olabilir” demiş olursunuz.
Bu, iş akışınızı iki şekilde etkiler:
Güvenlik: Bir pop sırasında bir şeyler ters giderse ve kurtarmanız gerekirse, stash gitmiş olur. apply ile stash yığında yedek olarak kalır.
Temizlik:pop kullanmak stash listenizi otomatik olarak temiz tutar. apply kullanmak, işiniz biten stash’leri kaldırmak için sonradan git stash dropçalıştırmanız gerektiği anlamına gelir.
Çoğu geliştirici, daha temiz olduğu için varsayılan olarak pop kullanır. Ancak apply, stash’in mevcut dalınızda temiz çalışıp çalışmayacağından emin olmadığınızda veya aynı değişiklikleri birden çok dalda test etmek istediğinizde daha iyidir.
stash@{0}: Feature work
stash@{1}: Bug fix
stash@{2}: Experimental codeAltyapı:
stash@{1}’i açarsanız, kalan stash’ler yukarı kayar:
stash@{0}: Feature work
stash@{1}: Experimental codeAltyapı:
Bu, Git işlemlerini betiklerle otomatikleştiriyorsanız veya ardışık olarak birden çok pop çalıştırıyorsanız sorun yaratabilir. stash@{1}’i açarsınız, sonra stash@{2}’yi açmayı denersiniz, ama o indeks artık yoktur.
apply komutunda bu sorun yoktur. İndeksler yalnızca açıkça git stash drop çalıştırdığınızda kayar. Yığın altınızda değişiyormuş gibi endişe etmeden stash’leri herhangi bir sırayla uygulayabilirsiniz.
Çakışmaların aynı şekilde ele alınması
Her iki komut da çakışmaları aynı şekilde ele alır.
Git stash’teki değişikliklerinizi temiz şekilde birleştiremezse, dosyalarınızda çakışma işaretleri görürsünüz. Fark, stash’in başına gelenlerdedir:
pop ile: Pop işlemi başarıyla tamamlanmadığı için stash yığında kalır
apply ile: Stash yığında kalır (zaten kalacaktı)
Her iki durumda da, çakışmaları manuel olarak düzeltmeli, düzeltilen dosyaları git add ile sahnelemeli ve git stash drop ile stash’i kaldırmalısınız (apply kullanıyorsanız).
Çakışma çözümleme iş akışı aynıdır – tek fark, başarılı olsaydı stash’in otomatik olarak silinip silinmeyeceğidir.
Her birini ne zaman seçmeli
git stash pop kullanın:
Bir stash’i bir kez uygulayıp işinizi bitirdiğinizde
Stash listenizin otomatik olarak temiz kalmasını istediğinizde
Tek bir dalda çalışıyorsanız ve stash’e başka yerde ihtiyaç duymuyorsanız
git stash apply kullanın:
Aynı değişiklikleri birden çok dalda test etmek istediğinizde
Stash’in temiz uygulanacağından emin olmadığınızda
Git işlemlerini betikliyorsanız ve öngörülebilir indekslere ihtiyaç duyuyorsanız
Bir şeyler ters giderse güvenlik ağı istiyorsanız
Stash Pop’larda Çakışmaları Yönetmek
Git stash’teki değişikliklerinizi temiz birleştiremediğinde çakışmalar olur. Bu bölümde, onlarla nasıl başa çıkacağınızı göstereceğim.
Çakışmalar ne zaman ve neden oluşur
Bir stash’i açarken Git’in gerçekleştirdiği üç yönlü merge sırasında çakışma meydana gelir.
Git kodunuzun üç sürümünü karşılaştırır:
Stash’i oluşturduğunuz temel commit
Geçerli HEAD commit’iniz
Stash’teki değişiklikler
Aynı satırlar hem mevcut dalınızda hem de stash’te değiştiyse, Git hangi sürümün tutulacağını bilemez. Bu bir çakışmadır.
Stash pop çakışmalarının yaygın nedenleri:
Aynı dosyayı iki dalda da değiştirdiniz: Bir dosyada değişiklikleri stash’e aldınız, dal değiştirdiniz, sonra pop yapmadan önce aynı dosyayı tekrar düzenlediniz
Bir başkası değişiklik itti: Çalışmayı stash’e aldınız, uzak depodan güncellemeler çektiniz ve o güncellemeler aynı kodu etkiledi
Rebase veya cherry-pick yaptınız: Git’in beklediği temel commit artık yok, bu da merge uyumsuzluklarına neden olur
Genel olarak, bir stash ne kadar uzun süre beklerse, sonunda açtığınızda çakışmayla karşılaşma olasılığınız o kadar artar.
Çakışma çözümleme iş akışı
Çakışma oluştuğunda, Git pop’u duraklatır ve dosyalarınızdaki çakışmaları işaretler:
Dosyanızda artık çakışma işaretleri var:
<<<<<<< Updated upstream ile ======= arasındaki her şey mevcut kodunuzdur. ======= ile >>>>>>> Stashed changes arasındaki her şey stash’ten gelir.
Bunu düzeltmek için şunları yapabilirsiniz:
Çakışan dosyayı açın ve hangi sürümün kalacağına karar verin (veya her ikisini birleştirin)
Git, temp-feature adında bir dal oluşturur, onu checkout eder ve stash’inizi üzerine açar. Dal, stash’i yaptığınız commit’ten başladığı için hiç çakışma olmaz. Bunu ayrı bir bölümde daha derinlemesine ele alacağım.
Başarısız bir pop’u git reset --merge ile de iptal edebilirsiniz:
git stash pop
# Çakışmalar oluşurgit reset --mergeAltyapı:
Bu, pop denemesini geri alır ve çalışma dizininizi pop öncesindeki durumuna döndürür. Stash yığında kalır.
Devam eden stash işlemlerini iptal etmek
Bir pop veya apply başlattıysanız ve tamamen geri dönmek istiyorsanız seçenekleriniz var.
Henüz çözmeye başlamadığınız çakışmalar için şunu çalıştırın:
Bu, çalışma dizininizdeki tüm değişiklikleri, yaptığınız düzeltmeler dâhil, atar. Ortalık karıştığında ve baştan başlamak istediğinizde kullanın.
Bu komutun commit edilmemiş çalışmaları yok ettiğini unutmayın. Her şeyi gerçekten atmak istediğinizden emin olmadan çalıştırmayın.
İptalden sonra, stash hâlâ yığındadır (pop kullandıysanız ve çakışmalara gelmeden önce başarılı olduysa hariç). Daha sonra tekrar deneyebilir veya daha temiz bir yaklaşım için git stash branch kullanabilirsiniz.
Stash’leri Temizlemek
Uzun soluklu projelerde stash’ler hızla birikir. Bir hatayı düzeltmek için stash’e alır, sonra unutursunuz. Hiç açmadığınız deneysel stash’ler oluşturursunuz. Altı ay sonra, 20 stash’iniz olur ve yarısının ne içerdiğini bilmezsiniz.
Bu, gerçekten ihtiyacınız olan stash’i bulmayı zorlaştırır. İçinde ne olduğunu anlamak için her birinde git stash show -p çalıştırmak zorunda kalırsınız.
Büyük zaman kaybıdır, bu yüzden stash’lerinizi düzenli olarak temizlemeyi unutmayın.
Tekil stash’leri düşürmek
git stash drop kullanarak belirli bir stash’i kaldırın:
Bir stash’ten dal oluşturmak, deneysel özellikler için idealdir. Diyelim ki bir hafta önce deneysel kodu stash’e aldınız ve şimdi mevcut işinizi bozmadan düzgünce geliştirmek istiyorsunuz.
Deney üzerinde çalışmak için temiz bir dal elde edersiniz. İşe yararsa geri birleştirirsiniz. Yaramazsa dalı siler ve devam edersiniz.
Uzun süren rebaseler için de harikadır. Rebase sırasında potansiyel çakışmalarla uğraşmak yerine, her şeyi stash’e alıp ondan bir dal oluşturabilirsiniz.
git stash push -m"WIP before rebase"git rebase main
git stash branch temp-workAltyapı:
Şimdi stash’lenmiş değişiklikleri ayrı ayrı gözden geçirip rebase’den sonra nasıl entegre edeceğinize karar verebilirsiniz.
Dal oluşturmak, büyük veya dağınık değişiklikleri izole etmek için de kullanışlıdır. 15 dosyada değişiklik içeren dev bir stash’iniz olduğunu ve bunların yarısının mevcut dalınızla çakıştığını düşünün. Yeni bir dal oluşturun – mücadele etmeye gerek yok.
Böylece her şeyi sakin sakin gözden geçirebileceğiniz, düzgünce commit’leyebileceğiniz ve net bir geçmişle geri birleştirebileceğiniz özel bir dalınız olur.
İleri Teknikler ve Kurtarma Seçenekleri
Artık git stash’in temellerine hâkimsiniz, şimdi size daha ileri kavramlar göstereyim.
Belirli stash girişleriyle çalışma
Yalnızca en son olan değil, yığınızdaki herhangi bir stash’i açabilir veya uygulayabilirsiniz.
İhtiyacınız olana tam olarak erişmek için stash’lere indeksleriyle referans verin:
git stash pop stash@{3}git stash apply stash@{1}Altyapı:
Bu, daha yeni olanlara dokunmadan eski stash’leri almanızı sağlar. Aradaki bir stash’i açtığınızda, altındaki tüm indeksler yukarı kayar. stash@{4} olan stash@{3} olur, vb. Git işlemlerini betikliyorsanız veya ardışık olarak birden çok stash açıyorsanız bu indeks kayması komutlarınızı bozacaktır.
Çözüm, öngörülebilir indekslere ihtiyaç duyduğunuzda pop yerine apply kullanmaktır:
git stash apply stash@{2}# İşiniz bitince manuel olarak düşürüngit stash drop stash@{2}Altyapı:
Bu, yığının ne zaman değişeceği üzerinde tam kontrol sağlar. Stash’i uygular, doğru çalıştığını doğrular, sonra kendiniz düşürürsünüz. İndeksler yalnızca açıkça söylediğinizde kayar.
Sahneleme durumunu geri yüklemek
Varsayılan olarak, git stash pop ve git stash apply değişikliklerinizi geri yükler ancak sahnelenmiş olanları korumaz.
Diyelim üç dosyayı değiştirdiniz ve stash’ten önce bunlardan ikisini commit için sahnelediniz. O stash’i açtığınızda, üç dosya da sahnelenmemiş değişiklikler olarak geri gelir. Git hangi dosyaları commit etmek istediğinizi unutur.
Çözüm, sahneleme durumunu aynen geri yüklemek için --index bayrağını kullanmaktır:
Bu, stash öncesindeki çalışma ağacınızı ve index’inizi aynen yeniden oluşturur. Sahnelenen dosyalar sahnelenmiş kalır. Sahnelenmemişler sahnelenmemiş kalır. Her şey tam eski haline döner.
Bu bayrağa şu durumlarda ihtiyaç duyarsınız:
Özenle hazırladığınız bir commit’in ortasındasınız ve sahneleme bilgisini kaybetmeyi göze alamıyorsunuz
Dosyalardan yalnızca belirli parçaları sahnelemek için git add -p gibi karmaşık sahneleme senaryoları kullandığınızda
İstisnasız şekilde çalışma dizininizin stash öncesiyle birebir aynı görünmesini istediğinizde
Çoğu zaman bu bayrağa ihtiyaç duymazsınız. Stash’i açar, ne geldiğine bakar ve ihtiyacınızı sahnelersiniz.
Stash hatalarından kurtulma
Er ya da geç, ihtiyacınız olan bir stash’i düşürecek veya tüm yığınınızı yanlışlıkla temizleyeceksiniz.
Böyle olursa, Git’in reflog’u günü kurtarabilir.
Reflog, depodaki her referans değişikliğini – stash’ler dahil – izler. Bir stash oluşturduğunuzda veya düşürdüğünüzde, Git bunu reflog’a kaydeder. Stash’i düşürdükten sonra bile commit’ler bir süre erişilemeyen nesneler olarak var olmaya devam eder.
Bu, kayıp stash’i sanki hiç düşürülmemiş gibi çalışma dizininize uygular.
Daha da iyisi, şu en iyi uygulamaları izleyerek hataları en baştan önleyin:
Ne düşürdüğünüzü tam bilmeniz için açıklayıcı stash mesajları yazın. Beş stash içeren bir listeye bakarken "WIP" yerine "Giriş hatasını düzelt" daha iyidir.
Düşürmeden önce doğru stash olduğundan emin olmak için git stash show -p kullanın. Beş dakika kurtarmaya harcamaktansa beş saniye doğrulamaya ayırın.
Yığının dağınık hâle gelmemesi için stash yığınınızı düzenli olarak temizleyin. Üç alakalı stash içeren bir yığın, 15 eski kaydı olana göre daha kolay yönetilir.
pop ile stash’i silmekten yüzde 100 emin olmadığınızda apply kullanın. Her şeyin yolunda olduğunu doğruladıktan sonra her zaman düşürebilirsiniz.
Reflog ile kurtarma işe yarar ama zahmetlidir. Sırf yukarıdaki görselden bile, elle kontrol etmem gereken kaç commit olduğunu görebilirsiniz – üstelik bu yazı için oluşturulmuş küçük bir projedir.
En İyi Uygulamalar ve İş Akışı Rehberi
Stash’leri iyi kullanmak, hataları önleyen ve iş akışınızı temiz tutan kalıpları izlemek demektir. Kendi başvurduğum yaklaşımı göstereyim.
Önerilen iş akışı kalıpları
En güvenli stash iş akışı basit bir kalıbı izler: mesajla stash’e al, bağlam değiştir, devam etmeye hazır olduğunda aç.
# feature-branch üzerinde çalışgit stash push -m"Feature work in progress"git checkout main
# main üzerinde acil işi yap# Geri döngit checkout feature-branch
git stash popAltyapı:
Bu, çoğu durum için çalışır. Çalışmanızı korur, araya giren işi halleder ve her şeyi temizce geri yüklersiniz.
Bir diğer yaygın kalıp "pop’tan önce incele" iş akışıdır. Stash’lerinizi listeler, içindekileri inceler ve doğru olanı açarsınız.
git stash list
git stash show -p stash@{1}git stash pop stash@{1}Altyapı:
Bu ek doğrulama adımı, yanlış stash’i açmanızı veya güncelliğini yitirmiş çalışmaları uygulamanızı önler.
Bazı geliştiriciler, stash yerine "gönülsüz commit" alternatifini tercih eder. Stash yapmak yerine, "WIP - hazır değil" gibi bir mesajla geçici bir commit yapar, sonra onu amend eder veya resetler. Stash’lerle rahat değilseniz veya çalışmanın dal geçmişinde izlenmesini istiyorsanız işe yarar. Dezavantajı, temizlemeyi unutursanız dağınık commit günlüklerine yol açmasıdır.
Geliştirme araçlarıyla entegrasyon
Çoğu Git GUI’si stash’lerinizi görsel olarak gösterir ve tek tıkla açmanıza veya uygulamanıza izin verir.
GitKraken, Sourcetree ve GitHub Desktop gibi araçlar, stash’lerinizi bir kenar çubuğunda listeler. Mesajı görebilir, diff’i inceleyebilir ve komut yazmadan stash’leri uygulayabilir veya düşürebilirsiniz. Birden fazla stash’iniz olduğunda ve yan yana karşılaştırmak istediğinizde kullanışlıdır.
VS Code’un Git uzantısı, kaynak kontrol panelinde stash’leri gösterir. Editörden çıkmadan sağ tıklayarak açabilir, uygulayabilir veya düşürebilirsiniz.
Komut satırını tercih ediyorsanız kabuk kısayolları stash’i hızlandırır. Bunları .bashrc veya .zshrc dosyanıza ekleyin:
aliasgst='git stash'aliasgstp='git stash pop'aliasgstl='git stash list'aliasgsts='git stash show -p'Altyapı:
Artık gst çalışmanızı stash’e alır, gstp açar, gstl stash’lerinizi listeler ve gsts diff’i gösterir. Her seferinde birkaç tuşa basmaktan kurtulursunuz.
Stash hijyeni ve ekip dikkate alınacakları
Stash’ler makinenize özeldir – uzak depolara asla itilmezler.
Bu, ekip arkadaşlarınızın stash’lerinizi göremeyeceği ve başka bir bilgisayardan onlara erişemeyeceğiniz anlamına gelir. Devam eden çalışmayı paylaşmanız gerekiyorsa, stash’e almayın. Bunun yerine patch’ler veya geçici dallar kullanın.
Patch ile paylaşmak için şunları çalıştırın:
git stash show -p> my-work.patch
# Patch dosyasını ekip arkadaşınıza gönderin# Onlar şu komutla uygular: git apply my-work.patchAltyapı:
Ekip arkadaşınız dalı çekebilir, işi gözden geçirebilir ve oradan devam edebilir.
Hangi yaklaşımı tercih ederseniz edin, her zaman iyi bir stash hijyeni sürdürün. Bu, karışıklığı önler ve yerel yığınızı yönetilebilir tutar. İzlemeniz gereken bazı iyi uygulamalar şunlardır:
Her stash için açıklayıcı adlar kullanın. "Kullanıcı yetkilendirme mantığını ekle" içinde ne olduğunu söyler. "WIP on feature-branch" hiçbir şey söylemez.
Stash’lerinizi haftalık temizleyin. git stash list çalıştırın ve bir haftadan eski olan her şeyi düşürün. Yedi gündür ihtiyaç duymadıysanız, muhtemelen hiç duymayacaksınız.
Stash sayınızın beşi geçmesine izin vermeyin. Beşten fazla stash, onları geçici bekletme yerine uzun vadeli depolama olarak kullandığınız anlamına gelir. Ya açın, çalışmayı commit’leyin ya da düşürün.
Bir ekipte çalışıyorsanız ve biri "Üzerinde çalıştığın kod nerede?" diye sorarsa, asla "Stash’imde" diye cevap vermeyin. Stash’ler özeldir ve geçicidir – paylaşıma veya önemli işleri arşivlemeye uygun değildir.
Sonuç
Artık git stash pop’ın nasıl çalıştığını ve ne zaman kullanılacağını biliyorsunuz.
Özünde stash basittir: commit edilmemiş çalışmanızı kaydedin, bağlam değiştirin ve sonra geri yükleyin. Ancak detaylar önemlidir. pop ile apply arasındaki farkı bilmek, çakışmaları nasıl yöneteceğinizi ve stash’lerden ne zaman dal oluşturacağınızı anlamak, saatlerce sürecek can sıkıntısından kurtarır.
En önemli çıkarım, stash’lerin geçici depolama olduğudur, kalıcı yedekler değil. Açıklayıcı mesajlar kullanın, düzenli olarak temizleyin ve yığının beş girdiyi aşmasına izin vermeyin. Çalışmayı paylaşmanız veya uzun süre saklamanız gerekiyorsa, onun yerine bir dala commit edin.
Hırvatistan merkezli Kıdemli Veri Bilimci. 700’ün üzerinde yayımlanmış makaleyle 10 M+ görüntüleme elde eden, önde gelen bir teknoloji yazarı. TPOT ile Makine Öğrenimi Otomasyonu kitabının yazarı.
SSS
Git stash pop nedir ve ne zaman kullanmalıyım?⌄
git stash pop, en son stash’lediğiniz değişiklikleri çalışma dizininize uygular ve o stash’i yığından kaldırır. Commit edilmemiş çalışmayı geçici olarak kaydedip dal değiştirdiğinizde veya güncellemeleri çektiğinizde ve şimdi bu değişiklikleri geri yüklemeye hazır olduğunuzda kullanın. Dağınık "WIP" commit’ler yapmadan kesintileri yönetmek için idealdir.
Git stash pop ile git stash apply arasındaki fark nedir?⌄
git stash pop, stash’lenmiş değişiklikleri uygular ve stash’i yığından siler; git stash apply ise uyguladıktan sonra stash’i saklar. Stash ile işiniz bittiğinde ve yığınınızı temiz tutmak istediğinizde pop kullanın. Aynı değişiklikleri birden çok dalda test etmek veya stash’i yedek olarak tutmak istediğinizde apply kullanın.
Git stash pop kullanırken merge çakışmalarını nasıl ele alırım?⌄
Bir stash pop sırasında çakışmalar oluştuğunda, Git çakışan dosyaları işaretler ve işlemi duraklatır. Çakışan dosyaları açın, hangi değişikliklerin kalacağına karar vererek çakışmaları manuel olarak çözün, sonra düzeltilen dosyaları git add ile sahneleyin. Çakışma sonrasında stash yığında kalır, bu nedenle işiniz bittiğinde git stash drop ile elle düşürmeniz gerekir.
Yanlışlıkla sildiğim bir stash’i kurtarabilir miyim?⌄
Evet, Git’in reflog’unu kullanarak düşürülen stash’leri kurtarabilirsiniz. Erişilemeyen commit’leri bulmak için git fsck --unreachable | grep commit çalıştırın, sonra her commit hash’i üzerinde git show çalıştırarak kayıp stash’inizi tespit edin. Bulduğunuzda, git stash apply <commit-hash> ile geri yükleyin.
Git stash mi yoksa geçici bir commit mi yapmalıyım?⌄
Diğer bir dala hızlıca geçip kısa süre içinde işe geri dönecekseniz git stash kullanın; örneğin başka bir daldaki acil bir hatayı düzeltmek için. Çalışmanın dal geçmişinde izlenmesini istiyorsanız veya stash’lerle rahat değilseniz geçici bir commit yapın. Stash’ler yereldir ve geçicidir; commit’ler kalıcıdır ve uzak depolara itilebilir.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Git’in gelişmiş özelliklerini öğrenin; Veri Bilimi ve mühendislik iş akışlarını karmaşık birleştirmeden büyük ölçekli proje optimizasyonuna kadar hızlandırın.
Temel bilgilerden gelişmiş iş akışlarına kadar Git ile sürüm kontrolünü öğrenin. Değişiklikleri takip edin, depoları yönetin ve verimli bir şekilde işbirliği yapın.
Tamamlanmamış işiniz varsa ve henüz commit etmeye hazır değilse, ama hemen bağlam değiştirmeniz gerekiyorsa, bir "WIP" commit’i yapmayın. Ayrıca, değişikliklerinizi 2005’teki gibi bir metin dosyasına kopyalayıp yapıştırmayın.
git stashihtiyacınız olan her şeydir.Bu komut, bağlam değiştirirken commit edilmemiş çalışmaları korumanın başvuru yoludur. Değişiklikleri geçici olarak depolamanıza, diğer dallardaki acil işleri halletmenize ve her şeyi tam bıraktığınız yere geri yüklemenize olanak tanır.
Bu yazıda,
git stash pop’ın nasıl çalıştığını,git stash applyyerine ne zaman kullanılacağını ve kaçınılmaz olarak ortaya çıkan çakışmalarda nasıl toparlanacağınızı anlatacağım.Git’e yeniyseniz ve stash kavramı kafanızı karıştırıyorsa, önce temelleri öğrenmeyi unutmayın. Introduction to Git ve Introduction to GitHub kurslarımız kısa sürede sizi hızlandıracaktır.
Git Stash’i Anlamak
Git stash, commit edilmemiş değişiklikler için geçici depolamanızdır.
Bunu çalışmanız için bir panoya benzetin. Çalışma dizininizde commit etmeye hazır olmayan değişiklikleriniz var, ancak dallar arasında geçiş yapmanız veya uzak depodan güncelleme çekmeniz gerekiyor. Böylece işinizi kaybetmek veya bir WIP commit’i yapmak yerine, onu stash’e alırsınız.
Komut, değişikliklerinizi kaydeder ve çalışma dizininizi HEAD commit’iyle eşleşecek şekilde geri alır.
Git’te stash’lemenin fikri
Stash, basit bir problemi çözer: Git, commit edilmemiş değişiklikler varken dal değiştirmenize izin vermez.
Diyelim ki bir özellik üzerinde çalışırken bir hata raporu geldi. Hemen başka bir dala geçmeniz gerekiyor, ama elinizde yarım kalmış kod ve değiştirilmiş dosyalar var. Commit mantıklı değil çünkü işiniz tamamlanmamış. Zorla checkout yapmak ise değişikliklerinizi kaybettirir.
İşte o zaman stash yaparsınız.
Stash’in işinize yarayacağı en yaygın senaryolar şunlardır:
Stash hızlı ve geri alınabilir – commit mesajları veya dal adları hakkında düşünmenize gerek yoktur.
Stash yığını mimarisi
Git, stash’leri son giren ilk çıkar (LIFO) yığını olarak tutar.
Her stash yaptığınızda, Git yığının en üstüne yeni bir kayıt oluşturur. En son stash
stash@{0}olur ve eskiler aşağı kayar:stash@{1},stash@{2}, vb.Arka planda, her stash aslında bir commit’tir – daha doğrusu, commit’ler kümesidir. Git, şunları depolayan çok ebeveynli bir commit yapısı oluşturur:
Bu yapı, stash’lerin sadece anlık görüntüler olmadığını gösterir. Git’in daha sonra çalışma dizininize geri birleştirebileceği tam commit’lerdir.
Stash’lere iki şekilde referans verebilirsiniz –
stash@{0}sözdizimiyle indeks üzerinden veyagit stash listçalıştırıp verdiğiniz mesajı bularak belirli bir stash’e referans vererek. Son stash’ler için indeks daha hızlıdır, ancak birden fazla stash kaydettiğinizde mesajlar daha kullanışlı olur.Tipik bir stash yığını şöyle görünür:
WIP onöneki,git stash’i mesaj olmadan kullandığınız anlamına gelir.Onöneki isegit stash push -mile özel bir mesaj verdiğinizi gösterir.Stash’ler yalnızca yerel deponuzda yaşar – uzak depoya itilmezler. Bu da geçici çalışmalarınızı tam olması gerektiği yerde tutar: makinenizde, ihtiyaç duyduğunuzda geri yüklenmeye hazır.
Stash Oluşturma, Yönetme ve İnceleme
Temel git stash komutu başlamak için yeterlidir, ancak tembeldir. İçinde ne olduğunu söylemeyen "WIP on branch-name" kayıtlarından oluşan bir yığınla kalırsınız. Altı hafta sonra, hangi stash’in hata düzeltmesini, hangisinin ise yarım kalmış refactor’ı içerdiğini hatırlamayacaksınız.
Şimdi size en baştan doğru yapmayı göstereceğim.
Uygun meta verilerle stash oluşturma
En basit stash yöntemi sadece
git stashyazmaktır:Bu değişikliklerinizi kaydeder, ancak "WIP on main" mesajı pek bilgilendirici değildir. İçine bakmadan ne olduğunu anlayamazsınız.
Bunun yerine, açıklayıcı bir mesajla
git stash push -mçalıştırın:Artık stash listeniz gerçekten bilgilendirici:
Fark bariz. Bir kayıt tam olarak ne yaptığınızı söylerken, diğeri sizi tahmin etmeye zorluyor.
Mesajları, gelecekteki kendinize not bırakıyormuş gibi yazın. "Auth mantığını ekle", "Navbar hatasını düzelt" veya "Yeni API tasarımıyla deneme" gibi ifadeler, genel WIP mesajlarına her zaman üstün gelir.
İzlenmeyen veya yok sayılan dosyaları dahil etme
Varsayılan olarak,
git stashyalnızca izlenen dosyaları – yani Git’in zaten bildiği dosyaları – kaydeder.İzlenmeyen dosyalar çalışma dizininizde kalır. Stash yapıp dal değiştirince, yeni dosyalarının hâlâ orada olduğunu görünce birçok kişi şaşırır.
Şöyle olur:
Dosya stash’e alınmadı çünkü Git henüz onu izlemiyor:
Bunu aşmak için, izlenmeyen dosyaları da stash’e almak üzere
-ubayrağını kullanın:Bu, hem izlenen hem izlenmeyen dosyaları stash’e alır. Çalışma dizininiz tamamen temizlenir.
İpucu: Yok sayılan dosyaları da dahil etmek için
-abayrağını ekleyebilirsiniz. Bu, izlenen dosyaları, izlenmeyen dosyaları ve.gitignoreiçindeki dosyaları stash’e alır. Genellikle derleme sorunlarını ayıklarken veya her şeyin tamamen temiz bir anlık görüntüsünü almak istediğiniz durumlar dışında buna nadiren ihtiyaç duyarsınız.Hangi bayrağı ne zaman kullanacağınızı bilmeniz için küçük bir özet:
Bayrak yok: Yalnızca mevcut dosyaları değiştirdiniz
ubayrağı: Henüz izlenmeyen yeni dosyalar ekledinizabayrağı: Derleme çıktıları veya geçici dosyalar dâhil her şeyi kaydetmeniz gerekiyorÇoğu zaman
-ukullanırsınız. Geliştirme sırasında yeni dosyalar oluşturduğunuzda en güvenli seçenektir.Kısmi veya seçici stash
Çalışma dizininizdeki her şeyi stash’e almak zorunda değilsiniz.
Diyelim iki hatayı düzelttiniz ama yalnızca birini stash’e almak istiyorsunuz. Ya da beş dosyada değişiklik var, ancak yalnızca üçü kaydetmek istediğiniz özellikle ilgili.
Pathspec ile belirli dosyaları stash’e alabilirsiniz:
Bu, yalnızca
new_file.txtvenew_file_2.txtdosyalarını stash’e alır. Diğer her şey çalışma dizininizde kalır.Joker karakterler de kullanabilirsiniz:
Ya da etkileşimli stash için
--patchkullanabilirsiniz:Git her değişikliği tek tek dolaşır ve stash’e almak isteyip istemediğinizi sorar.
y(evet),n(hayır) veyas(bu parçayı daha küçük parçalara böl) ile yanıt verirsiniz.Aynı dosyada ilişkili ve ilişkisiz değişiklikler karıştığında kullanışlıdır. Özellik çalışmasını stash’e alır, debug kodunu bırakırsınız.
Etkileşimli istem şu şekilde görünür:
Stash’leri listeleme ve inceleme
Gördüğünüz gibi,
git stash listçalıştırarak stash’e aldığınız her şeyi görebilirsiniz:En son stash her zaman
stash@{0}’dır. Eski stash’ler dizinde aşağı kayar.İyi mesajlar yazdıysanız, bu listeyi tarayarak her bir stash’te ne olduğunu bilirsiniz. Yazmadıysanız, tek tek incelemeniz gerekir.
Özet görmek için
git stash showkullanın:Bu, hangi dosyaların değiştiğini ve kaç satır eklendiğini veya kaldırıldığını gösterir.
Alternatif olarak, tam farkı görmek için
git stash show -pkullanın:-p bayrağı,
git diff’te olduğu gibi gerçek kod değişikliklerini gösterir.git stash popçalıştırmadan önce doğru stash’i açtığınızı bu şekilde doğrularsınız.Git Stash Pop Gerçekte Ne Yapar
Şimdi
git stash pop’ın gerçekte ne yaptığına ve neden kullanacağınıza bakalım.Temel davranış ve sözdizimi
git stash popkomutu iki şey yapar: stash’e aldığınız değişiklikleri uygular ve ardından o stash’i yığından siler.Temel sözdizimi şöyledir:
Bu, en son stash’i (
stash@{0}) açar ve stash listenizden kaldırır.Dizindeki belirli bir stash’i de referans vererek açabilirsiniz:
Bu,
stash@{1}’i uygular ve kaldırır, ancak burada bir püf noktası var – kalan stash’ler yukarı kayar.stash@{2}olanstash@{1}olur, vb.Git bir stash pop’u nasıl işler
git stash popçalıştırdığınızda, Git arka planda üç yönlü bir merge gerçekleştirir.Üç durumu karşılaştırır:
Merge çakışmasız başarıyla tamamlarsa, Git değişikliklerinizi uygular ve stash’i kaldırır. Çalışma dizininiz, stash öncesiyle birebir aynı görünür.
Basit bir iş akışı örneği:
Git temiz bir şekilde birleştiremiyorsa, çakışma alırsınız. Pop başarıyla tamamlanmadığından stash yığında kalır. Dosyalarınızda, normal bir merge çakışmasındaki gibi çakışma işaretleri görürsünüz.
Çakışmalar olduğunda, onları manuel olarak çözmeli, düzeltilen dosyaları sahnelemeli ve commit etmelisiniz. Stash otomatik olarak kaybolmaz, bu yüzden her şeyi çözdükten sonra
git stash dropçalıştırmanız gerekir.Stash’leri dallar arasında uygulamak
Stash’ler belirli bir dala bağlı değildir.
bugfixüzerinde bir stash oluşturabilir,main’e geçebilir ve stash’i orada açabilirsiniz. Git, stash’in nereden geldiğini umursamaz – sadece mevcut olduğunuz dala değişiklikleri uygulamaya çalışır.Bu da bazı kullanışlı iş akışlarını mümkün kılar:
Çalışmayı dallar arasında taşımak: Yanlış dalda kod yazmaya başladınız. Sıfırlayıp işi kaybetmek yerine stash’e alın, doğru dala geçin ve orada açın.
Görevleri yeniden düzenlemek: Bir hafta önce deneysel kodu stash’e aldınız. Şimdi onun farklı bir dalda daha iyi çalışıp çalışmadığını denemek istiyorsunuz.
Değişiklikleri farklı bağlamlarda test etmek: Bir hata düzeltmesini stash’e aldınız ve commit etmeden önce onu birden çok dalda test etmek istiyorsunuz. Stash’i saklamak için
popyerinegit stash applykullanın, farklı dallarda test edin, sonra commit etmek istediğiniz daldapopedin. Birazdanapplyhakkında daha fazlası.Değişiklikler mevcut dalınızla çakışmadığı sürece stash temiz şekilde uygulanır – hatırlamanız gereken temel fikir budur.
Git Stash Pop ve Git Stash Apply Karşılaştırması
Geliştiriciler sık sık
git stash popmı yoksagit stash applymı kullanılmalı diye düşünür.Temel fark: stash’in kalıcılığı
Ana fark basittir:
popstash’i uyguladıktan sonra kaldırır,applyise yığında tutar.popile “Bu stash işim bitti – uygula ve at” demiş olursunuz.applyile “Buna daha sonra tekrar ihtiyacım olabilir” demiş olursunuz.Bu, iş akışınızı iki şekilde etkiler:
Güvenlik: Bir
popsırasında bir şeyler ters giderse ve kurtarmanız gerekirse, stash gitmiş olur.applyile stash yığında yedek olarak kalır.Temizlik: pop kullanmak stash listenizi otomatik olarak temiz tutar.
applykullanmak, işiniz biten stash’leri kaldırmak için sonradangit stash dropçalıştırmanız gerektiği anlamına gelir.Çoğu geliştirici, daha temiz olduğu için varsayılan olarak pop kullanır. Ancak apply, stash’in mevcut dalınızda temiz çalışıp çalışmayacağından emin olmadığınızda veya aynı değişiklikleri birden çok dalda test etmek istediğinizde daha iyidir.
Öngörülebilirlik, risk ve indeks kayması
İşte
pop’un zorlaştığı yer – yığının ortasından açtığınızda stash indeksleri kayar.Diyelim üç stash’iniz var:
stash@{1}’i açarsanız, kalan stash’ler yukarı kayar:Bu, Git işlemlerini betiklerle otomatikleştiriyorsanız veya ardışık olarak birden çok pop çalıştırıyorsanız sorun yaratabilir.
stash@{1}’i açarsınız, sonrastash@{2}’yi açmayı denersiniz, ama o indeks artık yoktur.applykomutunda bu sorun yoktur. İndeksler yalnızca açıkçagit stash dropçalıştırdığınızda kayar. Yığın altınızda değişiyormuş gibi endişe etmeden stash’leri herhangi bir sırayla uygulayabilirsiniz.Çakışmaların aynı şekilde ele alınması
Her iki komut da çakışmaları aynı şekilde ele alır.
Git stash’teki değişikliklerinizi temiz şekilde birleştiremezse, dosyalarınızda çakışma işaretleri görürsünüz. Fark, stash’in başına gelenlerdedir:
popile: Pop işlemi başarıyla tamamlanmadığı için stash yığında kalırapplyile: Stash yığında kalır (zaten kalacaktı)Her iki durumda da, çakışmaları manuel olarak düzeltmeli, düzeltilen dosyaları
git addile sahnelemeli vegit stash dropile stash’i kaldırmalısınız (applykullanıyorsanız).Çakışma çözümleme iş akışı aynıdır – tek fark, başarılı olsaydı stash’in otomatik olarak silinip silinmeyeceğidir.
Her birini ne zaman seçmeli
git stash popkullanın:git stash applykullanın:Stash Pop’larda Çakışmaları Yönetmek
Git stash’teki değişikliklerinizi temiz birleştiremediğinde çakışmalar olur. Bu bölümde, onlarla nasıl başa çıkacağınızı göstereceğim.
Çakışmalar ne zaman ve neden oluşur
Bir stash’i açarken Git’in gerçekleştirdiği üç yönlü merge sırasında çakışma meydana gelir.
Git kodunuzun üç sürümünü karşılaştırır:
Aynı satırlar hem mevcut dalınızda hem de stash’te değiştiyse, Git hangi sürümün tutulacağını bilemez. Bu bir çakışmadır.
Stash pop çakışmalarının yaygın nedenleri:
Genel olarak, bir stash ne kadar uzun süre beklerse, sonunda açtığınızda çakışmayla karşılaşma olasılığınız o kadar artar.
Çakışma çözümleme iş akışı
Çakışma oluştuğunda, Git pop’u duraklatır ve dosyalarınızdaki çakışmaları işaretler:
Dosyanızda artık çakışma işaretleri var:
<<<<<<< Updated upstreamile=======arasındaki her şey mevcut kodunuzdur.=======ile>>>>>>> Stashed changesarasındaki her şey stash’ten gelir.Bunu düzeltmek için şunları yapabilirsiniz:
Çakışan dosyayı açın ve hangi sürümün kalacağına karar verin (veya her ikisini birleştirin)
Çakışma işaretlerini kaldırın (
<<<<<<<,=======,>>>>>>>)Düzeltilen dosyayı
git addile sahneleyinStash’i
git stash dropile manuel olarak kaldırın – otomatik kaybolmayacağını unutmayın.Alternatif stratejiler
Çakışmalarla mevcut dalınızda uğraşmak istemiyorsanız, bunun yerine
git stash branchkullanın.Bu komut, stash’i oluşturduğunuz commit’ten yeni bir dal oluşturur ve stash’i oraya uygular:
Git,
temp-featureadında bir dal oluşturur, onu checkout eder ve stash’inizi üzerine açar. Dal, stash’i yaptığınız commit’ten başladığı için hiç çakışma olmaz. Bunu ayrı bir bölümde daha derinlemesine ele alacağım.Başarısız bir pop’u
git reset --mergeile de iptal edebilirsiniz:Bu, pop denemesini geri alır ve çalışma dizininizi pop öncesindeki durumuna döndürür. Stash yığında kalır.
Devam eden stash işlemlerini iptal etmek
Bir pop veya apply başlattıysanız ve tamamen geri dönmek istiyorsanız seçenekleriniz var.
Henüz çözmeye başlamadığınız çakışmalar için şunu çalıştırın:
Bu, merge’ü iptal eder ve çalışma dizininizi temizler. Her şey stash komutunu çalıştırmadan önceki haline döner.
Kısmen düzelttiğiniz çakışmalar için şu komutu çalıştırın:
Bu, çalışma dizininizdeki tüm değişiklikleri, yaptığınız düzeltmeler dâhil, atar. Ortalık karıştığında ve baştan başlamak istediğinizde kullanın.
Bu komutun commit edilmemiş çalışmaları yok ettiğini unutmayın. Her şeyi gerçekten atmak istediğinizden emin olmadan çalıştırmayın.
İptalden sonra, stash hâlâ yığındadır (
popkullandıysanız ve çakışmalara gelmeden önce başarılı olduysa hariç). Daha sonra tekrar deneyebilir veya daha temiz bir yaklaşım içingit stash branchkullanabilirsiniz.Stash’leri Temizlemek
Uzun soluklu projelerde stash’ler hızla birikir. Bir hatayı düzeltmek için stash’e alır, sonra unutursunuz. Hiç açmadığınız deneysel stash’ler oluşturursunuz. Altı ay sonra, 20 stash’iniz olur ve yarısının ne içerdiğini bilmezsiniz.
Bu, gerçekten ihtiyacınız olan stash’i bulmayı zorlaştırır. İçinde ne olduğunu anlamak için her birinde
git stash show -pçalıştırmak zorunda kalırsınız.Büyük zaman kaybıdır, bu yüzden stash’lerinizi düzenli olarak temizlemeyi unutmayın.
Tekil stash’leri düşürmek
git stash dropkullanarak belirli bir stash’i kaldırın:Bu,
stash@{2}’yi yığından siler. Kalan stash’ler yukarı kayar –stash@{3}olanstash@{2}olur.Bir indeks belirtmeden en son stash’i de düşürebilirsiniz:
Bu, varsayılan olarak
stash@{0}’ı kaldırır.Yıllar içinde Git ile çalışırken, stash’leri düşürmek için başlıca nedenlerim şunlar oldu:
Bir stash’i düşürüp düşürmemekte kararsızsanız, önce
git stash show -pile inceleyin. Tedbirli olmakta fayda var.Tüm stash yığınını temizlemek
git stash clearkullanarak tüm stash’leri bir seferde silebilirsiniz:Bunun kalıcı olduğunu unutmayın. Geri alamaz veya sonradan stash’leri kurtaramazsınız.
git stash clear’ı yalnızca stash’lenmiş hiçbir çalışmaya ihtiyacınız olmadığından kesinlikle emin olduğunuzda kullanın.Çoğu zaman, yanlışlıkla ihtiyacınız olan bir şeyi silmemek için stash’leri tek tek düşürmek daha iyidir.
Stash’lerden Dal Oluşturma
Bazen en temiz çözüm, bir stash’i kendi dalına dönüştürmektir. Bu, merge çakışmalarından kaçınır ve stash’lenmiş çalışmanıza düzgün bir yuva verir.
git stash branch kullanımı
git stash branchkomutu yeni bir dal oluşturur ve stash’inizi ona uygular:Şunlar olur:
Git, stash’i oluşturduğunuz commit’ten
feature-experimentadında yeni bir dal oluştururGit bu yeni dalı checkout eder
Git stash’i dalın üzerine açar
Git, stash’i yığından kaldırır (tıpkı
popgibi)Dal, stash ile tam olarak aynı commit’ten başladığı için çakışma olmaz. Değişiklikler her seferinde temiz şekilde uygulanır.
En güncel olan yerine belirli bir stash’i de kullanabilirsiniz:
Yaygın kullanım durumları
Bir stash’ten dal oluşturmak, deneysel özellikler için idealdir. Diyelim ki bir hafta önce deneysel kodu stash’e aldınız ve şimdi mevcut işinizi bozmadan düzgünce geliştirmek istiyorsunuz.
Deney üzerinde çalışmak için temiz bir dal elde edersiniz. İşe yararsa geri birleştirirsiniz. Yaramazsa dalı siler ve devam edersiniz.
Uzun süren rebaseler için de harikadır. Rebase sırasında potansiyel çakışmalarla uğraşmak yerine, her şeyi stash’e alıp ondan bir dal oluşturabilirsiniz.
Şimdi stash’lenmiş değişiklikleri ayrı ayrı gözden geçirip rebase’den sonra nasıl entegre edeceğinize karar verebilirsiniz.
Dal oluşturmak, büyük veya dağınık değişiklikleri izole etmek için de kullanışlıdır. 15 dosyada değişiklik içeren dev bir stash’iniz olduğunu ve bunların yarısının mevcut dalınızla çakıştığını düşünün. Yeni bir dal oluşturun – mücadele etmeye gerek yok.
Böylece her şeyi sakin sakin gözden geçirebileceğiniz, düzgünce commit’leyebileceğiniz ve net bir geçmişle geri birleştirebileceğiniz özel bir dalınız olur.
İleri Teknikler ve Kurtarma Seçenekleri
Artık
git stash’in temellerine hâkimsiniz, şimdi size daha ileri kavramlar göstereyim.Belirli stash girişleriyle çalışma
Yalnızca en son olan değil, yığınızdaki herhangi bir stash’i açabilir veya uygulayabilirsiniz.
İhtiyacınız olana tam olarak erişmek için stash’lere indeksleriyle referans verin:
Bu, daha yeni olanlara dokunmadan eski stash’leri almanızı sağlar. Aradaki bir stash’i açtığınızda, altındaki tüm indeksler yukarı kayar.
stash@{4}olanstash@{3}olur, vb. Git işlemlerini betikliyorsanız veya ardışık olarak birden çok stash açıyorsanız bu indeks kayması komutlarınızı bozacaktır.Çözüm, öngörülebilir indekslere ihtiyaç duyduğunuzda
popyerineapplykullanmaktır:Bu, yığının ne zaman değişeceği üzerinde tam kontrol sağlar. Stash’i uygular, doğru çalıştığını doğrular, sonra kendiniz düşürürsünüz. İndeksler yalnızca açıkça söylediğinizde kayar.
Sahneleme durumunu geri yüklemek
Varsayılan olarak,
git stash popvegit stash applydeğişikliklerinizi geri yükler ancak sahnelenmiş olanları korumaz.Diyelim üç dosyayı değiştirdiniz ve stash’ten önce bunlardan ikisini commit için sahnelediniz. O stash’i açtığınızda, üç dosya da sahnelenmemiş değişiklikler olarak geri gelir. Git hangi dosyaları commit etmek istediğinizi unutur.
Çözüm, sahneleme durumunu aynen geri yüklemek için
--indexbayrağını kullanmaktır:Bu, stash öncesindeki çalışma ağacınızı ve index’inizi aynen yeniden oluşturur. Sahnelenen dosyalar sahnelenmiş kalır. Sahnelenmemişler sahnelenmemiş kalır. Her şey tam eski haline döner.
Bu bayrağa şu durumlarda ihtiyaç duyarsınız:
Özenle hazırladığınız bir commit’in ortasındasınız ve sahneleme bilgisini kaybetmeyi göze alamıyorsunuz
Dosyalardan yalnızca belirli parçaları sahnelemek için git add
-pgibi karmaşık sahneleme senaryoları kullandığınızdaİstisnasız şekilde çalışma dizininizin stash öncesiyle birebir aynı görünmesini istediğinizde
Çoğu zaman bu bayrağa ihtiyaç duymazsınız. Stash’i açar, ne geldiğine bakar ve ihtiyacınızı sahnelersiniz.
Stash hatalarından kurtulma
Er ya da geç, ihtiyacınız olan bir stash’i düşürecek veya tüm yığınınızı yanlışlıkla temizleyeceksiniz.
Böyle olursa, Git’in reflog’u günü kurtarabilir.
Reflog, depodaki her referans değişikliğini – stash’ler dahil – izler. Bir stash oluşturduğunuzda veya düşürdüğünüzde, Git bunu reflog’a kaydeder. Stash’i düşürdükten sonra bile commit’ler bir süre erişilemeyen nesneler olarak var olmaya devam eder.
Erişilemeyen commit’leri arayarak kayıp stash’inizi bulabilirsiniz:
Şimdi stash’inizi bulmak için her commit’i kontrol edebilirsiniz:
Doğru olanı belirlemek için diff’e ve commit mesajına bakın. Doğru commit’i bulduğunuzda, geri yükleyin:
Bu, kayıp stash’i sanki hiç düşürülmemiş gibi çalışma dizininize uygular.
Daha da iyisi, şu en iyi uygulamaları izleyerek hataları en baştan önleyin:
Ne düşürdüğünüzü tam bilmeniz için açıklayıcı stash mesajları yazın. Beş stash içeren bir listeye bakarken "WIP" yerine "Giriş hatasını düzelt" daha iyidir.
Düşürmeden önce doğru stash olduğundan emin olmak için
git stash show -pkullanın. Beş dakika kurtarmaya harcamaktansa beş saniye doğrulamaya ayırın.Yığının dağınık hâle gelmemesi için stash yığınınızı düzenli olarak temizleyin. Üç alakalı stash içeren bir yığın, 15 eski kaydı olana göre daha kolay yönetilir.
popile stash’i silmekten yüzde 100 emin olmadığınızdaapplykullanın. Her şeyin yolunda olduğunu doğruladıktan sonra her zaman düşürebilirsiniz.Reflog ile kurtarma işe yarar ama zahmetlidir. Sırf yukarıdaki görselden bile, elle kontrol etmem gereken kaç commit olduğunu görebilirsiniz – üstelik bu yazı için oluşturulmuş küçük bir projedir.
En İyi Uygulamalar ve İş Akışı Rehberi
Stash’leri iyi kullanmak, hataları önleyen ve iş akışınızı temiz tutan kalıpları izlemek demektir. Kendi başvurduğum yaklaşımı göstereyim.
Önerilen iş akışı kalıpları
En güvenli stash iş akışı basit bir kalıbı izler: mesajla stash’e al, bağlam değiştir, devam etmeye hazır olduğunda aç.
Bu, çoğu durum için çalışır. Çalışmanızı korur, araya giren işi halleder ve her şeyi temizce geri yüklersiniz.
Bir diğer yaygın kalıp "pop’tan önce incele" iş akışıdır. Stash’lerinizi listeler, içindekileri inceler ve doğru olanı açarsınız.
Bu ek doğrulama adımı, yanlış stash’i açmanızı veya güncelliğini yitirmiş çalışmaları uygulamanızı önler.
Bazı geliştiriciler, stash yerine "gönülsüz commit" alternatifini tercih eder. Stash yapmak yerine, "WIP - hazır değil" gibi bir mesajla geçici bir commit yapar, sonra onu amend eder veya resetler. Stash’lerle rahat değilseniz veya çalışmanın dal geçmişinde izlenmesini istiyorsanız işe yarar. Dezavantajı, temizlemeyi unutursanız dağınık commit günlüklerine yol açmasıdır.
Geliştirme araçlarıyla entegrasyon
Çoğu Git GUI’si stash’lerinizi görsel olarak gösterir ve tek tıkla açmanıza veya uygulamanıza izin verir.
GitKraken, Sourcetree ve GitHub Desktop gibi araçlar, stash’lerinizi bir kenar çubuğunda listeler. Mesajı görebilir, diff’i inceleyebilir ve komut yazmadan stash’leri uygulayabilir veya düşürebilirsiniz. Birden fazla stash’iniz olduğunda ve yan yana karşılaştırmak istediğinizde kullanışlıdır.
VS Code’un Git uzantısı, kaynak kontrol panelinde stash’leri gösterir. Editörden çıkmadan sağ tıklayarak açabilir, uygulayabilir veya düşürebilirsiniz.
Komut satırını tercih ediyorsanız kabuk kısayolları stash’i hızlandırır. Bunları
.bashrcveya.zshrcdosyanıza ekleyin:Artık gst çalışmanızı stash’e alır,
gstpaçar,gstlstash’lerinizi listeler vegstsdiff’i gösterir. Her seferinde birkaç tuşa basmaktan kurtulursunuz.Stash hijyeni ve ekip dikkate alınacakları
Stash’ler makinenize özeldir – uzak depolara asla itilmezler.
Bu, ekip arkadaşlarınızın stash’lerinizi göremeyeceği ve başka bir bilgisayardan onlara erişemeyeceğiniz anlamına gelir. Devam eden çalışmayı paylaşmanız gerekiyorsa, stash’e almayın. Bunun yerine patch’ler veya geçici dallar kullanın.
Patch ile paylaşmak için şunları çalıştırın:
Şimdi patch dosyasını ekip arkadaşınıza gönderin,
git apply my-work.patchçalıştırarak uygulayacaklardır.Geçici dallarla paylaşmak için şunu çalıştırın:
Ekip arkadaşınız dalı çekebilir, işi gözden geçirebilir ve oradan devam edebilir.
Hangi yaklaşımı tercih ederseniz edin, her zaman iyi bir stash hijyeni sürdürün. Bu, karışıklığı önler ve yerel yığınızı yönetilebilir tutar. İzlemeniz gereken bazı iyi uygulamalar şunlardır:
Her stash için açıklayıcı adlar kullanın. "Kullanıcı yetkilendirme mantığını ekle" içinde ne olduğunu söyler. "WIP on feature-branch" hiçbir şey söylemez.
Stash’lerinizi haftalık temizleyin.
git stash listçalıştırın ve bir haftadan eski olan her şeyi düşürün. Yedi gündür ihtiyaç duymadıysanız, muhtemelen hiç duymayacaksınız.Stash sayınızın beşi geçmesine izin vermeyin. Beşten fazla stash, onları geçici bekletme yerine uzun vadeli depolama olarak kullandığınız anlamına gelir. Ya açın, çalışmayı commit’leyin ya da düşürün.
Bir ekipte çalışıyorsanız ve biri "Üzerinde çalıştığın kod nerede?" diye sorarsa, asla "Stash’imde" diye cevap vermeyin. Stash’ler özeldir ve geçicidir – paylaşıma veya önemli işleri arşivlemeye uygun değildir.
Sonuç
Artık
git stash pop’ın nasıl çalıştığını ve ne zaman kullanılacağını biliyorsunuz.Özünde stash basittir: commit edilmemiş çalışmanızı kaydedin, bağlam değiştirin ve sonra geri yükleyin. Ancak detaylar önemlidir.
popileapplyarasındaki farkı bilmek, çakışmaları nasıl yöneteceğinizi ve stash’lerden ne zaman dal oluşturacağınızı anlamak, saatlerce sürecek can sıkıntısından kurtarır.En önemli çıkarım, stash’lerin geçici depolama olduğudur, kalıcı yedekler değil. Açıklayıcı mesajlar kullanın, düzenli olarak temizleyin ve yığının beş girdiyi aşmasına izin vermeyin. Çalışmayı paylaşmanız veya uzun süre saklamanız gerekiyorsa, onun yerine bir dala commit edin.
Bu makaleden keyif aldıysanız ve Git’te kendinizi geliştirmek istiyorsanız, bir sonraki durağınız Intermediate Git ve Intermediate GitHub Concepts kurslarımız olmalıdır.