🔧 Git & VCS — Öğrenme ve Mülakat Rehberi
Git’i temelden ileri seviyeye; branching stratejileri, PR/code review pratikleri ve Sourcetree ile günlük iş akışlarını bu sayfada derli toplu öğren.
🔎 Genel Bakış
- Git; snapshot tabanlı, dağıtık versiyon kontrol sistemidir.
- Temel iş akışı:
add→commit→push/pull/merge/rebase. - Takımda branching ve code review kuralları net olmalı.
Hedef
Temiz commit geçmişi, otomasyon (CI), hızlı PR’lar ve net sürümleme ile güvenilir teslimat.
📦 Git Temelleri
Kurulum ve İlk Ayarlar
# Kimlik
git config --global user.name "Ad Soyad"
git config --global user.email "ad@firma.com"
# Varsayılan branch ismi
git config --global init.defaultBranch main
# Renk, editor
git config --global color.ui auto
git config --global core.editor "code --wait"
Temel Komutlar
# Depo oluşturma / klonlama
git init # mevcut klasörde repo
git clone <url> # uzak repodan klon
# Durum / fark / log
git status
git diff
git log --oneline --graph --decorate
# Değişiklikler
git add .
git commit -m "feat: ürün listeleme"
git push origin feature/urun-listesi
git pull --rebase
Stash
git stash push -m "wip: refactor"
git stash list
git stash pop # uygula ve listeden çıkar
🌿 Branching Stratejileri
Genel İlkeler
- Branch isimleri
feature/,bugfix/,hotfix/,release/önekleriyle anlaşılır olmalı. - Kısa ömürlü branch → küçük PR; hızlı inceleme.
- CI zorunlu; test yeşil olmadan merge yok.
🔀 GitFlow
Uygun Kurumsal, sürüm periyodu belirgin takımlar.
- main: üretim.
- develop: bir sonraki sürümün birikimi.
- feature/*, release/*, hotfix/* kolları.
# Feature başlat
git checkout -b feature/urun-listeleme develop
# Release hazırlığı
git checkout -b release/1.4.0 develop
# Hotfix
git checkout -b hotfix/1.3.1 main
Artı: Düzenli sürümleme. Eksi: Çok branch → operasyonel yük.
🌳 Trunk-Based Development
Uygun Sürekli teslimat, yüksek hız.
- Tek ana dal: main.
- Kısa ömürlü feature branch (saat/gün).
- Feature flag ile yarım işleri sakla.
# Kısa yaşam döngüsü
git checkout -b feat/checkout main
# ... küçük, atomik commit'ler ...
git push -u origin feat/checkout
# PR aç, review ve hızlı merge (genelde squash)
Artı: Basitlik, hız. Eksi: Disiplin ve otomasyon şart.
✍️ Commit Mesajı & Konvansiyonlar
Conventional Commits
| Tür | Açıklama | Örnek |
|---|---|---|
feat | Yeni özellik | feat(cart): kupon desteği |
fix | Hata düzeltme | fix(api): null check |
refactor | Davranış aynı, iç iyileştirme | refactor: service katmanı |
docs | Dokümantasyon | docs(readme): kurulum |
test | Test ekleme | test(user): service cases |
# Detaylı mesaj kalıbı
feat(cart): kupon kodu uygulama
- min. sepet tutarı kontrolü
- hatalı kod için uyarı
Closes #412
İmzalı Commit
# GPG/SSH ile imza
git config --global user.signingkey <KEYID>
git config --global commit.gpgsign true
git commit -S -m "feat: signed commit"
🧬 Merge vs Rebase
| Konsept | Merge | Rebase |
|---|---|---|
| Tarihçe | Gerçek birleşme commit’i | Doğrusal yeniden yazma |
| PR’lar | “merge commit”/“squash” | Öncesinde düzenli rebase önerilir |
| Risk | Gürültülü geçmiş | Paylaşılan dalda tehlikeli |
# develop'u feature dalına almak (rebase)
git checkout feature/x
git fetch origin
git rebase origin/develop
# çatışma olursa çöz → git rebase --continue
Kural: Paylaşılan dallarda rebase dikkatli; kendi feature dalında güvenle kullanılabilir.
⏪ Reset • Revert
| Komut | Etkisi | Kullanım |
|---|---|---|
git reset --soft <commit> | Index ve çalışma alanı korunur | Commit’i dağıt |
git reset --mixed <commit> | Index sıfırlanır (default) | Dosyaları unstaged yap |
git reset --hard <commit> | Index + çalışma alanı reset | Tehlikeli! |
git revert <commit> | Ters commit üretir | Paylaşılan dalda güvenli geri alma |
# Hatalı commit'i geri al (paylaşılan dal)
git revert <commit-sha>
⚔️ Merge/Rebase Çatışmaları
Adımlar
git statusile çatışmalı dosyaları tespit.- Dosyada
<<<<<</=======/>>>>>>bloklarını çöz. git addile işaretle; devam:git merge --continue/git rebase --continue.
# Çatışmayı iptal
git merge --abort
git rebase --abort
🧱 Tarihçe Düzenleme (Interactive Rebase)
Squash / Fixup
# Son 5 commit'i düzenle
git rebase -i HEAD~5
# 'pick' → 'squash' veya 'fixup' yap
Not: Yalnızca push’lanmamış veya yalnızca senin kullandığın dalda yap.
🪝 Hooks & Otomasyon
.git/hooks altına script koyarak otomasyon (pre-commit, pre-push, commit-msg).
# örn. pre-commit (lint)
#!/bin/sh
echo "Running lint..."
npm run lint
if [ $? -ne 0 ]; then
echo "Lint failed"; exit 1
fi
Takımca paylaşmak için husky veya lefthook gibi araçlar kullanılabilir.
🗂️ LFS / Submodule / Subtree
Git LFS (Large File Storage)
Büyük binary dosyalar için.
git lfs install
git lfs track "*.psd"
git add .gitattributes
Submodule vs Subtree
| Konu | Submodule | Subtree |
|---|---|---|
| Bağımlılık | Ayrı repo pointer’ı | İçerik kopyalanır |
| Güncelleme | Elle init/update | Subtree pull/merge |
| Karmaşıklık | Yüksek | Daha basit |
👀 Pull Request & Code Review
PR Hazırlama
- Küçük kapsam, tek konu (single responsibility).
- Açıklayıcı başlık + özet + ekran görüntüsü/loglar.
- Testler, dokümantasyon güncel.
Review Checklist
- Doğruluk: Gereksinimi karşılıyor mu?
- Basitlik: Gereksiz karmaşa var mı?
- Güvenlik/Performans: Injection, N+1, bellek, I/O?
- Test edilebilirlik ve kapsama.
- İsimlendirme, stil, linter/hook sonuçları.
Merge Stratejisi
- Squash: Temiz tek commit — çoğu PR’da önerilir.
- Rebase & Merge: Doğrusal geçmiş isteyen ekipler.
- Merge Commit: Büyük release’lerde bağlamı korur.
🟦 Sourcetree İpuçları
- Staging Hunk/Line: Dosya diff’inde sadece belirli satırları stage’leyin.
- Interactive Rebase: “Rebase…” → sürükle-bırak ile squash/fixup.
- External Diff/Merge: Options → Diff ile Beyond Compare / Kdiff3 ayarla.
- Resolve Conflicts: Çatışmalı dosyada “Resolve Conflicts” → “Launch External Merge Tool”.
- Stash & Patch: “Stash” açıklaması ekleyin; tek dosyalık patch’leri “Create Patch” ile paylaşın.
- Search Commit: Hash, metin veya yazar’a göre hızlı arama.
- Reset: Branch’e sağ tık → Reset current branch to this commit (soft/mixed/hard).
📝 Git Cheat Sheet
# Log
git log --oneline --graph --decorate --all
# Sadece belirli dosyayı önceki commit'e döndür
git checkout HEAD~1 -- path/to/file
# Commit'i değiştirme (son commit mesajını güncelle)
git commit --amend -m "fix: yeni mesaj"
# Belirli dosyadaki değişiklikleri geri al (çalışma alanında)
git restore path/to/file
# Unstage
git restore --staged path/to/file
# Sık yapılan rebase
git fetch origin
git rebase origin/main
❓ Mülakat Soruları & Kısa Yanıtlar
1) Merge ve Rebase farkı?
Merge birleştirme commit’i üretir; rebase commit’leri yeniden yazarak doğrusal bir geçmiş sağlar. Paylaşılan dalda rebase risklidir.
2) GitFlow ne zaman, Trunk-Based ne zaman?
GitFlow sürüm odaklı, ritmik yayınlarda; Trunk-Based sürekli teslimat ve küçük PR akışında idealdir.
3) Squash merge’in faydası?
PR’ı tek, anlamlı commit’e indirger → geçmiş temiz, revert kolay.
4) Reset/Revert farkı?
Reset geçmişi değiştirir (tehlikeli olabilir), revert ters commit ekler ve paylaşılan dalda güvenlidir.
5) Stash nedir?
Çalışma alanındaki değişiklikleri geçici olarak yedekler; dal değiştirmeden önce kullanışlıdır.
6) İmzalı commit neden?
Kaynağı doğrular (GPG/SSH). Güvenlik ve denetlenebilirlik.
7) PR’da nelere bakarsın?
Fonksiyonel doğruluk, güvenlik/performans, testler, okuyabilirlik ve mimari uyum.