Yazılım geliştiriciler ve sistem mühendisleri için günlük iş akışlarında en sık karşılaşılan senaryolar, çakışma çözümleri ve üretim standartlarını içeren kapsamlı Git başvuru rehberi.
1. Git Kurulumundan Hemen Sonra Yapılması Gereken İlk Ayarlar Nelerdir?
Commit geçmişinde yazar bilgilerinin doğru görünmesi ve işletim sistemleri arası satır sonu uyumsuzluklarının önlenmesi için global yapılandırma yapılmalıdır:
# Kimlik tanımlama
git config --global user.name "Ad Soyad"
git config --global user.email "eposta@alanadi.com"
# Varsayılan dal adını main yapma
git config --global init.defaultBranch main
# Windows için satır sonu dönüşümü (Linux/macOS için input)
git config --global core.autocrlf trueCode language: PHP (php)Doğrulama: git config --list komutunu çalıştırarak listede belirlediğiniz ad, e-posta ve init.defaultBranch=main değerini teyit edin.
2. Sıfırdan Bir Depo (Repository) Nasıl Başlatılır veya Klonlanır?
Yeni bir yerel dizini Git deposuna dönüştürmek veya uzak sunucudaki depoyu yerele çekmek için:
# Yeni bir yerel klasörü depoya dönüştürme
mkdir proje-adi && cd proje-adi
git init
# Uzak depoyu (GitHub, GitLab vb.) klonlama
git clone https://github.com/kullanici/depo.gitCode language: PHP (php)3. Dosyaları Sahneye (Staging Area) Alma ve Commit Mantığı Nedir?
Git, değişiklikleri doğrudan depoya kaydetmek yerine iki aşamalı bir güvenlik katmanı kullanır:
# Değişiklikleri sahne alanına ekleme
git add dosya.txt # Tek dosya
git add . # Değişen tüm dosyalar
# Sahnedeki snapshot'ı kaydetme
git commit -m "feat: login ekranina parola sifirlama eklendi"Code language: PHP (php)Doğrulama: git status çıktısında working tree clean mesajını görmelisiniz.
4. .gitignore Dosyası Nedir ve Takip Edilen Dosyalar Neden Silinmez?
.gitignore, depoya dahil edilmemesi gereken hassas veya türetilmiş dosyaları (örneğin .env, derleme çıktıları, loglar) hariç tutar. Eğer bir dosya daha önce commit edilmişse, sonradan .gitignore dosyasına yazılsa dahi takip edilmeye devam eder. Takibi bırakmak için dosya indeksini temizleyin:
git rm --cached dosya-adi
git commit -m "chore: dosya takipten cikarildi"Code language: JavaScript (javascript)5. Yeni Bir Dal (Branch) Nasıl Açılır ve Dallar Arası Geçiş Nasıl Yapılır?
Ana dalı izole tutarak yeni özellik geliştirmek için dallar kullanılır:
# Yeni bir dal oluşturup o dala geçiş yapma
git checkout -b feature/odeme-entegrasyonu
# Modern Git sözdizimi:
git switch -c feature/odeme-entegrasyonu
# Mevcut dalları listeleme
git branch -aCode language: PHP (php)6. İki Dal Nasıl Birleştirilir (Merge vs. Rebase)?
Geliştirme dalı tamamlandığında ana dal ile birleştirilirken iki farklı yöntem tercih edilebilir:
- Merge: Geçmişi olduğu gibi korur, birleştirme commit’i (merge commit) atar.
- Rebase: Dalın başlangıç noktasını hedef dalın ucuna taşır; doğrusal ve temiz bir commit ağacı sağlar.
# Merge yöntemi
git checkout main
git merge feature/odeme-entegrasyonu
# Rebase yöntemi
git checkout feature/odeme-entegrasyonu
git rebase mainCode language: PHP (php)7. Merge Conflict (Birleştirme Çakışması) Nasıl Çözülür?
İki farklı dalda aynı dosyanın aynı satırları değiştirildiğinde Git otomatik birleştirme yapamaz:
git statuskomutu ile çakışan dosyaları tespit edin.- İlgili dosyayı açıp
<<<<<<<,=======,>>>>>>>işaretleri arasındaki blokları düzenleyin. - Çözülen dosyayı sahneye alarak işlemi tamamlayın:
git add cozulmus-dosya.php
git commit -m "fix: merge conflict giderildi"Code language: JavaScript (javascript)8. Yarım Kalan İşleri Kaybetmeden Dal Değiştirme (git stash)
Henüz commit atmaya hazır olmadığınız bir çalışma anında başka bir dala hızlıca geçmeniz gerekirse:
# Değişiklikleri geçici belleğe alma
git stash
# İşi tamamlayıp geri döndükten sonra değişiklikleri uygulama
git stash popCode language: PHP (php)9. Son Commit Mesajını veya Unutulan Dosyayı Düzeltme (–amend)
Henüz uzak sunucuya push edilmemiş en son commit’in mesajını güncellemek veya içine yeni dosya eklemek için:
git add unutulan-dosya.txt
git commit --amend -m "feat: duzeltilmis commit mesaji"Code language: JavaScript (javascript)10. Henüz Commit Edilmemiş Yerel Değişiklikler Nasıl İptal Edilir?
# Belirli bir dosyadaki yerel değişiklikleri geri alma
git restore dosya.js
# Sahneye (staged) alınmış dosyayı sahneden çıkarma
git restore --staged dosya.js
# Takip edilmeyen (untracked) yeni dosyaları topluca silme
git clean -fdCode language: PHP (php)11. Geçmiş Bir Commit Nasıl Geri Alınır (git revert vs git reset)?
Canlı ortamda bulunan hatalı bir commit’i geri alırken ortak çalışma geçmişini bozmamak adına revert tercih edilmelidir:
# Güvenli: Hedef commit'in tersi yeni bir commit oluşturur
git revert <commit_hash>
# Dikkat: Yerel geçmişi doğrudan belirtilen commit'e çeker
git reset --soft HEAD~1 # Değişiklikleri staged alanında tutar
git reset --hard HEAD~1 # Değişiklikleri tamamen silerCode language: PHP (php)12. Silinen veya Kaybolan Commit’ler Nasıl Kurtarılır (git reflog)?
Yanlışlıkla git reset --hard çalıştırıldığında veya silinen dalları kurtarmak gerektiğinde Git referans günlüğü devreye girer:
# Tüm referans hareketlerini listeleme
git reflog
# Hatanın öncesindeki referans noktasına dönme (Örn: HEAD@{2})
git reset --hard HEAD@{2}Code language: CSS (css)13. git fetch ile git pull Arasındaki Fark Nedir?
- git fetch: Uzak depodaki yeni dalları ve commit meta verilerini yerele çeker ancak mevcut çalışma dosyalarınızı değiştirmez.
- git pull: Arka planda önce
git fetchçalıştırır, ardından gelen değişiklikleri bulunduğunuz yerel dala doğrudan birleştirir (merge).
14. Başka Bir Daldan Yalnızca Tek Bir Commit Nasıl Alınır (git cherry-pick)?
Geliştirme dalının tamamını birleştirmeden, yalnızca kritik bir düzeltme commit’ini mevcut dala dahil etmek için:
git checkout main
git cherry-pick <commit_hash>Code language: HTML, XML (xml)15. Commit Geçmişi Terminalde Temiz Bir Şekilde Nasıl İncelenir?
# Ağaç yapısı halinde tek satırlık commit geçmişi
git log --oneline --graph --decorate --all
# Commit mesajlarında arama
git log --grep="login"
# Kod satırları içerisinde değişiklik arama
git log -S "api_secret_key"Code language: PHP (php)16. Değişiklikler ve Dallar Arasındaki Farklar Nasıl Kıyaslanır (git diff)?
# Henüz sahnelenmemiş (unstaged) farkları görme
git diff
# Sahneye alınmış (staged) farkları görme
git diff --staged
# İki dal arasındaki farkları listeleme
git diff main..feature/yeni-tasarimCode language: PHP (php)17. Sisteme Sızan Hatayı Tespit Etme: git bisect
Büyük projelerde sistemin tam olarak hangi commit ile bozulduğunu bulmak için ikili arama (binary search) algoritması çalıştırılır:
git bisect start
git bisect bad # Mevcut sürümde hata var
git bisect good v1.0.0 # v1.0.0 sürümünde hata yoktu
# Git commit'ler arasında otomatik geçiş yapar; her adımda test edip 'good' veya 'bad' işaretleyin.
# İnceleme bittiğinde:
git bisect resetCode language: PHP (php)18. Kod Satırını Kimin ve Ne Zaman Yazdığını Bulma (git blame)
# Belirli satır aralıklarının yazar ve commit bilgilerini dökme
git blame -L 10,25 config.phpCode language: CSS (css)19. Sürüm Etiketleme (Git Tag) Nasıl Yapılır?
Canlı ortama aktarılan kararlı sürümleri (Release) sabitlemek ve takip etmek için etiketler kullanılır:
# Açıklamalı (annotated) etiket oluşturma
git tag -a v1.0.0 -m "Release v1.0.0 - Üretim Sürümü"
# Etiketi uzak sunucuya gönderme
git push origin v1.0.0
# Tüm etiketleri gönderme
git push origin --tagsCode language: CSS (css)20. Birden Fazla Depoyu Birlikte Yönetme: Git Submodule
Proje dizini içerisinde bağımsız bir harici kütüphaneyi veya çekirdek depoyu alt modül olarak tutmak için:
# Alt modülü ekleme
git submodule add https://github.com/ornek/ortak-kutuphane.git lib/ortak-kutuphane
# Alt modülleri içeren projeyi klonlama
git clone --recurse-submodules https://github.com/kullanici/ana-depo.gitCode language: PHP (php)21. Uzak Sunucu Bağlantıları (Remote) Nasıl Yönetilir?
# Mevcut uzak depoları listeleme
git remote -v
# Yeni uzak depo ekleme
git remote add origin https://github.com/kullanici/depo.git
# Uzak depo adresini değiştirme (Örn: SSH protokolüne geçiş)
git remote set-url origin git@github.com:kullanici/yeni-depo.gitCode language: PHP (php)22. Force Push Riskleri ve Güvenli Alternatifi: –force-with-lease
Geçmişi yeniden yazılan bir dalı uzak sunucuya git push --force ile göndermek ekip arkadaşlarının yeni commit’lerini ezebilir. Bunun yerine yalnızca yerel referans ile uzak sunucu örtüşüyorsa izin veren güvenli bayrak kullanılmalıdır:
git push --force-with-leaseCode language: JavaScript (javascript)




