DEVOPS11m READ7 Haziran 2026

Git İleri Seviye: Bisect, Worktree ve Interactive Rebase

Hata avcılığı, paralel branch çalışması ve commit geçmişini temizleme.

Temel Git komutlarını öğrendikten sonra bir sonraki adım, verimi artıran ileri tekniklerdir. Bu makalede gerçek proje senaryolarında kullanılan güçlü Git özelliklerini inceliyoruz.

Interactive Rebase ile Commit Geçmişini Düzenle

// BASH //
# Son 5 commit'i düzenle
git rebase -i HEAD~5
 
# Editörde açılan dosya:
# pick a1b2c3d feat: kullanici listesi eklendi
# pick e4f5g6h fix: typo duzeltme
# pick i7j8k9l fix: baska typo
# pick m0n1o2p refactor: kullanici servisi yeniden yazildi
# pick q3r4s5t test: kullanici servisi testleri
 
# Düzenlenmiş versiyon:
# pick a1b2c3d feat: kullanici listesi eklendi
# squash e4f5g6h fix: typo duzeltme       ← öncekiyle birleştir
# squash i7j8k9l fix: baska typo          ← öncekiyle birleştir
# reword m0n1o2p refactor: kullanici servisi  ← mesajı değiştir
# pick q3r4s5t test: kullanici servisi testleri
 
# Sonuç: 3 commit (5 yerine), temiz geçmiş

Git Bisect ile Hata Avcılığı

// BASH //
# "X özelliği ne zaman bozuldu?" sorusunu binary search ile çöz
git bisect start
 
# Mevcut durum bozuk
git bisect bad
 
# 2 hafta önceki commit'i iyi olarak işaretle
git bisect good v2.3.0
# veya
git bisect good HEAD~50
 
# Git otomatik olarak ortadaki commit'e geçer
# → Test et → git bisect good veya git bisect bad
# → Git tekrar ortaya geçer
# → Yaklaşık 6 adımda 50 commit içinden hatayı bulur!
 
# Otomatik bisect (test komutu ile)
git bisect run npm test
# Her adımda npm test çalıştırır, exit 0=good, exit 1=bad
 
# Bittikten sonra
git bisect reset

Worktree — Paralel Branch'larda Çalış

// BASH //
# Mevcut branch'tan çıkmadan başka branch'ta çalış
git worktree add ../hotfix-1234 origin/main
 
# Şimdi ../hotfix-1234 dizininde main branch'ı var
cd ../hotfix-1234
# Düzelt, commit et, push et
 
# Geri dön
cd ../proje
 
# Worktree'yi kaldır
git worktree remove ../hotfix-1234
 
# Tüm worktree'ler
git worktree list

Git Hooks ile Otomatik Kalite Kontrolü

// BASH //
# .git/hooks/pre-commit — commit öncesi çalışır
#!/bin/sh
set -e
 
echo "Lint kontrolü..."
npm run lint -- --max-warnings 0
 
echo "Tip kontrolü..."
npm run type-check
 
echo "Testler..."
npm test -- --passWithNoTests
 
echo "Tüm kontroller geçti ✓"
// BASH //
# .git/hooks/commit-msg — commit mesajı formatını kontrol et
#!/bin/sh
MESAJ=$(cat "$1")
DESEN="^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,72}"
 
if ! echo "$MESAJ" | grep -qE "$DESEN"; then
  echo "HATA: Geçersiz commit mesajı formatı."
  echo "Örnek: feat(auth): JWT girisi eklendi"
  exit 1
fi
// BASH //
# Husky ile takım genelinde hook paylaşımı
npm install -D husky lint-staged
 
npx husky init
# .husky/pre-commit
echo "npx lint-staged" > .husky/pre-commit
 
# package.json
{
  "lint-staged": {
    "*.{ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{js,json,css,md}": ["prettier --write"]
  }
}

Git Subtree ve Submodule

// BASH //
# Submodule — başka repo'yu bağımlılık olarak ekle
git submodule add https://github.com/firma/shared-components libs/shared
git submodule update --init --recursive  # Clone sonrası
 
# Subtree — başka repo'yu birleştir (submodule'den basit)
git subtree add --prefix=libs/ui https://github.com/firma/ui main --squash
 
# Subtree'yi güncelle
git subtree pull --prefix=libs/ui https://github.com/firma/ui main --squash

Gelişmiş Diff ve Log

// BASH //
# Belirli fonksiyonu izle — bu fonksiyon nasıl değişti?
git log -L :kullaniciBul:src/services/kullanici.service.ts
 
# Kelime bazlı diff (satır bazlı yerine)
git diff --word-diff
 
# Belirli içeriği arama — ne zaman bu string eklendi/silindi?
git log -S "refreshToken" --oneline --all
 
# Regex ile arama
git log -G "password.*hash" --oneline
 
# Belirli commit'te dosyanın o anki hali
git show HEAD~3:src/config.ts
 
# Bir dosyanın tüm geçmişi (silinmiş bile)
git log --all --full-history -- src/eski-dosya.ts

Partial Staging (Satır Seçimli)

// BASH //
# Tek dosyadan belirli değişiklikleri seç
git add -p src/kullanici.service.ts
 
# Komutlar:
# y — bu chunk'ı ekle
# n — bu chunk'ı atlat
# s — chunk'ı daha küçük parçalara böl
# e — chunk'ı manuel düzenle
# q — çık
 
# Bu teknikle tek commit'te karışık değişiklikleri ayırabilirsiniz:
# Commit 1: bug fix (sadece ilgili satırlar)
# Commit 2: refactoring (kalan değişiklikler)

Cherry-pick

// BASH //
# Başka branch'tan tek commit al
git cherry-pick abc1234
 
# Birden fazla commit
git cherry-pick abc1234 def5678
 
# Aralık
git cherry-pick abc1234..def5678
 
# Conflict çıkarsa
git cherry-pick --continue   # Çözüldükten sonra
git cherry-pick --abort      # İptal et

Reflog — Her Şey Kurtarılabilir

// BASH //
# Son 90 gün içindeki TÜM HEAD hareketleri
git reflog
 
# Yanlışlıkla reset --hard yaptınız?
git reflog
# 5: abc1234 HEAD@{5}: reset: moving to HEAD~3   ← kayıp commit burası
 
git reset --hard abc1234  # Kurtarıldı!
 
# Silinen branch'ı kurtarma
git reflog | grep "silinmis-branch"
# xyz9012 HEAD@{12}: commit: ...
git checkout -b silinmis-branch xyz9012

Alias ile Verimlilik

// BASH //
# ~/.gitconfig — kısayollar
[alias]
  st   = status -sb
  co   = checkout
  br   = branch -a
  lg   = log --oneline --graph --all --decorate
  undo = reset --soft HEAD~1
  amend = commit --amend --no-edit
  cleanup = "!git branch --merged main | grep -v main | xargs git branch -d"
  wip  = "!git add -A && git commit -m 'WIP: çalışma devam ediyor'"
  sync = "!git fetch origin && git rebase origin/main"

Sonuç

Interactive rebase, bisect, worktree ve reflog — bu dört araç günlük geliştirme akışınızı dönüştürür. Temiz commit geçmişi ekip iletişimini kolaylaştırır; bisect ile hata avcılığı saatlik araştırmayı dakikalara indirir; reflog ise her hatayı geri dönüşlü kılar.