🚀 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
rm ~/.git-credentials 2>/dev/null || true
git config --global credential.helper store🆔 Kullanıcı Bilgisi Kaydetme
git config --global user.name "fahri"
git config --global user.email "fahriaydin47@gmail.com"🧰 Çalışma Alanını Git'e Çevir
git init🔍 Takip Durumunu Kontrol Et
git status📦 Dosyaları Staging Alanına Ekle
git add .→ tüm değişiklikleri hazırlagit add test.txt→ sadece belirtilen dosyayı ekle
💾 Commit & Geçmiş
git commit -m "mesaj"
git log
git log --oneline🔍 Farkları Gör
git diff
git diff test.txt♻️ Değişiklikleri Geri Al
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.gitgit remote -v→ kayıtlı tüm remote adreslerini listele
🚀 İlk Push / Projeyi Gönder
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
git clone https://github.com/CestnyTR/git-test.git
git clone <proje-linki>🛰️ Uzak Commit'leri İncele
git fetch # remote'tan güncel veriyi indir
git diff master..origin/master # lokal/remote farklarını gör🔄 Değişiklikleri Birleştir
git merge <branch>
git pull # fetch + merge🚢 Remote'a Gönder
git push -u origin feature/login
git push --force # pull yapmadan yükleme, dikkat ⚠️🌿 Branch İşlemleri
👀 Hangi Branch'teyim?
git branch🔁 Branch Değiştir / Oluştur
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
git merge <branch-adi>
git merge feature/login🧱 Commit Yönetimi
✏️ Son Commit'i Düzenle
git commit --amend # (nano'dan çıkış: Ctrl+X, Y)🕰️ Eski Commit'lere Dön / Branch Gezisi
git checkout <commit_id>
git checkout 0db7ee6
git checkout master # ana branch'e dönüş🔄 Reset Modları
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)
git revert <commit_id>
git revert 530e3a4🧭 Reflog: Silinen Commit'leri de Gör
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
- Ubuntu Sistem Güncellebash
sudo apt update - Python 3 (zaten kuruluysa tekrar gerekmez)bash
sudo apt install python3 - pipx Kurulumu ve PATH Ayarıbash
sudo apt install pipx pipx ensurepath exec $SHELL # veya terminali kapat-aç - READMEAI Bağımlılıkları (tiktoken derlemesi için)bash
sudo apt install build-essential pkg-config python3-dev - Rust Kurulumu (READMEAI için gerekli)bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env" - README-AI Kur / Yeniden Kurbash
pipx uninstall readmeai # varsa kaldır pipx install readmeai readmeai --help - Local Projeden README Üretbash
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 . - Ollama Kur ve Model Çalıştırbash
curl -fsSL https://ollama.com/install.sh | sh ollama run llama3 - READMEAI'yi Ollama Modeliyle Çalıştırbash
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:
sudo apt install ghGiriş yapmak:
gh auth login📦 Repo İşlemleri
🔹 Repo klonlama
gh repo clone owner/repo🔹 Yeni repo oluşturma
gh repo create my-repoÖrnek:
gh repo create my-repo --private --source .🔄 Pull Request (PR) İşlemleri
🔹 Yeni PR açma
gh pr create🔹 PR'ları listeleme
gh pr list🔹 PR detayını görme
gh pr view 123🔹 PR birleştirme (Merge)
gh pr merge 123🔀 Issue İşlemleri
🔹 Issue oluşturma
gh issue create --title "Bug found" --body "Details..."🔹 Issue listeleme
gh issue list🔹 Issue görüntüleme
gh issue view 15🔧 Branch & Commit Yönetimi
🔹 Repo fork etme
gh repo fork🔹 Commit geçmişini tarayıcıda aç
gh browse commits🔗 GitHub Web'e Geçiş
Repo sayfasını tarayıcıda aç
gh browsePR veya Issue tarayıcıda aç
gh pr view --web
gh issue view --web🔐 Kimlik & Token İşlemleri
Login durumu:
gh auth statusÇıkış:
gh auth logout🧭 Kısa Özet Tablosu
| İşlem | Komut |
|---|---|
| Repo klonla | gh repo clone owner/repo |
| Yeni repo oluştur | gh repo create |
| PR oluştur | gh pr create |
| PR listele | gh pr list |
| Issue oluştur | gh issue create |
| Issue listele | gh issue list |
| Tarayıcıda aç | gh browse |
| Giriş yap | gh auth login |
daha fazla bilgi için : cli.github.com
⚔️ Git Merge & Rebase
🔀 Merge Akışı
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-ffMerge sonrası iki branch geçmişi korunur;
--no-ffile ayrı merge commit'i garanti edilir.
🔁 Rebase Akışı (ekip içi kullanımda dikkat)
git switch -c doc/sum-docs
git switch master
git pull
git switch doc/sum-docs
git rebase masterRebase 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)
# 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 kaybolurSenaryo 2: Merge push edildi (remote'da var)
# 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 mainSenaryo 3: 2 önceki merge'ü geri alma
# 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 mainSenaryo 4: Birden fazla merge'ü geri alma
# 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?
# 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öntem | Ne Zaman | Güvenli mi | Geçmiş |
|---|---|---|---|
git reset --merge ORIG_HEAD | Henüz push etmediysen | ⚠️ Geçmişi siler | Temiz |
git reset --hard HEAD~1 | Local, değişiklik önemli değilse | ❌ Veri kaybı riski | Temiz |
git revert -m 1 <hash> | Push edildiyse (önerilen) | ✅ Güvenli | Revert commit kalır |
git revert --no-commit | Birden fazla geri alma | ✅ Güvenli | Tek commit |
⚠️ Dikkat
git reset --hardpush edilmiş commit'lerde kullanma — takım arkadaşlarının geçmişini bozar- Push edilmiş merge'lerde her zaman
git revertkullan - 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:
git rebase -i HEAD~5Acilan editorde her satirin basinda bir komut bulunur. Kullanilabilecek komutlar:
| Komut | Açıklama |
|---|---|
pick | Commit'i oldugu gibi birak |
reword | Commit mesajini değiştir (içerik ayni kalir) |
edit | Commit'te dur, degisiklik yapilmasina izin ver |
squash | Onceki commit ile birlestir, mesajlari birlestir |
fixup | Onceki commit ile birlestir, bu commit'in mesajini at |
drop | Commit'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 ayarlandigit rebase -i HEAD~3Editorde su sekilde değiştir:
pick abc1234 feat: buton eklendi
fixup def5678 fix: buton rengi duzeltildi
fixup ghi9012 fix: buton boyutu ayarlandiSonuç: Tek bir "feat: buton eklendi" commit'i kalir.
Commit Mesajini Degistirme
git rebase -i HEAD~2reword abc1234 eski mesaj
pick def5678 diger commitKaydet, 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 commitDikkat: Push edilmis commit'ler uzerinde interactive rebase yapilmasi
--force-with-leasegerektirir. 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
| Hook | Calistigi An | Kullanım Alani |
|---|---|---|
pre-commit | git commit oncesi | Lint, format kontrolu, test |
commit-msg | Commit mesaji yazildiktan sonra | Mesaj formati doğrulama |
pre-push | git push oncesi | Test suite calistirma |
prepare-commit-msg | Mesaj editoru acilmadan once | Otomatik mesaj sablonu |
post-merge | Merge tamamlandiktan sonra | Bagimliliklari güncelleme |
Örnek: pre-commit Hook
#!/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
fichmod +x .git/hooks/pre-commitÖrnek: commit-msg Hook
#!/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
fiHusky + lint-staged Kurulumu
Husky, Git hook'larini proje bazinda yonetmeyi kolaylastirir. lint-staged ise sadece stage'lenmis dosyalar uzerinde işlem yapar.
# Husky kurulumu
npm install -D husky lint-staged
npx husky init
# pre-commit hook tanimlama
echo "npx lint-staged" > .husky/pre-commitpackage.json icine lint-staged konfigurasyonu:
{
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{css,scss}": [
"prettier --write"
],
"*.{json,md}": [
"prettier --write"
]
}
}commitlint Kurulumu
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:
# 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:
git switch develop
git cherry-pick a1b2c3dBisect ile Otomatik Bug Bulma
git bisect, binary search algoritmasi kullanarak hatanin hangi commit'te girdigini bulur:
# 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 resetOtomatik bisect (test script'i ile):
git bisect start HEAD v1.0.0
git bisect run npm testGit, test script'inin cikis koduna gore otomatik olarak iyi/kotu kararini verir ve hatali commit'i bulur.
Stash İleri Kullanım
# 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 clearReflog 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:
# 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 f4e5d6cSilinen branch'i kurtarma:
# 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
# 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 pruneWorktree 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
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 popveyagit stash applyile geri alabilirsin.
🌲 git worktree
Tek repo içinde birden fazla çalışma dizini açarak aynı anda farklı özellikler geliştirmeye yarar.
➕ Worktree Ekle
git worktree add ../calculator-feature
git worktree add ../bmi-calculator➖ Worktree Kaldır
git worktree remove ../calculator-feature
git worktree remove ../bmi-calculator⚠️ Git Çakışmaları (Conflicts)
🔧 Çözüm Yöntemleri
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
| Pattern | Açıklama | Örnek |
|---|---|---|
* | Herhangi bir karakter dizisi (/ haric) | *.log tüm log dosyaları |
** | Herhangi bir dizin derinligi | **/test tüm test klasorleri |
? | Tek bir karakter | file?.txt file1.txt, fileA.txt |
[abc] | Belirtilen karakterlerden biri | file[0-9].txt |
! | Istisna (ignore'u geri al) | !important.log |
/ (basta) | Sadece root dizinde | /build sadece root'taki build |
/ (sonda) | Sadece dizinler | logs/ sadece logs dizini |
Örnek .gitignore Dosyasi
# 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:
# Global gitignore olustur
git config --global core.excludesFile ~/.gitignore_global~/.gitignore_global icerigi:
.DS_Store
Thumbs.db
*.swp
*.swo
*~
.idea/
.vscode/settings.jsonDil Bazli Sablonlar
Hazir sablonlar için: github/gitignore
# gitignore.io uzerinden sablon olusturma
curl -sL https://www.toptal.com/developers/gitignore/api/node,react,visualstudiocode > .gitignoreCache Temizleme
Zaten takip edilen bir dosyayi ignore listesine ekledikten sonra cache'i temizlemek gerekir:
git rm -r --cached .
git add .
git commit -m "gitignore guncellemesi"Workflow Stratejileri
GitFlow vs Trunk-Based vs GitHub Flow
| Özellik | GitFlow | Trunk-Based | GitHub Flow |
|---|---|---|---|
| Ana branch'ler | main + develop | main | main |
| Feature branch | feature/* | Kisa omurlu (1-2 gun) | feature/* |
| Release yönetimi | release/* branch | Tag + feature flag | PR merge ile |
| Hotfix | hotfix/* branch | Dogrudan main'e | PR ile main'e |
| Karmasiklik | Yüksek | Düşük | Orta |
| Uygun oldugu ekip | Büyük ekipler, sürüm takvimi | CI/CD olgun ekipler | Küçük-orta ekipler |
| Deployment sikligi | Planlanan surumler | Surekli deployment | PR merge sonrasi |
Conventional Commits
Commit mesajlari için standart format:
<tur>(<kapsam>): <aciklama>
[opsiyonel govde]
[opsiyonel alt bilgi]Tur listesi:
| Tur | Açıklama |
|---|---|
feat | Yeni özellik |
fix | Bug duzeltme |
docs | Dokumantasyon degisikligi |
style | Kod formatlama (islevsel degisiklik yok) |
refactor | Kod yeniden yapılandırma |
test | Test ekleme/duzeltme |
chore | Build, CI, bagimlillik güncelleme |
perf | Performans iyilestirme |
ci | CI/CD degisiklikleri |
build | Build sistemi degisiklikleri |
revert | Onceki commit'i geri alma |
Breaking change belirtme:
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
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)'"| Alias | Komut | Açıklama |
|---|---|---|
git st | git status | Hızlı durum kontrolu |
git co | git checkout | Branch değiştirme kisayolu |
git br | git branch | Branch listeleme |
git ci | git commit | Hızlı commit |
git lg | git log --oneline --graph --all | Görsel commit gecmisi |
git last | git log -1 HEAD --stat | Son commit detayi |
git unstage | git reset HEAD -- | Stage'den cikarma |
git undo | git reset --soft HEAD~1 | Son commit'i geri al |
Conditional Includes
Farkli projeler için farkli Git konfigurasyonlari kullanmak mumkundur:
~/.gitconfig:
[user]
name = Fahri Aydin
email = fahri@personal.com
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
[includeIf "gitdir:~/opensource/"]
path = ~/.gitconfig-oss~/.gitconfig-work:
[user]
email = fahri@company.com
signingkey = WORK_GPG_KEY
[commit]
gpgsign = trueBu 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:
# 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 keySSH ile imzalama (Git 2.34+):
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign trueHassas Dosyaları Koruma
.gitignore ile hassas dosyaları repo disinda tut:
.env
.env.*
*.pem
*.key
*.p12
credentials.json
service-account.jsonYanlis commit edilen hassas bilgiyi gecmisten temizleme:
# 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 --aggressivegit-secrets
AWS anahtarlari gibi hassas bilgilerin yanlis commit edilmesini onler:
# 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-secretsBFG Repo Cleaner
Repo gecmisinden büyük dosyaları veya hassas bilgileri temizlemek için git filter-repo'dan daha hızlı bir alternatif:
## 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
git lfs track "big-file.txt"
git lfs pull🧹 git filter-repo (geçmiş temizleme)
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-repouzak 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)
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
# 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
git submodule status # Her submodule hangi commit'te
git -C <klasor-adi> status # Submodule içinden normal git status✔ Submodule ile klonlama
# 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)
## 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ı
.gittutulmaz; 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
git remote add upstream-lib <repo-url>
git remote -v # doğrula✔ Subtree Ekleme
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)
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)
git subtree push --prefix=<klasor> upstream-lib <branch>✔ İpucu
--squashgeçmişi tek commit'te toplar, ana repo geçmişini sade tutar.--prefixalt 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
| Özellik | Submodule | Subtree |
|---|---|---|
| Klonlama | git clone sonrası git submodule update --init gerekir | Tek klonla tüm içerik gelir |
| Bağımsız repo geçmişi | Ayrı .git klasörüyle saklanır | Ana repo geçmişinde birleşir |
| Güncelleme | git submodule update --remote | git subtree pull --prefix=... |
| Eşitleme | Submodule içinde commit + ana repo referansı | Normal commit akışı içinde kalır |
| Kullanım durumu | Aynı modül birden çok projede paylaşılıyorsa | Harici 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
git bundle create repo.bundle --all # bundle oluştur
ls
cd ..
mkdir test-bundle && cd test-bundle
git clone ../git-course/repo.bundle . # örnek importTips ve Puf Noktalari
Görsel Log
# 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" --onelineforce-with-lease vs force
# 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
# 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-editPush 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=oursDiger Faydali Komutlar
# 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 -vHGit Troubleshooting
Sikca Karsilasilan Sorunlar ve Cozumleri
Merge conflict cozumu:
# 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 commitYanlis branch'e commit yapildi:
# 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:
# 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 mainPush reddedildi (non-fast-forward):
# Once remote degisiklikleri al
git pull --rebase origin main
# Conflict varsa coz, sonra devam et
git rebase --continue
# Push et
git push origin mainBüyük dosya hatasi:
# 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 50MPerformans Iyilestirme
# 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 docsGit Maintenance (Otomatik Bakim)
# Otomatik bakim planla
git maintenance start
# Manuel bakim calistir
git maintenance run --task=gc
git maintenance run --task=commit-graph
git maintenance run --task=prefetchGit ile Calismada Altin Kurallar
- Sik commit yap -- Küçük, anlamli commit'ler büyük monolitik commit'lerden iyidir
- Anlamli commit mesajlari yaz -- "fix" degil, "fix: login sayfasinda sifre doğrulama hatasi duzeltildi"
- Main/master branch'ine dogrudan push yapma -- PR süreci kullan
- Push etmeden once pull yap -- Conflict'leri erken yakala
- force yerine force-with-lease kullan -- Baskalarinin calismasini korur
- Hassas bilgileri commit etme -- .env, API key, sifre
- Branch'leri temiz tut -- Merge edilen branch'leri sil
- .gitignore'u projenin basinda oluştur -- Gereksiz dosyalar repo'ya girmesin
- Tag kullan -- Release noktalarini isaretlemek için
git tag -a v1.0.0 -m "ilk sürüm" - Backup planin olsun -- Remote repo + local backup
Ilgili Rehberler
DevOps & Tools
- DevOps Genel Bakış
- Docker Rehberi
- Kubernetes
- Nginx Rehberi
- Linux CLI
- Deployment & Hosting
- Ubuntu Rehberi
- VS Code Rehberi
- Regex Rehberi