Skip to content

🚀 Git & GitHub Eğitimi

Sık kullandığın Git/GitHub komutları için hızlı başvuru kartı.

Neden Versiyon Kontrolu?

  • ✅ Her proje, versiyon kontrolu zorunlu
  • ⚠️ Büyük binary dosyalar Git LFS ile yonetilmeli
  • Önerilen: Git + GitHub
  • Alternatifler: SVN, Mercurial, Perforce

⚙️ Git Config

🧹 Global Ayarları Temizleme

bash
rm ~/.git-credentials 2>/dev/null || true
git config --global credential.helper store

🆔 Kullanıcı Bilgisi Kaydetme

bash
git config --global user.name "fahri"
git config --global user.email "fahriaydin47@gmail.com"

🧰 Çalışma Alanını Git'e Çevir

bash
git init

🔍 Takip Durumunu Kontrol Et

bash
git status

📦 Dosyaları Staging Alanına Ekle

  • git add . → tüm değişiklikleri hazırla
  • git add test.txt → sadece belirtilen dosyayı ekle

💾 Commit & Geçmiş

bash
git commit -m "mesaj"
git log
git log --oneline

🔍 Farkları Gör

bash
git diff
git diff test.txt

♻️ Değişiklikleri Geri Al

bash
git restore test.txt
git restore .
git reset .

🐙 GitHub Remote İşlemleri

🌐 Remote Tanımla & Kontrol Et

  • git remote add origin https://github.com/CestnyTR/git-test.git
  • git remote -v → kayıtlı tüm remote adreslerini listele

🚀 İlk Push / Projeyi Gönder

bash
git push https://github.com/CestnyTR/git-test.git
git push -u origin master   # kalıcı takip için

🤝 Ortak Çalışma Akışı

📥 Repo Klonla

bash
git clone https://github.com/CestnyTR/git-test.git
git clone <proje-linki>

🛰️ Uzak Commit'leri İncele

bash
git fetch                        # remote'tan güncel veriyi indir
git diff master..origin/master   # lokal/remote farklarını gör

🔄 Değişiklikleri Birleştir

bash
git merge <branch>
git pull        # fetch + merge

🚢 Remote'a Gönder

bash
git push -u origin feature/login
git push --force   # pull yapmadan yükleme, dikkat ⚠️

🌿 Branch İşlemleri

👀 Hangi Branch'teyim?

bash
git branch

🔁 Branch Değiştir / Oluştur

bash
git switch -c <branch-adi>      # yeni branch
git switch <branch-adi>         # var olan branch'e geç

🗑️ Branch Silme

  • Lokal: git branch -d branch-adi
  • Lokal (zorla): git branch -D branch-adi
  • Remote listesi: git branch -r
  • Remote silme: git push origin --delete branch-adi

🔀 Branch Kodunu Ana Koda Birleştir

bash
git merge <branch-adi>
git merge feature/login

🧱 Commit Yönetimi

✏️ Son Commit'i Düzenle

bash
git commit --amend   # (nano'dan çıkış: Ctrl+X, Y)

🕰️ Eski Commit'lere Dön / Branch Gezisi

bash
git checkout <commit_id>
git checkout 0db7ee6
git checkout master   # ana branch'e dönüş

🔄 Reset Modları

bash
git reset --soft HEAD~1    # değişiklikleri staged bırak
git reset --mixed HEAD~1   # staging'den çıkar
git reset --hard HEAD~1    # tamamen geri al

🔙 Belli Commit'i Geri Al (Revert)

bash
git revert <commit_id>
git revert 530e3a4

🧭 Reflog: Silinen Commit'leri de Gör

bash
git reflog

📘 README İçerik Rehberi

🧩 Temel Bölümler

  • Logo (Varsa)
  • Proje Adı & Kısa Açıklama
  • İçindekiler
  • Kurulum
  • Kullanım
  • Özellikler
  • Katkıda Bulunma
  • Destek & İletişim
  • Lisans
  • Teşekkürler / Sponsorlar (Varsa)

🤖 READMEAI ile README Oluşturma

  1. Ubuntu Sistem Güncelle
    bash
    sudo apt update
  2. Python 3 (zaten kuruluysa tekrar gerekmez)
    bash
    sudo apt install python3
  3. pipx Kurulumu ve PATH Ayarı
    bash
    sudo apt install pipx
    pipx ensurepath
    exec $SHELL   # veya terminali kapat-aç
  4. READMEAI Bağımlılıkları (tiktoken derlemesi için)
    bash
    sudo apt install build-essential pkg-config python3-dev
  5. Rust Kurulumu (READMEAI için gerekli)
    bash
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    . "$HOME/.cargo/env"
  6. README-AI Kur / Yeniden Kur
    bash
    pipx uninstall readmeai   # varsa kaldır
    pipx install readmeai
    readmeai --help
  7. Local Projeden README Üret
    bash
    readmeai --api offline -o README.md -r .
    readmeai --api offline -o README.md -r /home/fahri/Desktop/git-course
    readmeai --api offline -o output.md -r .
  8. Ollama Kur ve Model Çalıştır
    bash
    curl -fsSL https://ollama.com/install.sh | sh
    ollama run llama3
  9. READMEAI'yi Ollama Modeliyle Çalıştır
    bash
    readmeai --api ollama --model llama3 -r https://github.com/CestnyTR/git-test
    readmeai --api ollama --model llama3 -r ~/Desktop/<dosya-yolu>
    readmeai --api ollama --model llama3 -o README.md -r https://github.com/CestnyTR/git-test

🐙 GitHub CLI — Mini Özet

GitHub CLI (gh), GitHub işlemlerini terminalden hızlı bir şekilde yapmanı sağlar.


📥 Kurulum

Ubuntu için:

bash
sudo apt install gh

Giriş yapmak:

bash
gh auth login

📦 Repo İşlemleri

🔹 Repo klonlama

bash
gh repo clone owner/repo

🔹 Yeni repo oluşturma

bash
gh repo create my-repo

Örnek:

bash
gh repo create my-repo --private --source .

🔄 Pull Request (PR) İşlemleri

🔹 Yeni PR açma

bash
gh pr create

🔹 PR'ları listeleme

bash
gh pr list

🔹 PR detayını görme

bash
gh pr view 123

🔹 PR birleştirme (Merge)

bash
gh pr merge 123

🔀 Issue İşlemleri

🔹 Issue oluşturma

bash
gh issue create --title "Bug found" --body "Details..."

🔹 Issue listeleme

bash
gh issue list

🔹 Issue görüntüleme

bash
gh issue view 15

🔧 Branch & Commit Yönetimi

🔹 Repo fork etme

bash
gh repo fork

🔹 Commit geçmişini tarayıcıda aç

bash
gh browse commits

🔗 GitHub Web'e Geçiş

Repo sayfasını tarayıcıda aç

bash
gh browse

PR veya Issue tarayıcıda aç

bash
gh pr view --web
gh issue view --web

🔐 Kimlik & Token İşlemleri

Login durumu:

bash
gh auth status

Çıkış:

bash
gh auth logout

🧭 Kısa Özet Tablosu

İşlemKomut
Repo klonlagh repo clone owner/repo
Yeni repo oluşturgh repo create
PR oluşturgh pr create
PR listelegh pr list
Issue oluşturgh issue create
Issue listelegh issue list
Tarayıcıda açgh browse
Giriş yapgh auth login

daha fazla bilgi için : cli.github.com


⚔️ Git Merge & Rebase

🔀 Merge Akışı

bash
git switch -c doc/sum-docs
git commit -m "açıklama"
git push origin doc/sumdoc
git switch master
git pull
git merge docs/sum-docs
git merge docs/multiply --no-ff

Merge sonrası iki branch geçmişi korunur; --no-ff ile ayrı merge commit'i garanti edilir.

🔁 Rebase Akışı (ekip içi kullanımda dikkat)

bash
git switch -c doc/sum-docs
git switch master
git pull
git switch doc/sum-docs
git rebase master

Rebase temiz tarihçe sunar; ancak paylaşılan branch'lerde konflikt ve yeniden yazım riskine dikkat et.


🔙 Merge Geri Alma (Undo Merge)

Senaryo 1: Merge henüz push edilmedi (local)

bash
# Son merge'ü geri al — çalışma dizini korunur (working directory preserved)
git reset --merge ORIG_HEAD

# veya merge öncesi commit'e dön
git log --oneline -5        # merge commit'in hash'ini bul
git reset --hard HEAD~1      # ⚠️ Dikkat: değişiklikler kaybolur

Senaryo 2: Merge push edildi (remote'da var)

bash
# git revert ile merge commit'ini geri al (güvenli yol — yeni commit oluşturur)
# -m 1 = ana branch'i (main/master) koru, merge edilen branch'i geri al
git revert -m 1 <merge-commit-hash>

# Örnek:
git log --oneline -5
# a1b2c3d Merge branch 'feature/payment' into main   ← bu merge sorunlu
# d4e5f6g önceki commit

git revert -m 1 a1b2c3d
# Yeni bir "Revert" commit'i oluşur, merge'deki değişiklikler geri alınır
git push origin main

Senaryo 3: 2 önceki merge'ü geri alma

bash
# Geçmişe bak — hangi merge sorunlu?
git log --oneline --merges -5
# a1b2c3d Merge branch 'feature/payment'    ← 1. merge (son)
# x7y8z9w Merge branch 'feature/broken'     ← 2. merge (sorunlu olan)
# ...

# Sorunlu merge'ü revert et
git revert -m 1 x7y8z9w
git push origin main

Senaryo 4: Birden fazla merge'ü geri alma

bash
# Son 3 merge'ü sırayla geri al (en sondan başla)
git revert -m 1 <3.merge-hash>
git revert -m 1 <2.merge-hash>
git revert -m 1 <1.merge-hash>

# Veya tek seferde (commit oluşturmadan):
git revert -m 1 --no-commit <merge-hash-1>
git revert -m 1 --no-commit <merge-hash-2>
git commit -m "Revert: son 2 merge geri alındı"
git push origin main

-m 1 vs -m 2 ne demek?

bash
# Merge commit'in 2 parent'ı vardır:
#   -m 1 = ilk parent (ana branch, örn. main)
#   -m 2 = ikinci parent (merge edilen branch, örn. feature/x)

# -m 1 kullanırsan: feature branch değişikliklerini geri alırsın (genelde bu istenir)
# -m 2 kullanırsan: main'deki değişiklikleri geri alırsın (nadiren istenir)

Merge Geri Alma Karşılaştırma (Comparison)

YöntemNe ZamanGüvenli miGeçmiş
git reset --merge ORIG_HEADHenüz push etmediysen⚠️ Geçmişi silerTemiz
git reset --hard HEAD~1Local, değişiklik önemli değilse❌ Veri kaybı riskiTemiz
git revert -m 1 <hash>Push edildiyse (önerilen)✅ GüvenliRevert commit kalır
git revert --no-commitBirden fazla geri alma✅ GüvenliTek commit

⚠️ Dikkat

  • git reset --hard push edilmiş commit'lerde kullanma — takım arkadaşlarının geçmişini bozar
  • Push edilmiş merge'lerde her zaman git revert kullan
  • Revert sonrası aynı branch'i tekrar merge etmek istersen dikkat: Git o değişiklikleri "zaten uygulandı" sanabilir. Çözüm: revert'in revert'ini yap (git revert <revert-commit-hash>)

Interactive Rebase

Interactive rebase, commit gecmisini yeniden duzenlemek için kullanilir. Son N commit uzerinde işlem yapilir:

bash
git rebase -i HEAD~5

Acilan editorde her satirin basinda bir komut bulunur. Kullanilabilecek komutlar:

KomutAçıklama
pickCommit'i oldugu gibi birak
rewordCommit mesajini değiştir (içerik ayni kalir)
editCommit'te dur, degisiklik yapilmasina izin ver
squashOnceki commit ile birlestir, mesajlari birlestir
fixupOnceki commit ile birlestir, bu commit'in mesajini at
dropCommit'i tamamen sil

Pratik Senaryo: Son 3 Commit'i Birlestirme

Diyelim ki son 3 commit sunlar:

abc1234 feat: buton eklendi
def5678 fix: buton rengi duzeltildi
ghi9012 fix: buton boyutu ayarlandi
bash
git rebase -i HEAD~3

Editorde su sekilde değiştir:

pick abc1234 feat: buton eklendi
fixup def5678 fix: buton rengi duzeltildi
fixup ghi9012 fix: buton boyutu ayarlandi

Sonuç: Tek bir "feat: buton eklendi" commit'i kalir.

Commit Mesajini Degistirme

bash
git rebase -i HEAD~2
reword abc1234 eski mesaj
pick def5678 diger commit

Kaydet, ardindan acilan editorde yeni mesaji yaz.

Commit Siralama ve Silme

Editorde satirlarin sirasini degistirerek commit sirasini, drop yazarak commit'i silebilirsin:

pick def5678 ikinci commit
drop abc1234 silinecek commit
pick ghi9012 ucuncu commit

Dikkat: Push edilmis commit'ler uzerinde interactive rebase yapilmasi --force-with-lease gerektirir. Paylasilan branch'lerde dikkatli ol.


Git Hooks

Git Hooks, belirli Git olaylarinda otomatik calistirilacak script'ler tanimlamanizi sağlar. Hook dosyaları .git/hooks/ dizininde bulunur.

Temel Hook Turleri

HookCalistigi AnKullanım Alani
pre-commitgit commit oncesiLint, format kontrolu, test
commit-msgCommit mesaji yazildiktan sonraMesaj formati doğrulama
pre-pushgit push oncesiTest suite calistirma
prepare-commit-msgMesaj editoru acilmadan onceOtomatik mesaj sablonu
post-mergeMerge tamamlandiktan sonraBagimliliklari güncelleme

Örnek: pre-commit Hook

bash
#!/bin/sh
# .git/hooks/pre-commit

# Lint kontrolu
npm run lint
if [ $? -ne 0 ]; then
  echo "Lint hatalari var. Commit iptal edildi."
  exit 1
fi

# Hassas bilgi kontrolu
if grep -rn "API_KEY\|SECRET\|PASSWORD" --include="*.js" --include="*.ts" .; then
  echo "Hassas bilgi tespit edildi. Commit iptal edildi."
  exit 1
fi
bash
chmod +x .git/hooks/pre-commit

Örnek: commit-msg Hook

bash
#!/bin/sh
# .git/hooks/commit-msg

commit_msg=$(cat "$1")
pattern="^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\(.+\))?: .{1,72}$"

if ! echo "$commit_msg" | grep -qE "$pattern"; then
  echo "Commit mesaji Conventional Commits formatina uymuyor."
  echo "Ornek: feat(auth): login sayfasi eklendi"
  exit 1
fi

Husky + lint-staged Kurulumu

Husky, Git hook'larini proje bazinda yonetmeyi kolaylastirir. lint-staged ise sadece stage'lenmis dosyalar uzerinde işlem yapar.

bash
# Husky kurulumu
npm install -D husky lint-staged
npx husky init

# pre-commit hook tanimlama
echo "npx lint-staged" > .husky/pre-commit

package.json icine lint-staged konfigurasyonu:

json
{
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.{css,scss}": [
      "prettier --write"
    ],
    "*.{json,md}": [
      "prettier --write"
    ]
  }
}

commitlint Kurulumu

bash
npm install -D @commitlint/cli @commitlint/config-conventional

# commitlint konfigurasyonu
echo "module.exports = { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js

# Husky ile entegrasyon
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg

İleri Seviye Git Komutları

Cherry-pick

Baska bir branch'teki belirli bir commit'i mevcut branch'e uygulamak için kullanilir:

bash
# Tek commit
git cherry-pick <commit-hash>

# Birden fazla commit
git cherry-pick <hash1> <hash2> <hash3>

# Commit yapmadan sadece degisiklikleri al
git cherry-pick --no-commit <commit-hash>

# Cakisma durumunda
git cherry-pick --continue   # cozumden sonra devam
git cherry-pick --abort      # islemi iptal et

Örnek senaryo: hotfix branch'indeki bir duzeltmeyi develop branch'ine almak:

bash
git switch develop
git cherry-pick a1b2c3d

Bisect ile Otomatik Bug Bulma

git bisect, binary search algoritmasi kullanarak hatanin hangi commit'te girdigini bulur:

bash
# Bisect baslatma
git bisect start

# Mevcut durumu "kotu" olarak isaretle
git bisect bad

# Calistigini bildigin eski bir commit'i "iyi" isaretle
git bisect good v1.0.0

# Git otomatik olarak ortadaki commit'e gecis yapar
# Test et ve sonuca gore:
git bisect good   # bu commit'te sorun yok
git bisect bad    # bu commit'te sorun var

# Bulunca bisect'i sonlandir
git bisect reset

Otomatik bisect (test script'i ile):

bash
git bisect start HEAD v1.0.0
git bisect run npm test

Git, test script'inin cikis koduna gore otomatik olarak iyi/kotu kararini verir ve hatali commit'i bulur.

Stash İleri Kullanım

bash
# Aciklama ile stash
git stash push -m "login sayfasi WIP"

# Sadece belirli dosyalari stash'le
git stash push -m "sadece css" -- src/style.css src/app.css

# Untracked dosyalari da dahil et
git stash -u

# Stash listesi
git stash list

# Belirli bir stash'i uygula (silmeden)
git stash apply stash@{2}

# Belirli bir stash'i uygula ve sil
git stash pop stash@{1}

# Stash icerigini gor
git stash show -p stash@{0}

# Stash'ten yeni branch olustur
git stash branch yeni-branch stash@{0}

# Tek bir stash sil
git stash drop stash@{1}

# Tum stash'leri temizle
git stash clear

Reflog ile Kayip Commit Kurtarma

git reflog, HEAD'in tüm hareketlerini kaydeder. Yanlis reset --hard veya silinen branch'teki commit'leri kurtarmak için kullanilir:

bash
# Reflog gecmisini gor
git reflog

# Ornek cikti:
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# f4e5d6c HEAD@{1}: commit: onemli ozellik eklendi
## 7g8h9i0 HEAD@{2}: commit: baska bir degisiklik

# Kayip commit'e geri don
git reset --hard f4e5d6c

# Veya kayip commit'ten yeni branch olustur
git branch kurtarma-branch f4e5d6c

Silinen branch'i kurtarma:

bash
# Branch silindi
git branch -D feature/login

# Reflog'dan son commit'i bul
git reflog | grep "feature/login"

# Branch'i yeniden olustur
git branch feature/login <commit-hash>

Reflog kayitlari varsayılan olarak 90 gun saklanir.

Worktree İleri Kullanım

bash
# Mevcut branch'ten yeni worktree
git worktree add ../hotfix-branch hotfix/v2.1

# Yeni branch olusturarak worktree ekle
git worktree add -b feature/new-ui ../new-ui-work

# Tum worktree'leri listele
git worktree list

# Worktree kaldir
git worktree remove ../hotfix-branch

# Temizlik (silinen dizinlere ait referanslari kaldir)
git worktree prune

Worktree kullanım senaryolari:

  • Acil hotfix yaparken mevcut calismayi bozmamak
  • Ayni anda iki farkli branch'te code review yapmak
  • Uzun suren build sirasinda baska bir branch'te calismak

🧳 Git Stash

📥 Değişiklikleri Geçici Olarak Sakla

bash
git switch -c features/log
git switch -c features/mod
git switch features/log
git stash          # features/log'daki işleri gizle
git switch features/mod

git stash pop veya git stash apply ile geri alabilirsin.


🌲 git worktree

Tek repo içinde birden fazla çalışma dizini açarak aynı anda farklı özellikler geliştirmeye yarar.

➕ Worktree Ekle

bash
git worktree add ../calculator-feature
git worktree add ../bmi-calculator

➖ Worktree Kaldır

bash
git worktree remove ../calculator-feature
git worktree remove ../bmi-calculator

⚠️ Git Çakışmaları (Conflicts)

🔧 Çözüm Yöntemleri

bash
vim readme.md      # dosyayı aç, manuel çöz
git mergetool      # belirlediğin merge aracını çalıştır
git merge doc/readme-code

.gitignore Detayli Rehber

Pattern Syntax

PatternAçıklamaÖrnek
*Herhangi bir karakter dizisi (/ haric)*.log tüm log dosyaları
**Herhangi bir dizin derinligi**/test tüm test klasorleri
?Tek bir karakterfile?.txt file1.txt, fileA.txt
[abc]Belirtilen karakterlerden birifile[0-9].txt
!Istisna (ignore'u geri al)!important.log
/ (basta)Sadece root dizinde/build sadece root'taki build
/ (sonda)Sadece dizinlerlogs/ sadece logs dizini

Örnek .gitignore Dosyasi

bash
# Derleme ciktilari
*.class
*.o
*.out
*.exe
dist/
build/

# Bagimlililklar
node_modules/
vendor/
__pycache__/
*.pyc
.venv/

# IDE ve editor
.vscode/
.idea/
*.iml
*.swp
*.swo
*~

# Isletim sistemi
.DS_Store
Thumbs.db
desktop.ini

# Ortam degiskenleri ve hassas dosyalar
.env
.env.local
.env.*.local
*.pem
*.key
credentials.json

# Log dosyalari
*.log
npm-debug.log*
yarn-debug.log*

# Test kapsami
coverage/
.nyc_output/

Global Gitignore

Tüm projeler için gecerli global ignore dosyasi:

bash
# Global gitignore olustur
git config --global core.excludesFile ~/.gitignore_global

~/.gitignore_global icerigi:

.DS_Store
Thumbs.db
*.swp
*.swo
*~
.idea/
.vscode/settings.json

Dil Bazli Sablonlar

Hazir sablonlar için: github/gitignore

bash
# gitignore.io uzerinden sablon olusturma
curl -sL https://www.toptal.com/developers/gitignore/api/node,react,visualstudiocode > .gitignore

Cache Temizleme

Zaten takip edilen bir dosyayi ignore listesine ekledikten sonra cache'i temizlemek gerekir:

bash
git rm -r --cached .
git add .
git commit -m "gitignore guncellemesi"

Workflow Stratejileri

GitFlow vs Trunk-Based vs GitHub Flow

ÖzellikGitFlowTrunk-BasedGitHub Flow
Ana branch'lermain + developmainmain
Feature branchfeature/*Kisa omurlu (1-2 gun)feature/*
Release yönetimirelease/* branchTag + feature flagPR merge ile
Hotfixhotfix/* branchDogrudan main'ePR ile main'e
KarmasiklikYüksekDüşükOrta
Uygun oldugu ekipBüyük ekipler, sürüm takvimiCI/CD olgun ekiplerKüçük-orta ekipler
Deployment sikligiPlanlanan surumlerSurekli deploymentPR merge sonrasi

Conventional Commits

Commit mesajlari için standart format:

<tur>(<kapsam>): <aciklama>

[opsiyonel govde]

[opsiyonel alt bilgi]

Tur listesi:

TurAçıklama
featYeni özellik
fixBug duzeltme
docsDokumantasyon degisikligi
styleKod formatlama (islevsel degisiklik yok)
refactorKod yeniden yapılandırma
testTest ekleme/duzeltme
choreBuild, CI, bagimlillik güncelleme
perfPerformans iyilestirme
ciCI/CD degisiklikleri
buildBuild sistemi degisiklikleri
revertOnceki commit'i geri alma

Breaking change belirtme:

bash
feat(api)!: kullanici endpoint'i degistirildi

BREAKING CHANGE: /users endpoint'i /v2/users olarak tasindi.
Eski endpoint 3 ay sonra kaldirilacak.

PR Best Practices

  • PR boyutunu küçük tut (ideal: 200-400 satir degisiklik)
  • Aciklayici baslik ve açıklama yaz
  • Ilgili Issue'yu referansla (Closes #123)
  • Self-review yap, PR acmadan once kendi kodunu incele
  • Ekran goruntuleri veya GIF ekle (UI degisikliklerinde)
  • Draft PR kullanarak erken geri bildirim al
  • CI/CD pipeline'in gectiginden emin ol
  • En az 1 reviewer ata

Branch Isimlendirme Kurallari

<tur>/<kisa-aciklama>
TurÖrnek
feature/feature/user-authentication
fix/fix/login-redirect-bug
hotfix/hotfix/security-patch
docs/docs/api-documentation
refactor/refactor/database-layer
test/test/payment-integration
chore/chore/update-dependencies
release/release/v2.1.0

Git Config ve Alias

Faydali Alias'lar

bash
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph --all --decorate"
git config --global alias.last "log -1 HEAD --stat"
git config --global alias.unstage "reset HEAD --"
git config --global alias.undo "reset --soft HEAD~1"
git config --global alias.amend "commit --amend --no-edit"
git config --global alias.branches "branch -a --sort=-committerdate"
git config --global alias.stash-all "stash save --include-untracked"
git config --global alias.graph "log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'"
AliasKomutAçıklama
git stgit statusHızlı durum kontrolu
git cogit checkoutBranch değiştirme kisayolu
git brgit branchBranch listeleme
git cigit commitHızlı commit
git lggit log --oneline --graph --allGörsel commit gecmisi
git lastgit log -1 HEAD --statSon commit detayi
git unstagegit reset HEAD --Stage'den cikarma
git undogit reset --soft HEAD~1Son commit'i geri al

Conditional Includes

Farkli projeler için farkli Git konfigurasyonlari kullanmak mumkundur:

~/.gitconfig:

ini
[user]
    name = Fahri Aydin
    email = fahri@personal.com

[includeIf "gitdir:~/work/"]
    path = ~/.gitconfig-work

[includeIf "gitdir:~/opensource/"]
    path = ~/.gitconfig-oss

~/.gitconfig-work:

ini
[user]
    email = fahri@company.com
    signingkey = WORK_GPG_KEY
[commit]
    gpgsign = true

Bu sayede ~/work/ altindaki tüm projelerde is e-postasi ve GPG anahtari otomatik kullanilir.


Güvenlik

Signed Commits (GPG/SSH)

Commit'lerin gercekten sizden geldigini dogrulamak için imzalama:

GPG ile imzalama:

bash
# GPG anahtari olustur
gpg --full-generate-key

# Anahtar ID'sini bul
gpg --list-secret-keys --keyid-format=long
# sec   rsa4096/ABCDEF1234567890 2024-01-01

# Git'e tanimla
git config --global user.signingkey ABCDEF1234567890
git config --global commit.gpgsign true

# Publick key'i GitHub'a ekle
gpg --armor --export ABCDEF1234567890
# Ciktiyi GitHub > Settings > SSH and GPG keys > New GPG key

SSH ile imzalama (Git 2.34+):

bash
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true

Hassas Dosyaları Koruma

.gitignore ile hassas dosyaları repo disinda tut:

.env
.env.*
*.pem
*.key
*.p12
credentials.json
service-account.json

Yanlis commit edilen hassas bilgiyi gecmisten temizleme:

bash
# git-filter-repo ile (onerilen)
pip install git-filter-repo
git filter-repo --path credentials.json --invert-paths

# BFG Repo Cleaner ile
java -jar bfg.jar --delete-files credentials.json
java -jar bfg.jar --replace-text passwords.txt
git reflog expire --expire=now --all
git gc --prune=now --aggressive

git-secrets

AWS anahtarlari gibi hassas bilgilerin yanlis commit edilmesini onler:

bash
# Kurulum
brew install git-secrets   # macOS
# veya kaynaktan kurulum

# Repo'ya ekle
git secrets --install
git secrets --register-aws

# Tum yeni repo'lara otomatik ekle
git secrets --install ~/.git-templates/git-secrets
git config --global init.templateDir ~/.git-templates/git-secrets

BFG Repo Cleaner

Repo gecmisinden büyük dosyaları veya hassas bilgileri temizlemek için git filter-repo'dan daha hızlı bir alternatif:

bash
## 100MB'dan buyuk dosyalari sil
java -jar bfg.jar --strip-blobs-bigger-than 100M

# Belirli dosyalari sil
java -jar bfg.jar --delete-files "*.zip"

# Temizlik
git reflog expire --expire=now --all
git gc --prune=now --aggressive

# Zorunlu push (dikkatli ol)
git push --force-with-lease

📦 Git LFS ile Büyük Dosyaları Yönet

🧭 Takip Etme & Çekme

bash
git lfs track "big-file.txt"
git lfs pull

🧹 git filter-repo (geçmiş temizleme)

bash
pip install git-filter-repo
git filter-repo --path file-name --invert
git log -p | grep "API_KEY"
# replace.txt dosyasında:
sk-apikey==>REDACTED
git filter-repo --replace-text replace.txt

git filter-repo uzak repodaki geçmişi yeniden yazar; dikkatle kullan.


🧩 git submodule

Repo içinde repo kullanımı – ortak modüller için ideal yapıdır

✔ Submodule Nedir?

Bir Git reposu içine, bağımsız çalışan başka bir Git reposunu eklemeye "submodule" denir.
Ana repo yalnızca submodule'ün hangi commit'te olduğunu kaydeder.

✔ Ne Zaman Kullanılır?

  • Ortak kod birden fazla projede kullanılıyorsa
  • Kütüphane/modül bağımsız gelişiyorsa
  • Kod tekrarından kaçınmak istiyorsan

✔ Submodule Ekleme (ilk kurulum)

bash
git submodule add <repo-url> <klasor-adi>
# Örnek: git submodule add https://github.com/org/shared-lib libs/shared-lib

# Ana repo ilk kez klonlandığında submodule dosyalarını çekmek için:
git submodule update --init --recursive

✔ Submodule Güncelleme

bash
# Submodule içindeki origin'den en son commitleri çek
git submodule update --remote <klasor-adi>

# Tüm submodule'leri tek seferde güncelle
git submodule update --remote --recursive

✔ Çalışma durumu ve referans görme

bash
git submodule status          # Her submodule hangi commit'te
git -C <klasor-adi> status    # Submodule içinden normal git status

✔ Submodule ile klonlama

bash
# Ana repoyu klonla + submodule'leri de indir
git clone --recurse-submodules <repo-url>

# Normal klonladıysan sonradan indir:
git submodule update --init --recursive

✔ Submodule Silme (temiz kaldırma)

bash
## 1) Git index'inden kaldır
git rm -f <klasor-adi>

## 2) Submodule config'lerini temizle
rm -rf .git/modules/<klasor-adi>

## 3) Dosya klasörünü sil
rm -rf <klasor-adi>

🌳 git subtree

Harici repo içeriğini belirli bir klasöre gömerek tek repo içinde yönetme yöntemi

✔ Subtree Nedir?

  • Başka bir repo içeriğini alt klasör olarak ekler, tek git geçmişi içinde yaşar.
  • Submodule'den farkı: Ayrı .git tutulmaz; tek repo klonuyla her şey gelir.

✔ Ne Zaman Kullanılır?

  • Harici kütüphane kodunu repo içinde taşıyıp tek komutla klonlamak istiyorsan
  • Submodule karmaşıklığından kaçmak ve tek commit akışı istiyorsan

✔ Remote Ekle

bash
git remote add upstream-lib <repo-url>
git remote -v   # doğrula

✔ Subtree Ekleme

bash
git subtree add --prefix=<klasor> upstream-lib <branch> --squash
# Örnek:
git subtree add --prefix=libs/shared upstream-lib main --squash

✔ Harici Repo Güncelleme (Pull)

bash
git subtree pull --prefix=<klasor> upstream-lib <branch> --squash
# Örnek:
git subtree pull --prefix=libs/shared upstream-lib main --squash

✔ Kendi Değişikliklerini Harici Repo'ya Gönderme (Push)

bash
git subtree push --prefix=<klasor> upstream-lib <branch>

✔ İpucu

  • --squash geçmişi tek commit'te toplar, ana repo geçmişini sade tutar.
  • --prefix alt klasör adını belirtir; aynı remote ile birden çok klasör yönetilebilir.

Kaynak video: https://www.youtube.com/watch?v=iNgeJhjiM5E&list=PLh9tR6B_Q32rDSbSaN7Xw9Geba0Va7kpd

✔ Submodule vs Subtree Hızlı Karşılaştırma

ÖzellikSubmoduleSubtree
Klonlamagit clone sonrası git submodule update --init gerekirTek klonla tüm içerik gelir
Bağımsız repo geçmişiAyrı .git klasörüyle saklanırAna repo geçmişinde birleşir
Güncellemegit submodule update --remotegit subtree pull --prefix=...
EşitlemeSubmodule içinde commit + ana repo referansıNormal commit akışı içinde kalır
Kullanım durumuAynı modül birden çok projede paylaşılıyorsaHarici kodu tek repo halinde yönetmek

İpucu: Submodule, bağımsız sürümlemeye ihtiyaç duyduğunda; Subtree, tek akışta kalmak istediğinde daha uygundur.


📦 Git bundle

Bundled arşivler tek bir dosyaya tüm repo geçmişini koyup offline paylaşmak için kullanılır.

🔗 Kullanım

bash
git bundle create repo.bundle --all     # bundle oluştur
ls
cd ..
mkdir test-bundle && cd test-bundle
git clone ../git-course/repo.bundle .   # örnek import

Tips ve Puf Noktalari

Görsel Log

bash
# Dallanma yapisini gorsel olarak gor
git log --oneline --graph --all --decorate

# Belirli dosyanin gecmisini gor
git log --oneline --follow -- dosya.txt

# Belirli bir yazarin commit'leri
git log --author="fahri" --oneline

# Tarih araliginda commit'ler
git log --after="2024-01-01" --before="2024-06-30" --oneline

force-with-lease vs force

bash
# TEHLIKELI: Baskalarinin push'larini ezer
git push --force

# GUVENLI: Baskasi push yaptiysa reddeder
git push --force-with-lease

--force-with-lease her zaman --force yerine tercih edilmelidir. Remote'ta sizin bilmediginiz yeni commit varsa islemi reddeder.

Amend Dikkat Noktalari

bash
# Son commit'i degistir (henuz push edilmemisse guvenli)
git commit --amend -m "duzeltilmis mesaj"

# Dosya ekleyip commit'i guncelle
git add unutulan-dosya.txt
git commit --amend --no-edit

Push edilmis commit uzerinde amend yapilmasi --force-with-lease gerektirir. Paylasilan branch'lerde dikkatli olun.

.gitattributes

Dosya turlerine gore Git davranislarini belirler:

# Satir sonu normalizasyonu
* text=auto
*.sh text eol=lf
*.bat text eol=crlf

# Binary dosyalar
*.png binary
*.jpg binary
*.pdf binary
*.zip binary

# Git LFS
*.psd filter=lfs diff=lfs merge=lfs -text
*.ai filter=lfs diff=lfs merge=lfs -text

# Diff gosterimi
*.min.js -diff
*.min.css -diff

# Merge stratejisi
package-lock.json merge=ours
yarn.lock merge=ours

Diger Faydali Komutlar

bash
# Dosyayi tum gecmiste ara
git log --all --full-history -- "**/dosya-adi.txt"

# Kim, ne zaman, hangi satiri degistirdi
git blame dosya.txt

# Belirli satirlari blame
git blame -L 10,20 dosya.txt

# Commit'teki degisiklikleri gor
git show <commit-hash>

# Iki branch arasindaki fark
git diff branch1..branch2

# Degisikliklerin istatistigi
git diff --stat HEAD~5

# Tum remote branch'leri guncelle ve silinen branch referanslarini temizle
git fetch --all --prune

# Repo boyutunu kontrol et
git count-objects -vH

Git Troubleshooting

Sikca Karsilasilan Sorunlar ve Cozumleri

Merge conflict cozumu:

bash
# Conflict olan dosyalari gor
git status

# Dosyayi ac ve conflict isaretlerini temizle
# <<<<<<< HEAD
# Sizin degisikliginiz
# =======
# Gelen degisiklik
# >>>>>>> branch-adi

# Cozumden sonra
git add <cozulen-dosya>
git commit

Yanlis branch'e commit yapildi:

bash
# Commit'i geri al ama degisiklikleri koru
git reset --soft HEAD~1

# Dogru branch'e gec
git switch dogru-branch

# Degisiklikleri commit et
git add .
git commit -m "dogru branch'e tasinmis commit"

Detached HEAD durumu:

bash
# Neredesin kontrol et
git status
# HEAD detached at abc1234

# Mevcut durumu yeni branch olarak kaydet
git switch -c kurtarma-branch

# Veya mevcut branch'e geri don
git switch main

Push reddedildi (non-fast-forward):

bash
# Once remote degisiklikleri al
git pull --rebase origin main

# Conflict varsa coz, sonra devam et
git rebase --continue

# Push et
git push origin main

Büyük dosya hatasi:

bash
# Dosyayi LFS'e tasi
git lfs track "*.psd"
git add .gitattributes
git add dosya.psd
git commit -m "buyuk dosya LFS'e tasinidi"

# Gecmisten buyuk dosyayi temizle
git filter-repo --strip-blobs-bigger-than 50M

Performans Iyilestirme

bash
# Repo'yu optimize et
git gc --aggressive --prune=now

# Shallow clone (buyuk repo'larda hizli klonlama)
git clone --depth 1 <repo-url>

# Partial clone (blob'suz klonlama)
git clone --filter=blob:none <repo-url>

# Sparse checkout (sadece belirli klasorleri indir)
git sparse-checkout init --cone
git sparse-checkout set src/frontend docs

Git Maintenance (Otomatik Bakim)

bash
# Otomatik bakim planla
git maintenance start

# Manuel bakim calistir
git maintenance run --task=gc
git maintenance run --task=commit-graph
git maintenance run --task=prefetch

Git ile Calismada Altin Kurallar

  1. Sik commit yap -- Küçük, anlamli commit'ler büyük monolitik commit'lerden iyidir
  2. Anlamli commit mesajlari yaz -- "fix" degil, "fix: login sayfasinda sifre doğrulama hatasi duzeltildi"
  3. Main/master branch'ine dogrudan push yapma -- PR süreci kullan
  4. Push etmeden once pull yap -- Conflict'leri erken yakala
  5. force yerine force-with-lease kullan -- Baskalarinin calismasini korur
  6. Hassas bilgileri commit etme -- .env, API key, sifre
  7. Branch'leri temiz tut -- Merge edilen branch'leri sil
  8. .gitignore'u projenin basinda oluştur -- Gereksiz dosyalar repo'ya girmesin
  9. Tag kullan -- Release noktalarini isaretlemek için git tag -a v1.0.0 -m "ilk sürüm"
  10. Backup planin olsun -- Remote repo + local backup

Ilgili Rehberler

DevOps & Tools

Diger Kategoriler

Developer Guides & Technical References