Ana içeriğe geç

Git Stash Pop: Dallar Arasında Geçiş Yaparken Çalışmanızı Koruyun

Dallar arasında geçiş yaparken commit edilmemiş çalışmayı kaydedip, kod kaybetmeden daha sonra geri yüklemeyi öğrenin.
· 15 dk. oku

Yapay Zeka ile Keşfedin

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:

  1. Acil iş için dal değiştirmek: Bir özelliğin ortasındasınız ve prod’daki bir hatayı düzeltmeniz gerekiyor.
  2. Uzak değişiklikleri çekmek: Ekip arkadaşınız güncellemeleri itti ve sizin de çekmeniz gerekiyor, ancak yerelde değişiklikleriniz var.
  3. 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.
  4. 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:

  1. Çalışma dizini değişiklikleriniz
  2. Sahnelediğiniz değişiklikler (index)
  3. İ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:

Görsel 1 - Örnek git stash list çıktısı

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:

git stash

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:

git stash push -m "Updated file.txt"

Artık stash listeniz gerçekten bilgilendirici:

Görsel 2 - Mesajlı ve mesajsız git stash

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.

Şöyle olur:

echo "new_feature.py" > new_feature.py
git stash

Dosya stash’e alınmadı çünkü Git henüz onu izlemiyor:

Görsel 3 - İzlenmeyen bir dosyayı stash etmeye çalışmak

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"

Bu, hem izlenen hem izlenmeyen dosyaları stash’e alır. Çalışma dizininiz tamamen temizlenir.

Görsel 4 - İzlenmeyen bir dosyayı stash’e almak

İ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:

  1. Bayrak yok: Yalnızca mevcut dosyaları değiştirdiniz

  2. u bayrağı: Henüz izlenmeyen yeni dosyalar eklediniz

  3. 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 stash push -m "New files" new_file.txt new_file_2.txt

Bu, yalnızca new_file.txt ve new_file_2.txt dosyalarını stash’e alır. Diğer her şey çalışma dizininizde kalır.

Görsel 5 - Yalnızca seçilen dosyaları stash’e alma

Joker karakterler de kullanabilirsiniz:

git stash push -m "Stash all txt files" *.txt

Ya da etkileşimli stash için --patch kullanabilirsiniz:

git stash push --patch

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:

Görsel 6 - Patch örneği

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:

Görsel 7 - Stash’leri listeleme

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:

Görsel 8 - Stash özeti

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:

Görsel 9 - Tüm stash farkı

-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.

Temel sözdizimi şöyledir:

git stash pop

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:

git stash pop stash@{1}

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.

Görsel 10 - Belirli bir stash’i açmak

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:

  1. Temeli oluşturan commit (stash’i oluşturduğunuz yer)
  2. Geçerli HEAD commit’iniz
  3. 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ışıyorsunuz
echo "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ın
git checkout bugfix
echo "bug fix" >> bugfix.py
git add bugfix.py
git commit -m "Fix critical bug"

# Diğer dala geri dönün
git checkout main

# Stash’i açın
git stash pop

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:

  1. Ç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.

  2. 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.

  3. 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:

  1. 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.

  2. 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.

Ö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@{0}: Feature work
stash@{1}: Bug fix
stash@{2}: Experimental code

stash@{1}’i açarsanız, kalan stash’ler yukarı kayar:

stash@{0}: Feature work
stash@{1}: Experimental code

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:

  1. pop ile: Pop işlemi başarıyla tamamlanmadığı için stash yığında kalır

  2. 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:

  1. Bir stash’i bir kez uygulayıp işinizi bitirdiğinizde
  2. Stash listenizin otomatik olarak temiz kalmasını istediğinizde
  3. Tek bir dalda çalışıyorsanız ve stash’e başka yerde ihtiyaç duymuyorsanız

git stash apply kullanın:

  1. Aynı değişiklikleri birden çok dalda test etmek istediğinizde
  2. Stash’in temiz uygulanacağından emin olmadığınızda
  3. Git işlemlerini betikliyorsanız ve öngörülebilir indekslere ihtiyaç duyuyorsanız
  4. 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:

  1. Stash’i oluşturduğunuz temel commit
  2. Geçerli HEAD commit’iniz
  3. 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:

  1. 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
  2. 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
  3. 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:

  1. Çakışan dosyayı açın ve hangi sürümün kalacağına karar verin (veya her ikisini birleştirin)

  2. Çakışma işaretlerini kaldırın (<<<<<<<, =======, >>>>>>>)

  3. Düzeltilen dosyayı git add ile sahneleyin

  4. Stash’i git stash drop ile 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 branch kullanın.

Bu komut, stash’i oluşturduğunuz commit’ten yeni bir dal oluşturur ve stash’i oraya uygular:

git stash branch temp-feature

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şur

git reset --merge

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:

git reset --merge

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:

git reset --hard HEAD

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:

git stash drop stash@{2}

Bu, stash@{2}’yi yığından siler. Kalan stash’ler yukarı kayar – stash@{3} olan stash@{2} olur.

Bir indeks belirtmeden en son stash’i de düşürebilirsiniz:

git stash drop

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:

  1. Artık değişikliklere ihtiyacınız olmadığını fark edersiniz
  2. Çift stash’leriniz vardır (düşündüğünüzden daha sık olur)
  3. Bir stash o kadar eskidir ki ne için olduğunu hatırlamazsınız

Bir stash’i düşürüp düşürmemekte kararsızsanız, önce git stash show -p ile inceleyin. Tedbirli olmakta fayda var.

Tüm stash yığınını temizlemek

git stash clear kullanarak tüm stash’leri bir seferde silebilirsiniz:

git stash clear

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 branch komutu yeni bir dal oluşturur ve stash’inizi ona uygular:

Şunlar olur:

  1. Git, stash’i oluşturduğunuz commit’ten feature-experiment adında yeni bir dal oluşturur

  2. Git bu yeni dalı checkout eder

  3. Git stash’i dalın üzerine açar

  4. Git, stash’i yığından kaldırır (tıpkı pop gibi)

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:

git stash branch new-feature stash@{2}

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.

git stash push -m "WIP before rebase"
git rebase main
git stash branch temp-work

Ş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}

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ün
git stash drop stash@{2}

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:

git stash pop --index

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:

  1. Özenle hazırladığınız bir commit’in ortasındasınız ve sahneleme bilgisini kaybetmeyi göze alamıyorsunuz

  2. Dosyalardan yalnızca belirli parçaları sahnelemek için git add -p gibi karmaşık sahneleme senaryoları kullandığınızda

  3. İ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:

git fsck --unreachable | grep commit

Erişilemeyen commit’leri arama

Şimdi stash’inizi bulmak için her commit’i kontrol edebilirsiniz:

git show 066ded985342e585bc8e75c074add99ec1950f50

Doğru olanı belirlemek için diff’e ve commit mesajına bakın. Doğru commit’i bulduğunuzda, geri yükleyin:

git stash apply 066ded985342e585bc8e75c074add99ec1950f50

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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ön
git checkout feature-branch
git stash pop

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}

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:

alias gst='git stash'
alias gstp='git stash pop'
alias gstl='git stash list'
alias gsts='git stash show -p'

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.patch

Ş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:

git checkout -b temp/work-in-progress
git add .
git commit -m "WIP - authentication feature"
git push origin temp/work-in-progress

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

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.

Dario Radečić

Yazar

Dario Radečić

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.

Konular

İlgili