Git Crash Course: Sıfırdan İleri Seviyeye Komple Rehber

Git, günümüzde yazılım geliştirmenin vazgeçilmez araçlarından biri haline gelmiştir. Bu kapsamlı rehberde, Git’i hiç bilmeyenlerden başlayarak ileri seviye kullanıcılara kadar herkesin faydalanabileceği bir öğrenme yolculuğu sunacağım.

Git Nedir ve Neden Kullanılır?

Git, Linus Torvalds tarafından 2005 yılında geliştirilen dağıtık bir versiyon kontrol sistemidir. Basit bir tanımla, projelerinizdeki değişiklikleri takip etmenize, geri almanıza ve birden fazla kişiyle çalışmanıza olanak sağlar.

Git’in Temel Avantajları:

  • Versiyon Kontrolü: Dosyalarınızdaki her değişikliği takip eder
  • İşbirliği: Birden fazla geliştiricinin aynı proje üzerinde çalışmasını sağlar
  • Güvenlik: Tüm geçmiş verileriniz güvenli bir şekilde saklanır
  • Hız: Yerel işlemler sayesinde çok hızlı çalışır
  • Dallanma (Branching): Farklı özellikler üzerinde bağımsız çalışma imkanı

Git Kurulumu

Windows için:

  1. git-scm.com adresinden Git’i indirin
  2. İndirdiğiniz .exe dosyasını çalıştırın
  3. Kurulum sihirbazını takip edin (varsayılan ayarlar yeterlidir)

macOS için:

# Homebrew ile
brew install git

# Veya Xcode Command Line Tools ile
xcode-select --install

Linux için:

# Ubuntu/Debian
sudo apt update
sudo apt install git

# CentOS/RHEL
sudo yum install git

Kurulum Kontrolü:

git --version

İlk Kurulum ve Yapılandırma

Git’i kurduktan sonra kimlik bilgilerinizi ayarlayın:

# Kullanıcı adınızı ayarlayın
git config --global user.name "Adınız Soyadınız"

# E-mail adresinizi ayarlayın
git config --global user.email "[email protected]"

# Varsayılan editörü ayarlayın (opsiyonel)
git config --global core.editor "code"

# Ayarlarınızı kontrol edin
git config --list

Git’in Temel Kavramları

Repository (Depo)

Git projelerinizi sakladığı klasörlere repository denir. İki türü vardır:

  • Local Repository: Bilgisayarınızdaki depo
  • Remote Repository: GitHub, GitLab gibi uzak sunuculardaki depo

Çalışma Alanları

Git’te üç temel çalışma alanı vardır:

  1. Working Directory: Üzerinde çalıştığınız dosyaların bulunduğu alan
  2. Staging Area: Commit’lenmeye hazır dosyaların bekletildiği alan
  3. Repository: Kalıcı olarak kaydedilmiş dosyaların bulunduğu alan

Temel Git Komutları

Repository Oluşturma

# Yeni bir repository oluştur
git init

# Var olan bir repository'yi klonla
git clone https://github.com/kullanici/proje.git

Dosya Durumu Kontrolü

# Dosya durumlarını kontrol et
git status

# Değişiklikleri detaylı göster
git diff

# Staging area'daki değişiklikleri göster
git diff --staged

Dosyaları Staging Area’ya Ekleme

# Belirli bir dosyayı ekle
git add dosya.txt

# Tüm değişiklikleri ekle
git add .

# Belirli bir klasörü ekle
git add klasor/

# Sadece güncellenen dosyaları ekle (yeni dosyalar hariç)
git add -u

Commit Yapma

# Basit commit
git commit -m "Commit mesajı"

# Detaylı commit
git commit -m "Başlık" -m "Açıklama"

# Add ve commit'i birleştir (sadece takip edilen dosyalar için)
git commit -am "Mesaj"

Geçmiş İnceleme

# Commit geçmişini görüntüle
git log

# Özet halinde geçmiş
git log --oneline

# Grafik şeklinde geçmiş
git log --graph --oneline --all

# Belirli bir dosyanın geçmişi
git log dosya.txt

# Son n commit'i göster
git log -n 5

Dallanma (Branching) ve Birleştirme (Merging)

Branch (Dal) İşlemleri

# Mevcut branch'leri listele
git branch

# Yeni branch oluştur
git branch yeni-ozellik

# Branch oluştur ve geç
git checkout -b yeni-ozellik

# Modern yöntem (Git 2.23+)
git switch -c yeni-ozellik

# Branch'lar arası geçiş
git checkout main
git switch main

# Branch'i sil
git branch -d yeni-ozellik

# Zorla branch sil
git branch -D yeni-ozellik

Merge (Birleştirme) İşlemleri

# Branch'i mevcut branch'e birleştir
git merge yeni-ozellik

# Merge commit'i olmadan birleştir
git merge --squash yeni-ozellik

# Fast-forward merge'i önle
git merge --no-ff yeni-ozellik

Rebase İşlemleri

# Branch'i main üzerine rebase et
git rebase main

# İnteraktif rebase
git rebase -i HEAD~3

# Rebase'i iptal et
git rebase --abort

# Rebase'i devam ettir
git rebase --continue

Uzak Sunucu (Remote) İşlemleri

Remote Repository Ekleme

# Remote ekle
git remote add origin https://github.com/kullanici/proje.git

# Remote'ları listele
git remote -v

# Remote URL'ini değiştir
git remote set-url origin https://github.com/yeni-kullanici/proje.git

Push ve Pull İşlemleri

# Değişiklikleri uzak sunucuya gönder
git push origin main

# İlk push (upstream ayarla)
git push -u origin main

# Uzak sunucudan değişiklikleri al
git pull origin main

# Fetch ile sadece indir (merge etme)
git fetch origin

# Tüm branch'leri fetch et
git fetch --all

İleri Seviye Git Komutları

Stash (Saklama) İşlemleri

# Değişiklikleri sakla
git stash

# Mesajla sakla
git stash save "Yarım kalan özellik"

# Saklanan değişiklikleri listele
git stash list

# Son saklanan değişiklikleri geri getir
git stash pop

# Belirli stash'i geri getir
git stash apply stash@{1}

# Stash'i sil
git stash drop stash@{0}

# Tüm stash'leri temizle
git stash clear

Reset ve Revert İşlemleri

# Son commit'i geri al (değişiklikler korunur)
git reset HEAD~1

# Son commit'i tamamen sil
git reset --hard HEAD~1

# Staging area'yı temizle
git reset HEAD dosya.txt

# Belirli commit'e git
git reset --hard abc123

# Commit'i geri alan yeni commit oluştur
git revert HEAD

# Birden fazla commit'i geri al
git revert HEAD~2..HEAD

Cherry-pick

# Belirli commit'i mevcut branch'e uygula
git cherry-pick abc123

# Birden fazla commit'i uygula
git cherry-pick abc123 def456

# Conflict durumunda devam et
git cherry-pick --continue

Tag İşlemleri

# Lightweight tag oluştur
git tag v1.0.0

# Annotated tag oluştur
git tag -a v1.0.0 -m "Versiyon 1.0.0 yayınlandı"

# Tag'leri listele
git tag

# Belirli commit'e tag ekle
git tag v1.0.0 abc123

# Tag'i uzak sunucuya gönder
git push origin v1.0.0

# Tüm tag'leri gönder
git push origin --tags

# Tag'i sil
git tag -d v1.0.0

# Uzak sunucudaki tag'i sil
git push origin --delete v1.0.0

Git Workflow Modelleri

Git Flow

Karmaşık projeler için yapılandırılmış bir workflow:

  • main: Üretim kodları
  • develop: Geliştirme kodları
  • feature/: Yeni özellikler
  • release/: Sürüm hazırlığı
  • hotfix/: Acil düzeltmeler
# Git Flow başlat
git flow init

# Yeni özellik başlat
git flow feature start yeni-ozellik

# Özelliği bitir
git flow feature finish yeni-ozellik

GitHub Flow

Daha basit ve sürekli deployment için uygun:

# Feature branch oluştur
git checkout -b feature/yeni-ozellik

# Çalış ve commit et
git add .
git commit -m "Yeni özellik eklendi"

# Push et
git push origin feature/yeni-ozellik

# Pull Request oluştur (GitHub'da)
# Review ve merge

Git İpuçları ve Best Practices

Commit Mesajları

İyi commit mesajları yazmanın kuralları:

# ✅ İyi örnekler
git commit -m "feat: kullanıcı giriş sistemi eklendi"
git commit -m "fix: null pointer exception düzeltildi"
git commit -m "docs: README dosyası güncellendi"

# ❌ Kötü örnekler
git commit -m "düzeltme"
git commit -m "çalışıyor"
git commit -m "test"

.gitignore Dosyası

Takip edilmemesi gereken dosyaları belirtin:

# Derlenmiş dosyalar
*.class
*.o
*.exe

# Geliştirme ortamı dosyaları
.vscode/
.idea/
*.swp

# Bağımlılıklar
node_modules/
vendor/

# İşletim sistemi dosyaları
.DS_Store
Thumbs.db

# Log dosyaları
*.log

# Geçici dosyalar
tmp/
temp/

Alias’lar (Kısayollar)

Sık kullanılan komutlar için kısayollar:

# Kısayol oluştur
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

# Karmaşık komutlar için alias
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.unstage "reset HEAD --"

Sık Karşılaşılan Problemler ve Çözümleri

1. “Permission denied (publickey)” Hatası

Problem: SSH anahtarı eksik veya yanlış yapılandırılmış.

Çözüm:

# SSH anahtarı oluştur
ssh-keygen -t rsa -b 4096 -C "[email protected]"

# SSH agent'ı başlat
eval "$(ssh-agent -s)"

# Anahtarı ekle
ssh-add ~/.ssh/id_rsa

# Public anahtarı kopyala ve GitHub'a ekle
cat ~/.ssh/id_rsa.pub

2. Merge Conflict (Çakışma)

Problem: İki branch’te aynı dosyanın aynı satırı değiştirilmiş.

Çözüm:

# Merge işlemini başlat
git merge feature-branch

# Conflict olan dosyaları düzenle
# <<<<<<< HEAD
# Mevcut branch'teki kod
# =======
# Merge edilen branch'teki kod
# >>>>>>> feature-branch

# Düzenleme sonrası
git add .
git commit -m "Merge conflict çözüldü"

3. Yanlış Commit Mesajı

Problem: Commit mesajında hata yapıldı.

Çözüm:

# Son commit mesajını değiştir
git commit --amend -m "Doğru commit mesajı"

# Push edilmişse (DİKKAT: Bu risky bir işlemdir)
git push --force-with-lease origin main

4. Yanlış Dosya Commit Edildi

Problem: İstenmeyen dosya commit’lendi.

Çözüm:

# Dosyayı repository'den kaldır ama local'de bırak
git rm --cached dosya.txt
git commit -m "Yanlış dosya kaldırıldı"

# .gitignore'a ekle
echo "dosya.txt" >> .gitignore
git add .gitignore
git commit -m ".gitignore güncellendi"

5. Detached HEAD Durumu

Problem: Branch dışında bir commit’te kalakaldınız.

Çözüm:

# Yeni branch oluştur
git checkout -b yeni-branch

# Veya var olan branch'e git
git checkout main

6. Branch Silinemiyor

Problem: “error: The branch ‘branch-name’ is not fully merged.”

Çözüm:

# Merge durumunu kontrol et
git branch --merged

# Zorla sil (DİKKAT: Veri kaybı olabilir)
git branch -D branch-name

# Güvenli sil (önce merge et)
git checkout main
git merge branch-name
git branch -d branch-name

7. Push Rejected Hatası

Problem: “Updates were rejected because the tip of your current branch is behind”

Çözüm:

# Önce pull yap
git pull origin main

# Rebase ile daha temiz geçmiş
git pull --rebase origin main

# Sonra push et
git push origin main

8. Large File Hatası

Problem: Çok büyük dosya push edilemiyor.

Çözüm:

# Git LFS kur ve kullan
git lfs install
git lfs track "*.zip"
git add .gitattributes
git add buyuk-dosya.zip
git commit -m "LFS ile büyük dosya eklendi"

9. Commit History Temizleme

Problem: Commit geçmişi karışık ve temizlenmesi gerekiyor.

Çözüm:

# Son 3 commit'i interactive rebase ile düzenle
git rebase -i HEAD~3

# Squash, reword, drop gibi işlemlerle düzenle
# pick abc123 İlk commit
# squash def456 İkinci commit
# reword ghi789 Üçüncü commit

10. Credential (Kimlik) Problemleri

Problem: Her seferinde kullanıcı adı/şifre soruyor.

Çözüm:

# Credential helper ayarla
git config --global credential.helper store

# Windows için
git config --global credential.helper manager

# Veya SSH kullan
git remote set-url origin [email protected]:username/repo.git

Performans İpuçları

Repository Boyutunu Küçültme

# Garbage collection çalıştır
git gc --aggressive --prune=now

# Büyük dosyaları bul
git rev-list --objects --all | sort -k 2 > allfileshas.txt

# Repository boyutunu kontrol et
du -sh .git

Hızlı Clone

# Sadece son commit'i clone et
git clone --depth 1 https://github.com/user/repo.git

# Belirli branch'i clone et
git clone --branch develop --single-branch https://github.com/user/repo.git

Git GUI Araçları

Komut Satırı Araçları

  • tig: Terminal’de görsel git arayüzü
  • lazygit: Go ile yazılmış terminal UI
  • git-cola: Python tabanlı GUI

Masaüstü Uygulamaları

  • GitHub Desktop: GitHub’ın resmi uygulaması
  • SourceTree: Atlassian’ın ücretsiz aracı
  • GitKraken: Görsel ve kullanıcı dostu

IDE Entegrasyonları

  • VS Code: GitLens eklentisi
  • IntelliJ IDEA: Yerleşik Git desteği
  • Vim/Neovim: fugitive.vim eklentisi

Sonuç ve Öneriler

Git öğrenmek başlangıçta zor görünse de, yazılım geliştirmenin vazgeçilmez bir parçasıdır. Bu rehberde anlattığım temel kavramları ve komutları günlük pratiğinizde kullanarak Git konusunda uzmanlaşabilirsiniz.

Önerilerim:

  1. Küçük projelerle başlayın ve Git’i günlük rutininizin parçası yapın
  2. Her zaman anlamlı commit mesajları yazın
  3. Sık sık commit yapın, büyük değişiklikleri parçalara bölün
  4. Branch’leri aktif olarak kullanın
  5. .gitignore dosyasını projenizin başında doğru ayarlayın
  6. Remote repository’leri düzenli olarak sync edin

Git’i öğrenme süreci devam eden bir yolculuktur. Bu rehberdeki bilgilerle sağlam bir temel atmış olacaksınız. Daha detaylı konular için Git’in resmi dökümanlarını ve pratik yaparak deneyim kazanmaya devam edebilirsiniz.

Sorularınız veya karşılaştığınız özel durumlar için bu yazının yorumlaarına sorabilirsiniz veya Git topluluğu ve Stack Overflow gibi platformlardan destek alabilirsiniz. İyi kodlamalar!

Bir Yorum Yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir