Git'i Gerçekten Kullanmayı Öğren
Çoğu geliştirici Git'i sadece add, commit, push üçlüsüyle kullanır. Oysa Git'in gerçek gücü bu komutların çok ötesinde. Bu rehberde ekip çalışmasında ve solo projelerde işinizi büyük ölçüde kolaylaştıracak 4 ileri seviye Git komutunu ele alacağız: Rebase, Cherry-Pick, Stash ve Bisect.
1. Git Rebase: Temiz Bir Commit Geçmişi
Merge, commit geçmişine bir "merge commit" ekler. Rebase ise sanki hiç dallanmamış gibi, commit'leri ana dalın en üstüne yeniden yazar. Sonuç: Tertemiz, doğrusal bir geçmiş.
# Senaryo: feature/login dalındasın, main güncellenmiş
git checkout feature/login
git rebase main
# Bu komut:
# 1. feature/login'in main'den ayrıldığı noktayı bulur
# 2. feature'daki commit'leri geçici olarak kaldırır
# 3. main'in son haline ulaşır
# 4. Kaldırılan commit'leri sırayla üstüne uygular
# Çakışma (conflict) olursa:
git rebase --continue # Çakışmayı çözdükten sonra devam et
git rebase --abort # Her şeyi geri al, vazgeç
# ⚠️ UYARI: Asla başkalarının da kullandığı ortak dallarda rebase yapma!
# Sadece kendi özel dallarında kullan.
Interactive Rebase ile Commit Geçmişini Düzenle
# Son 4 commit'i interaktif olarak düzenle
git rebase -i HEAD~4
# Açılan editörde her commit için bir işlem seç:
# pick — olduğu gibi tut
# reword — mesajı değiştir
# edit — commit içeriğini değiştir
# squash — önceki commit ile birleştir (mesajlar birleşir)
# fixup — önceki ile birleştir (bu commit'in mesajını sil)
# drop — bu commit'i tamamen sil
# Örnek: 3 "WIP" commit'ini tek temiz commit'e squash et
pick a1b2c3 feat: kullanıcı girişi eklendi
squash d4e5f6 WIP: login düzeltiliyor
squash g7h8i9 WIP: token sorunu çözüldü
reword j0k1l2 WIP: form validasyonu
2. Git Cherry-Pick: İstediğin Commit'i Al
Bir daldan sadece belirli bir commit'i, tüm dalı değil, başka bir dala taşımak istiyorsun. Tam da bunun için cherry-pick var.
# Senaryo: hotfix dalında kritik bir bug düzelttin.
# Bu düzeltmeyi main'e almak istiyorsun ama tüm dalı değil, sadece o commit'i.
# 1. Önce commit hash'ini öğren
git log hotfix/payment-bug --oneline
# a3f9c1e fix: ödeme sayfasındaki boş değer hatası düzeltildi ✅
# b8d2e7a WIP: geliştirme devam ediyor (bunu istemiyoruz)
# 2. Sadece istediğin commit'i al
git checkout main
git cherry-pick a3f9c1e
# main dalına sadece o fix commit eklendi!
# Birden fazla commit için:
git cherry-pick a3f9c1e b2c3d4e
# Aralık için:
git cherry-pick abc123..def456
# Commit etmeden önce gözden geçirmek istersen:
git cherry-pick --no-commit a3f9c1e
3. Git Stash: Değişiklikleri Geçici Sakla
Yarım kalan bir özelliği commit etmeden önce acil bir başka işe geçmen gerekiyor mu? Stash tam ihtiyacın olan şey.
# Mevcut değişiklikleri stash'e kaydet
git stash push -m "login formu yarım kaldı"
# Başka işi yap...
git checkout main
git pull
# (acil düzeltme, vb.)
# Geri dön ve stash'i uygula
git checkout feature/login
git stash pop # En üstteki stash'i uygula ve listeden sil
# veya
git stash apply stash@{0} # Uygula ama listeden silme
# Stash listesini gör
git stash list
# stash@{0}: On feature/login: login formu yarım kaldı
# stash@{1}: On main: deneme kodları
# Belirli dosyaları stash'le
git stash push -m "sadece API dosyası" -- src/api/auth.js
# Untracked dosyaları da dahil et
git stash push -u -m "yeni dosyalar dahil"
# Stash içeriğini görmek için
git stash show -p stash@{0}
# Stash'i sil
git stash drop stash@{0}
git stash clear # Hepsini temizle
4. Git Bisect: Bug'ı İkili Arama ile Bul
Bir bug var ama hangi commit'te girdiğini bilmiyorsun. 200 commit geçmişi var. Git Bisect, ikili arama (binary search) algoritmasıyla bunu logaritmik zamanda bulur!
# 1. Bisect modunu başlat
git bisect start
# 2. Şu anki halin bozuk olduğunu söyle
git bisect bad
# 3. Bug'ın olmadığını bildiğin eski bir commit belirt
git bisect good v1.2.0
# veya hash ile: git bisect good a1b2c3d
# Git otomatik olarak ortadaki commit'e gidecek.
# Test et, çalışıyor mu?
# Çalışıyorsa:
git bisect good
# Çalışmıyorsa:
git bisect bad
# Git yeniden ortaya gidecek. Birkaç adımda:
# "a3f9c1e commit, bu bug'ı ilk getiren commit!"
# Bisect'i bitir, başlangıç haline dön
git bisect reset
# 200 commit arasında bug'ı bulmak için kaç adım?
# log2(200) ≈ 8 adım! 🚀
git config --global alias.lg "log --oneline --graph --decorate --all" git config --global alias.st "status -s" git config --global alias.undo "reset --soft HEAD~1" # Artık: git lg, git st, git undo
