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.
