Git İleri Seviye: Rebase, Cherry-Pick, Stash Rehberi

Git İleri Seviye: Rebase, Cherry-Pick, Stash Rehberi
Git, modern yazılım geliştirmenin vazgeçilmez versiyon kontrol sistemidir. Temel komutları (add, commit, push) bilmek başlangıç için yeterli olsa da, profesyonel projelerde ileri seviye Git komutlarına hakim olmak büyük fark yaratır. Bu rehberde rebase, cherry-pick, stash ve diğer güçlü Git komutlarını detaylı örneklerle inceliyoruz.
Git Rebase Nedir?
Rebase, bir branch'in başlangıç noktasını değiştirerek commit geçmişini yeniden düzenleyen güçlü bir komuttur. Merge'den farklı olarak, rebase daha temiz ve lineer bir commit history oluşturur.
# feature branch'inizi main üzerine rebase edin
git checkout feature/user-auth
git rebase main
# Interactive rebase ile son 5 commit'i düzenleyin
git rebase -i HEAD~5
# Interactive rebase sırasında kullanabileceğiniz komutlar:
# pick - commit'i olduğu gibi kullan
# reword - commit mesajını değiştir
# edit - commit'i değiştirmek için dur
# squash - önceki commit ile birleştir
# fixup - squash gibi ama mesajı at
# drop - commit'i sil
Rebase vs Merge Karşılaştırması
| Özellik | Rebase | Merge |
|---|---|---|
| Commit History | Lineer, temiz | Merge commit'leri ile dallanmış |
| Orijinal Commit'ler | Yeniden yazılır | Korunur |
| Çakışma Çözümü | Her commit için ayrı ayrı | Tek seferde |
| Kullanım Alanı | Yerel branch'ler | Paylaşılan branch'ler |
Git Cherry-Pick ile Seçici Commit Aktarımı
Cherry-pick, belirli bir commit'i başka bir branch'e uygulamanızı sağlar. Tüm branch'i merge etmeden sadece ihtiyacınız olan değişiklikleri alabilirsiniz.
# Tek bir commit'i mevcut branch'e uygula
git cherry-pick abc1234
# Birden fazla commit'i sırayla uygula
git cherry-pick abc1234 def5678 ghi9012
# Commit aralığını uygula (ilk commit dahil değil)
git cherry-pick abc1234..ghi9012
# Commit aralığını uygula (ilk commit dahil)
git cherry-pick abc1234^..ghi9012
# Cherry-pick yap ama commit etme (staging'de bırak)
git cherry-pick --no-commit abc1234
# Çakışma durumunda cherry-pick'i iptal et
git cherry-pick --abort
# Çakışmayı çözdükten sonra devam et
git cherry-pick --continue
Git Stash: Değişiklikleri Geçici Olarak Saklama
Stash, üzerinde çalıştığınız değişiklikleri commit etmeden geçici olarak kaydetmenizi sağlar. Branch değiştirmeniz gerektiğinde veya temiz bir working directory istediğinizde son derece faydalıdır.
# Değişiklikleri stash'e kaydet
git stash
# Açıklayıcı mesajla stash oluştur
git stash save "login form validation düzenlemesi"
# Untracked dosyaları da dahil et
git stash -u
# Stash listesini görüntüle
git stash list
# stash@{0}: On feature/auth: login form validation düzenlemesi
# stash@{1}: WIP on main: abc1234 Son commit mesajı
# En son stash'i uygula ve listeden kaldır
git stash pop
# Belirli bir stash'i uygula (listeden kaldırmadan)
git stash apply stash@{1}
# Stash'in içeriğini görüntüle
git stash show -p stash@{0}
# Belirli bir stash'i sil
git stash drop stash@{1}
# Tüm stash'leri temizle
git stash clear
Git Reflog: Kayıp Commit'leri Kurtarma
Reflog, Git'in gizli süper gücüdür. HEAD'in tüm hareketlerini kaydeder ve yanlışlıkla sildiğiniz commit'leri, branch'leri veya rebase sonrası kaybolmuş gibi görünen değişiklikleri kurtarmanızı sağlar.
# Reflog'u görüntüle
git reflog
# Belirli bir branch'in reflog'u
git reflog show feature/auth
# Kayıp commit'i kurtarmak için
git reflog
# abc1234 HEAD@{5}: commit: önemli değişiklik
git checkout -b recovery-branch abc1234
# Yanlışlıkla yapılan reset'i geri al
git reset --hard HEAD@{2}
gc.reflogExpire ayarı ile değiştirilebilir. Ancak git gc çalıştırılmadığı sürece erişilemeyen commit'ler silinmez.
Git Bisect: Hata Kaynaklarını Bulma
Bisect, binary search algoritması kullanarak bir hatanın hangi commit'te ortaya çıktığını bulmanızı sağlar. Yüzlerce commit arasında hata aramak yerine, bisect ile logaritmik zamanda bulabilirsiniz.
# Bisect oturumunu başlat
git bisect start
# Mevcut commit'i "kötü" olarak işaretle
git bisect bad
# Çalışan bir commit'i "iyi" olarak işaretle
git bisect good v1.0.0
# Git otomatik olarak ortadaki commit'e checkout yapar
# Test edin ve sonucu bildirin:
git bisect good # Bu commit'te hata yok
git bisect bad # Bu commit'te hata var
# Otomatik bisect (test script'i ile)
git bisect run npm test
# Bisect'i sonlandır
git bisect reset
Git Worktree: Paralel Çalışma Alanları
Worktree, aynı repository'nin farklı branch'lerini farklı klasörlerde eş zamanlı olarak açmanızı sağlar. Branch değiştirmeden birden fazla branch üzerinde çalışabilirsiniz.
# Yeni worktree oluştur
git worktree add ../project-hotfix hotfix/critical-bug
# Mevcut worktree'leri listele
git worktree list
# Worktree'yi kaldır
git worktree remove ../project-hotfix
# Geçersiz worktree referanslarını temizle
git worktree prune
İleri Seviye Git Alias'ları
Sık kullandığınız komut kombinasyonlarını kısaltmak için Git alias'ları tanımlayabilirsiniz:
# Faydalı alias'lar
git config --global alias.lg "log --oneline --graph --all --decorate"
git config --global alias.st "status -sb"
git config --global alias.co "checkout"
git config --global alias.br "branch -vv"
git config --global alias.unstage "reset HEAD --"
git config --global alias.last "log -1 HEAD --stat"
git config --global alias.amend "commit --amend --no-edit"
# Kullanım
git lg # Grafik commit geçmişi
git st # Kısa status çıktısı
git lg alias'ı, commit geçmişinizi renkli ve grafiksel olarak gösterir. Özellikle branch'ler arası ilişkileri görselleştirmek için mükemmeldir.
Pratik Senaryolar
Gerçek dünya senaryolarında bu komutları nasıl birleştireceğinize bakalım:
Senaryo 1: Feature branch'inizde çalışırken acil bir hotfix gerekiyor:
git stash save "feature-x devam eden çalışma"
git checkout main
git checkout -b hotfix/urgent-fix
# ... fix'i yapın
git commit -am "fix: kritik güvenlik açığı düzeltmesi"
git checkout main && git merge hotfix/urgent-fix
git checkout feature/x
git stash pop
Senaryo 2: Son 3 commit'i tek bir commit'te birleştirme:
git rebase -i HEAD~3
# Editörde ilk commit'i "pick", diğerlerini "squash" yapın
# Yeni commit mesajını yazın ve kaydedin
Sonuç
Git'in ileri seviye komutları, günlük iş akışınızı önemli ölçüde hızlandırır ve daha temiz bir proje geçmişi oluşturmanızı sağlar. Rebase ile lineer bir history, cherry-pick ile seçici commit aktarımı, stash ile esnek çalışma yönetimi ve reflog ile güvenli bir geri dönüş mekanizması elde edersiniz. Bu komutları küçük projelerde pratik yaparak içselleştirin ve büyük projelerde güvenle kullanın.