Git Stash Kullanımı: Yarım Kalan Değişiklikleri Geçici Olarak Saklama

Bir proje üzerinde çalışırken telefon çalıyor, patron acil bir bug fix istiyor ya da ekip arkadaşın “bir dakika bakabilir misin?” diye geliyor. Tam ortasında olduğun değişiklikler ne olacak? Commit etmek için hazır değil, branch değiştirmen lazım ama çalışma dizinin kirli. İşte tam bu noktada git stash hayat kurtarıcı oluyor. Bu yazıda git stash’i tüm detaylarıyla ele alacağız, gerçek dünya senaryolarıyla nasıl kullanacağını göstereceğiz.

Git Stash Nedir?

Git stash, üzerinde çalıştığın ama henüz commit etmeye hazır olmadığın değişiklikleri geçici olarak bir kenara kaldırmanı sağlayan bir mekanizmadır. Çalışma dizinini ve staging area’yı temizler, böylece başka bir branch’e geçebilir ya da farklı bir iş yapabilirsin. Sonra döndüğünde stash’lediğin değişiklikler tam seni bıraktığın yerden bekliyor olur.

Stash’i bir “geçici çekmece” gibi düşünebilirsin. Masanın üstündeki dağınık kağıtları çekmeceye koyarsın, işini halledersin, sonra çekmeceyi açıp kaldığın yerden devam edersin.

Temel Kullanım

İlk Stash’i Oluşturmak

En basit kullanım şekliyle stash komutu:

git stash

Bu kadar. Bu komut, hem staged (index’e eklenmiş) hem de unstaged (değiştirilmiş ama henüz add edilmemiş) dosyaları saklar. Çalışma dizinin temizlenir, sanki hiç değişiklik yapmamışsın gibi olur.

Daha açıklayıcı bir mesajla stash oluşturmak istersen:

git stash push -m "kullanici-giris-formu-yarida-kaldi"

Mesaj eklemek özellikle birden fazla stash biriktirdiğinde hayat kurtarır. İki hafta sonra “bu stash ne için?” diye bakmak zorunda kalmazsın.

Stash Listesini Görüntülemek

git stash list

Çıktı şöyle görünür:

stash@{0}: On feature/login: kullanici-giris-formu-yarida-kaldi
stash@{1}: On main: WIP on header component
stash@{2}: On develop: database migration script draft

Her stash’in bir indeksi var. stash@{0} en son eklenen, stash@{1} ondan önceki. Bu listeyi iyi yönetmek önemli çünkü zamanla uzayıp gidebilir.

Stash’i Geri Yüklemek

İki temel yöntem var:

# Stash'i uygula ama listeden silme
git stash apply

# Stash'i uygula ve listeden sil
git stash pop

Aralarındaki fark kritik. apply stash’i korur, tekrar kullanabilirsin. pop ise uygular ve siler. Çoğu durumda pop kullanmak daha temizdir ama aynı stash’i birden fazla branch’e uygulamak istiyorsan apply lazım.

Belirli bir stash’i uygulamak için:

git stash pop stash@{2}

Gerçek Dünya Senaryoları

Senaryo 1: Acil Hotfix Durumu

Sabah geldin, yeni feature üzerinde çalışmaya başladın. Öğleden sonra production’da kritik bir bug raporu geldi. Tam ortasında yarım kalmış değişikliklerin var.

# Mevcut durumu kontrol et
git status
# Modified: src/components/UserForm.js
# Modified: src/styles/form.css
# Untracked: src/utils/validation.js

# Değişiklikleri sakla
git stash push -m "kullanici-formu-yeni-validasyon-yarida"

# Hotfix branch'ine geç
git checkout main
git checkout -b hotfix/critical-login-bug

# Bug'ı düzelt, test et, commit et
git add .
git commit -m "fix: production login bug resolved"
git checkout main
git merge hotfix/critical-login-bug

# Feature branch'ine geri dön
git checkout feature/user-form
git stash pop

İşte bu kadar. Hotfix’i hallettikten sonra tam kaldığın yerden devam edebilirsin.

Senaryo 2: Yanlış Branch’te Çalışma

Bu hepimizin başına gelmiştir. main branch’inde olduğunu unuttun ve bir saat boyunca feature geliştirdin.

# Dur bir dakika, hangi branch'tesin?
git branch
# * main
#   feature/payment

# Paniğe gerek yok, stash kullan
git stash push -m "payment-feature-yanlis-branche-yapildi"

# Doğru branch'e geç
git checkout feature/payment

# Değişiklikleri geri al
git stash pop

Değişikliklerin kaybolmadı, doğru yere taşındı. Günü kurtardın.

Senaryo 3: Deneysel Kodu Saklamak

Bazen bir yaklaşımı deniyorsun ama çalışıp çalışmadığından emin değilsin. Temiz bir durumda başka bir yaklaşımı test etmek istiyorsun.

# Deneysel yaklaşım 1'i sakla
git stash push -m "deneysel-caching-yaklaşimi-1"

# Temiz ortamda yaklaşım 2'yi dene
# ... geliştirme yapıyorsun ...

# Yaklaşım 1 aslında daha iyiydi, geri al
git stash list
git stash pop stash@{0}

Gelişmiş Stash Kullanımı

Untracked ve Ignored Dosyaları Dahil Etmek

Varsayılan olarak git stash sadece tracked dosyaları saklar. Yeni oluşturduğun ama henüz git add yapmadığın dosyalar stash’e girmez.

# Untracked dosyaları da dahil et
git stash push -u
# ya da
git stash push --include-untracked

# Hem untracked hem ignored dosyaları dahil et
git stash push -a
# ya da
git stash push --all

Dikkatli ol, --all seçeneği node_modules gibi büyük dizinleri de alabilir. Genellikle -u yeterli olur.

Belirli Dosyaları Stash’lemek

Tüm değişiklikleri değil, sadece belirli dosyaları saklamak isteyebilirsin:

git stash push -m "sadece-css-degisiklikleri" -- src/styles/main.css src/styles/components.css

Bu özellik özellikle birbirine karışmış iki ayrı işi ayırt etmen gerektiğinde çok işe yarıyor.

Staging Area’yı Korumak

Stash uyguladığında normalde değişiklikler unstaged olarak gelir. Eğer staging area durumunu korumak istiyorsan:

git stash pop --index
# ya da
git stash apply --index

Bu komut hangi dosyaların staged, hangilerinin unstaged olduğunu hatırlar ve geri yüklerken aynı durumu oluşturur.

Stash’ten Yeni Branch Açmak

Stash’i uygulamak istediğin anda çakışma sorunları çıkabilir, çünkü üst üste değişiklikler olabilir. Bu durumda stash’i direkt yeni bir branch üzerinde açmak daha temiz bir yol:

git stash branch yeni-branch-adi stash@{0}

Bu komut şunları yapar: stash’in oluşturulduğu commit’ten yeni bir branch açar, stash’i o branch’e uygular ve başarılı olursa stash’i listeden siler. Çakışma riski minimuma iner.

Stash İçeriğini İncelemek

Nelerin Saklandığını Görmek

# Stash'teki değişikliklerin özetini gör
git stash show

# Detaylı diff görmek için
git stash show -p

# Belirli bir stash için
git stash show -p stash@{1}

Bu komutlar özellikle “bu stash’te ne vardı acaba?” diye bakarken çok kullanışlı.

Stash ile Diff Almak

Mevcut çalışma dizinini bir stash ile karşılaştırmak istersen:

git diff stash@{0}

Ya da iki stash’i birbiriyle karşılaştırmak:

git diff stash@{0} stash@{1}

Stash Yönetimi

Tek Bir Stash’i Silmek

git stash drop stash@{1}

Tüm Stash’leri Temizlemek

git stash clear

Dikkat: Bu komut geri alınamaz. Tüm stash’ler kalıcı olarak silinir. Kullanmadan önce git stash list ile bir göz at.

Stash’leri Düzenli Temizleme Alışkanlığı

Zamanla stash listesi büyüyebilir ve kafa karışıklığı yaratabilir. Şu pratiği benimse: Bir stash’i başarıyla uyguladıktan sonra hemen drop et. İşe yaramayan deneysel stash’leri biriktirme. Haftada bir git stash list çalıştır ve eski, gereksiz stash’leri temizle.

Stash ile Çakışma Durumları

Stash oluşturduğun zamandan farklı değişiklikler yapılmışsa pop/apply sırasında çakışma olabilir:

git stash pop
# Auto-merging src/components/Header.js
# CONFLICT (content): Merge conflict in src/components/Header.js

Bu durumda normal merge çakışması gibi çözümlenir:

# Çakışan dosyaları düzenle
# Sonra staging'e al
git add src/components/Header.js

# Stash pop başarısız olursa stash hala listede kalır
# Elle drop etmen gerekir
git stash drop

Önemli bir not: git stash pop başarısız olduğunda stash otomatik olarak silinmez. Çakışmayı çözdükten sonra manuel olarak git stash drop yapman gerekir.

Stash ve Git Workflow Entegrasyonu

Feature Branch Workflow ile Kullanım

Tipik bir git flow senaryosu:

# Feature branch üzerinde çalışıyorsun
git checkout feature/user-dashboard

# Değişiklikler yaptın
# ... kod yazıyorsun ...

# Develop branch'i güncellenmiş, senkron olmak istiyorsun
git stash push -m "dashboard-progress"

git checkout develop
git pull origin develop

git checkout feature/user-dashboard
git rebase develop

# Stash'i geri al
git stash pop

CI/CD Pipeline’larında Dikkat Edilecekler

Otomatik deployment scriptlerinde stash kullanıyorsan şunu aklında tut: Stash’ler local’e özgüdür, remote’a push edilmez. Eğer farklı bir makinede çalışmak zorunda kalırsan stash’lerin orada olmayacak. Kritik yarım kalan işler için WIP commit kullanmak daha güvenli olabilir:

# WIP commit alternatifi
git add -A
git commit -m "WIP: dashboard geliştirmesi devam ediyor"

# İşini hallettikten sonra geri al
git reset HEAD~1

Pratik İpuçları ve Tuzaklar

İpucu 1: Anlamlı Mesajlar Yaz

# Kötü
git stash

# İyi
git stash push -m "2024-01-15-payment-module-cart-integration-yarida"

Tarih eklemek bazen ne zaman oluşturulduğunu anlamana yardımcı olur.

İpucu 2: Stash Alias Tanımla

Sık kullandığın stash komutları için git alias tanımlayabilirsin:

git config --global alias.sl "stash list"
git config --global alias.sp "stash pop"
git config --global alias.ss "stash push -u -m"

Artık git ss "mesajim" ile hem untracked dosyaları dahil eden hem de mesajlı stash oluşturabilirsin.

İpucu 3: Stash’i Unutma

Stash’i oluşturduktan sonra unutup haftalarca bırakma. Bir stash oluşturursan mutlaka bir TODO veya takvim hatırlatıcısı bırak. Eski stash’ler kafa karışıklığı yaratır.

Tuzak 1: Merge Sırasında Stash Kullanmak

Aktif bir merge işlemi varken stash yapmaya çalışırsan sorun yaşarsın. Önce merge’i tamamla ya da iptal et.

Tuzak 2: Submodule’lerde Stash

Git submodule’leri olan projelerde stash bazen beklenmedik davranışlar gösterebilir. Submodule değişikliklerini ayrıca yönetmen gerekebilir.

Tuzak 3: Çok Fazla Stash Biriktirmek

Stash listende 10’dan fazla entry varsa bir şeyler yanlış gidiyor demektir. Ya düzenli olarak temizlemiyorsun ya da iş akışında bir sorun var. Stash uzun vadeli depolama için değil, geçici köprü için tasarlanmıştır.

Stash’i Ne Zaman Kullanmamalısın?

Her şeyde olduğu gibi stash’in de sınırları var:

  • Uzun süreli saklama için: Birkaç günden fazla saklanacak değişiklikler için WIP commit ya da ayrı bir branch daha uygun.
  • Takım paylaşımı için: Stash’ler local, başkasına aktaramazsın. Paylaşmak istiyorsan commit et.
  • Karmaşık bağımlılıklar için: Çok sayıda dosyayı etkileyen büyük değişiklikleri stash’lemek çakışma riskini artırır.
  • Kritik üretim değişiklikleri için: Hotfix gibi kritik durumlar için bile önce düzgün bir branch aç, sonra stash kullan.

Sonuç

Git stash, doğru kullanıldığında iş akışını ciddi ölçüde iyileştiren bir araç. Temel kullanımı basit: git stash push ile sakla, git stash pop ile geri al. Ama üzerine inşa edilen seçenekler ve senaryolar onu gerçek anlamda güçlü yapıyor.

Pratik özet olarak şunları aklında tut: Her stash’e anlamlı bir mesaj ekle, untracked dosyalar için -u bayrağını kullan, pop başarısız olursa manuel drop et ve stash listeni düzenli temizle. Uzun vadeli bir şey saklamak istiyorsan branch aç, stash’i geçici köprü olarak kullan.

Artık ortasında bırakman gereken her çalışmada paniğe kapılmak yok. Stash’le, işini hallet, geri dön. Basit ama etkili.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir