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.
# "X özelliği ne zaman bozuldu?" sorusunu binary search ile çözgit bisect start# Mevcut durum bozukgit bisect bad# 2 hafta önceki commit'i iyi olarak işaretlegit bisect good v2.3.0# veyagit 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 sonragit 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'ı varcd ../hotfix-1234# Düzelt, commit et, push et# Geri döncd ../proje# Worktree'yi kaldırgit worktree remove ../hotfix-1234# Tüm worktree'lergit worktree list
Git Hooks ile Otomatik Kalite Kontrolü
// BASH //
# .git/hooks/pre-commit — commit öncesi çalışır#!/bin/shset -eecho "Lint kontrolü..."npm run lint -- --max-warnings 0echo "Tip kontrolü..."npm run type-checkecho "Testler..."npm test -- --passWithNoTestsecho "Tüm kontroller geçti ✓"
# Husky ile takım genelinde hook paylaşımınpm install -D husky lint-stagednpx husky init# .husky/pre-commitecho "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 eklegit submodule add https://github.com/firma/shared-components libs/sharedgit 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üncellegit 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 aramagit log -G "password.*hash" --oneline# Belirli commit'te dosyanın o anki haligit 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 algit cherry-pick abc1234# Birden fazla commitgit cherry-pick abc1234 def5678# Aralıkgit cherry-pick abc1234..def5678# Conflict çıkarsagit cherry-pick --continue # Çözüldükten sonragit cherry-pick --abort # İptal et
Reflog — Her Şey Kurtarılabilir
// BASH //
# Son 90 gün içindeki TÜM HEAD hareketlerigit 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'ı kurtarmagit 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.