🔧 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ışı: addcommitpush / 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ürAçıklamaÖrnek
featYeni özellikfeat(cart): kupon desteği
fixHata düzeltmefix(api): null check
refactorDavranış aynı, iç iyileştirmerefactor: service katmanı
docsDokümantasyondocs(readme): kurulum
testTest eklemetest(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

KonseptMergeRebase
TarihçeGerçek birleşme commit’iDoğrusal yeniden yazma
PR’lar“merge commit”/“squash”Öncesinde düzenli rebase önerilir
RiskGü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

KomutEtkisiKullanım
git reset --soft <commit>Index ve çalışma alanı korunurCommit’i dağıt
git reset --mixed <commit>Index sıfırlanır (default)Dosyaları unstaged yap
git reset --hard <commit>Index + çalışma alanı resetTehlikeli!
git revert <commit>Ters commit üretirPaylaşılan dalda güvenli geri alma
# Hatalı commit'i geri al (paylaşılan dal)
git revert <commit-sha>

⚔️ Merge/Rebase Çatışmaları

Adımlar

  1. git status ile çatışmalı dosyaları tespit.
  2. Dosyada <<<<<< / ======= / >>>>>> bloklarını çöz.
  3. git add ile 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

KonuSubmoduleSubtree
BağımlılıkAyrı repo pointer’ıİçerik kopyalanır
GüncellemeElle init/updateSubtree pull/merge
KarmaşıklıkYüksekDaha 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.