czayvatar
Czay
Hakkımda
Blog
Projeler
İletişim

© 2025 Czay. All rights reserved.

Git Temelleri: Sürüm Kontrolüne Giriş ve Pratik Kullanım

Geri Dön

1. Giriş ve Motivasyon

Kod yazarken veya bir projede çalışırken, değişiklikleri takip etmek ve gerektiğinde eski bir sürüme dönebilmek çok önemlidir. İşte burada Git devreye girer!

Açıklama (Gerçek Hayat Benzetmesi)

Git, bir Word belgesinin "Farklı Kaydet" ile her adımda yedeğini almak gibidir. Ama çok daha akıllı ve otomatik!


2. Git Nedir ve Neden Kullanılır?

Açıklama (Neden Git?)

Git, dosyalarınızın ve kodunuzun geçmişini adım adım kaydeden bir sürüm kontrol sistemidir. Böylece hem kendi değişikliklerinizi hem de takım arkadaşlarınızın katkılarını güvenle yönetebilirsiniz.

  • Geri alma: Yanlış bir değişiklik mi yaptınız? Git ile kolayca eski haline dönebilirsiniz.
  • Takım çalışması: Birden fazla kişi aynı projede çakışmadan çalışabilir.
  • Deney ve güven: Yeni bir özellik denerken ana projeyi bozmadan çalışabilirsiniz.

3. Git Kurulumu ve İlk Ayarlar

  • Git İndir ve işletim sisteminize uygun şekilde kurun.
  • Kurulumdan sonra terminalde git --version yazarak kontrol edin.
  • Kullanıcı adı ve e-posta ayarlayın:
    git config --global user.name "Adınız Soyadınız"
    git config --global user.email "mail@adresiniz.com"
    

4. Temel Kavramlar: Commit, Branch, Staging, HEAD, DAG

Açıklama (Git Nasıl Çalışır?)

Git, dosyalarınızın her değişikliğinde bir "fotoğraf" (snapshot) alır. Bu fotoğraflar commit olarak adlandırılır ve bir zincir gibi birbirine bağlanır. Bu zincir, projenizin geçmişini oluşturur.

  • Staging Area (Index): Değişikliklerinizi commit’lemeden önce hazırladığınız alan.
  • Commit: Projenizin o anki halinin kaydı.
  • Branch: Farklı geliştirme yolları açmanızı sağlar. Ana dal genellikle main veya masterdır.
  • HEAD: Şu anda üzerinde çalıştığınız dalı gösterir.
  • DAG (Directed Acyclic Graph): Commit’ler birbirine yönlü ve döngüsüz bir şekilde bağlanır.
Açıklama (Gerçek Hayat Benzetmesi)

Staging area, alışveriş sepetiniz gibidir. Sepete ekledikleriniz commit’lenir, eklemedikleriniz rafta kalır.


5. Temel Git Komutları: İlk Adımlar

Yeni Bir Git Deposu Oluşturma

git init

Bulunduğunuz klasörü bir Git projesine çevirir.

Değişiklikleri Takip Etme

git status

Çalışma alanınızdaki değişiklikleri ve takip edilen dosyaları gösterir.

Dosya Ekleme (Staging)

git add dosya.txt

Belirli bir dosyayı ekler. Tüm dosyalar için:

git add .

Değişiklikleri Kaydetme (Commit)

git commit -m "Açıklama yazın"

Yaptığınız değişiklikleri kalıcı olarak kaydeder.

Geçmişi Görüntüleme

git log

Tüm commit geçmişini listeler.


6. Branch’ler ve Branch Stratejileri

  • Ana Dal (main/master): Daima dağıtıma hazır, stabil kod.
  • Feature Branch: Yeni özellikler için açılır, iş bitince ana dala birleştirilir.
  • Hotfix/Release Branch: Acil düzeltmeler veya sürüm hazırlığı için kullanılır.
Açıklama (Neden Branch Kullanılır?)

Aynı anda birden fazla özelliği veya düzeltmeyi birbirine karışmadan geliştirmek için.

Popüler Branch Stratejileri

  • Git Flow: Gelişmiş projelerde ana, develop, feature, release, hotfix dalları kullanılır.
  • GitHub Flow: Ana dal ve kısa ömürlü feature branch’ler.

7. Uzak Repo ve GitHub ile Çalışma

  • Uzak Repo (Remote): GitHub, GitLab gibi platformlarda barındırılan kopya.
  • Uzak repo ekleme:
    git remote add origin <repo-adresi>
    git push -u origin main
    
  • Uzak depodan son değişiklikleri almak:
    git pull
    
  • Var olan bir projeyi bilgisayarınıza indirmek:
    git clone <repo-adresi>
    

8. Sık Kullanılan Diğer Komutlar

  • git branch: Mevcut dalları (branch) listeler.
  • git checkout -b yeni-ozellik: Yeni bir dal oluşturup geçiş yapar.
  • git merge <dal>: Belirtilen dalı mevcut dala birleştirir.

9. Merge/Rebase, Çatışmalar ve Çözüm Yolları

Merge Çatışması Nasıl Oluşur? (Senaryo ve Örnek)

Senaryo: Bir projede iki kişi aynı dosyanın aynı satırında değişiklik yapıyor.

  1. Ana dalda bir dosya var:
    mesaj.txt:
    Merhaba dünya!
    
  2. feature-a branch’inde bu satır değiştiriliyor:
    mesaj.txt:
    Merhaba Copilot!
    
  3. feature-b branch’inde ise aynı satır farklı değiştiriliyor:
    mesaj.txt:
    Merhaba insan!
    
  4. Önce feature-a ana dala birleştiriliyor (merge). Sonra feature-b ana dala merge edilmek isteniyor. Bu durumda Git, aynı satırda iki farklı değişiklik olduğu için çatışma çıkarır.
Açıklama (Gerçek Hayat Benzetmesi)

İki kişi aynı Word belgesinde aynı cümleyi farklı şekilde değiştirirse, hangisinin doğru olduğuna karar vermek gerekir. Git de bunu size sorar.


Merge/Rebase Komutları ve Çatışma Çözümü

Merge

git merge feature-branch

İki dalı birleştirir. Commit geçmişi korunur.

Rebase

git rebase main

Dalınızı ana dalın sonuna taşır, daha temiz bir geçmiş sağlar.

Merge/Rebase Çatışmaları

  • Çatışma olduğunda dosyada <<<<<<<, =======, >>>>>>> işaretleri çıkar.
  • Çatışan satırları elle düzeltin, sonra:
    git add <dosya>
    git commit
    
  • Çatışma çözülene kadar commit atamazsınız.
Uyarı (Sık Yapılan Hata)

Çatışmayı çözmeden git add . ve git commit yapmak, hatalı kodun ana dala gitmesine neden olabilir.


10. Sık Yapılan Hatalar ve Kurtarma Yolları (Detaylı)

1. Yanlış Branch’te Commit Atmak

Senaryo: Ana dalda (main) çalıştığınızı sanıyordunuz, ama aslında feature dalındasınız ve commit attınız.

Çözüm:

  1. Commit’in hash’ini öğrenin:
    git log --oneline
    
  2. Ana dala geçin:
    git checkout main
    
  3. Commit’i ana dala taşıyın:
    git cherry-pick <commit-hash>
    
  4. Yanlış daldan commit’i silin:
    git checkout feature
    git reset --hard HEAD~1
    
Ipucu (Pratik İpucu)

git cherry-pick ile istediğiniz commit’i başka bir dala taşıyabilirsiniz.


2. Commit’i Yanlışlıkla Sildim

Senaryo: git reset --hard veya rebase sırasında commit kayboldu.

Çözüm:

  1. Commit’in hash’ini bulmak için:
    git reflog
    
  2. Kayıp commit’i yeni bir dala alın:
    git checkout -b kurtarma <commit-hash>
    
Ipucu (Debug İpucu)

git reflog neredeyse tüm hareketlerinizi kaydeder. Panik yapmayın, çoğu commit kurtarılabilir!


3. Merge/Rebase Sonrası Kayıp Commit

Senaryo: Birleştirme veya rebase sonrası bazı commit’ler görünmüyor.

Çözüm:

  1. git reflog ile commit’in hash’ini bulun.
  2. Yeni bir branch açarak commit’i kurtarın:
    git branch kayip-commit <commit-hash>
    
  3. Gerekirse merge veya cherry-pick ile ana dala ekleyin.

4. Yanlışlıkla Dosya Sildim

Senaryo: Bir dosyayı sildiniz ve commit etmeden geri almak istiyorsunuz.

Çözüm:

  • Son commit’teki haline döndürmek için:
    git checkout HEAD -- dosya.txt
    
  • Daha eski bir commit’ten almak için:
    git checkout <commit-hash> -- dosya.txt
    

5. Merge Çatışması Çözülemiyor

Senaryo: Çatışma işaretlerini (<<<<<<<, =======, >>>>>>>) yanlışlıkla silip dosyayı bozmak.

Çözüm:

  • Dosyayı tekrar eski haline döndürüp çatışmayı baştan çözmek için:
    git checkout --ours dosya.txt   # Kendi değişikliğinizi alır
    git checkout --theirs dosya.txt # Karşı tarafın değişikliğini alır
    
  • Sonra tekrar merge işlemini başlatabilirsiniz.
Not (Motivasyon)

Hatalar Git’te çok yaygındır. Önemli olan, panik yapmadan adım adım çözüm aramaktır. git status, git log ve git reflog en iyi arkadaşlarınız olsun!


Sık Yapılan Hatalar ve Kurtarma Yolları (Özet Tablo)

| Hata | Kurtarma Yolu | | --------------------------------- | ------------------------------ | | Yanlış branch’te commit | git cherry-pick, git reset | | Commit’i sildim | git reflog, yeni branch | | Merge/rebase sonrası kayıp commit | git reflog, git branch | | Yanlışlıkla dosya sildim | git checkout | | Merge çatışması çözülemiyor | git checkout --ours/theirs |


11. Gerçek Hayat Senaryoları ve Takımda Çalışma

  • Fork ve PR: Başka birinin projesini kopyalayıp (fork), değişiklik önerisi (pull request) göndermek.
  • Upstream Sync: Fork’ladığınız projeyi güncel tutmak için ana repodan değişiklikleri almak.
  • Kod İnceleme: PR’lar üzerinden kodun gözden geçirilmesi.
Ipucu (Pratik İpucu)

Takımda çalışırken her özelliği ayrı branch’te geliştirip, PR ile ana dala birleştirin.


12. Gelişmiş Konular

Squash

Senaryo: Bir feature branch’te 5 küçük commit yaptınız, ama ana dala tek commit olarak eklemek istiyorsunuz.

Detaylı Örnek:

  1. feature/login branch’inde şu commit’ler var:
    • feat: kullanıcı adı inputu eklendi
    • fix: input typo düzeltildi
    • feat: şifre inputu eklendi
    • fix: şifre inputu typo düzeltildi
    • style: inputlara margin eklendi
  2. Ana dala (main) merge etmeden önce, hepsini tek commit yapmak istiyorsunuz:
    git checkout feature/login
    git rebase -i HEAD~5
    
  3. Açılan ekranda ilk commit pick, diğerlerini squash yapın. Açıklamayı düzenleyin ve kaydedin.
  4. Sonuç: Tüm değişiklikler tek commit’te birleşir. Artık ana dala merge edebilirsiniz.
Ipucu (İpucu)

Squash, commit geçmişini sade ve okunabilir tutar.


Cherry-pick

Senaryo: Başka bir branch’teki tek bir commit’i kendi branch’inize almak istiyorsunuz.

Detaylı Örnek:

  1. hotfix/bugfix branch’inde acil bir hata düzeltildi:
    • fix: login bug düzeltildi (commit hash: a1b2c3d)
  2. Siz feature/profile branch’indesiniz ve bu düzeltmeyi almak istiyorsunuz:
    git checkout feature/profile
    git cherry-pick a1b2c3d
    
  3. Sonuç: Sadece o commit, kendi branch’inize eklenir. Kodunuz güncellenir.
Ipucu (İpucu)

Takımda acil bir düzeltmeyi farklı branch’e taşımak için çok kullanışlıdır.


Revert

Senaryo: Ana dalda yanlış bir commit yaptınız, ama geçmişi silmek istemiyorsunuz.

Detaylı Örnek:

  1. main branch’inde yanlış bir dosya silindi:
    • commit hash: d4e5f6g
  2. Bu commit’i geri almak için:
    git checkout main
    git revert d4e5f6g
    
  3. Sonuç: Silinen dosya geri gelir, yeni bir “geri alma” commit’i oluşur.
Ipucu (İpucu)

Revert, geçmişi bozmadan hatalı değişiklikleri geri alır.


Reset

Senaryo: Yanlışlıkla 3 gereksiz commit attınız, tamamen silmek istiyorsunuz.

Detaylı Örnek:

  1. Son commit’ler:
    • fix: typo
    • test: test kodu
    • debug: console.log eklendi
  2. Son 3 commit’i silmek için:
    git reset --hard HEAD~3
    
  3. Sonuç: Proje, 3 commit öncesine döner. Bu commit’ler ve değişiklikler tamamen silinir.
Uyarı (Uyarı)

Reset geri dönüşsüzdür, dikkatli kullanın! Ortak branch’te kullanmayın.


Reflog

Senaryo: Yanlışlıkla branch’i veya commit’i sildiniz, geri almak istiyorsunuz.

Detaylı Örnek:

  1. git reset --hard ile commit kayboldu.
  2. Kayıp commit’i bulmak için:
    git reflog
    # Çıktıda eski commit hash’ini bulun (ör: 9z8y7x6)
    git checkout -b kurtarma 9z8y7x6
    
  3. Sonuç: Kayıp commit yeni bir branch’te kurtarılır.
Ipucu (İpucu)

Reflog, neredeyse tüm hareketlerinizi kaydeder. Panik yapmayın!


Stash

Senaryo: Çalışırken ani bir branch değişikliği yapmanız gerekti, ama değişiklikleri commit’lemek istemiyorsunuz.

Detaylı Örnek:

  1. feature/search branch’indesiniz, kodda değişiklikler var ama commit atmadınız.
  2. Ana dala geçmeniz gerekiyor:
    git stash
    git checkout main
    # İşiniz bitince tekrar branch’e dönün
    git checkout feature/search
    git stash pop
    
  3. Sonuç: Değişiklikleriniz kaybolmadan geri gelir.
Ipucu (İpucu)

Stash, yarım kalan işleri kaybetmeden branch değiştirmek için idealdir.


.gitignore ve .gitattributes

Senaryo: Projenizde derleme çıktıları veya gizli anahtarlar gibi takip edilmemesi gereken dosyalar var.

Detaylı Örnek:

  1. Projede node_modules/, .env, dist/ gibi klasörler var.
  2. .gitignore dosyasına şunları ekleyin:
    node_modules/
    .env
    dist/
    
  3. Sonuç: Bu dosyalar Git tarafından takip edilmez.
  4. .gitattributes ile örneğin satır sonu ayarı:
    * text=auto
    
Ipucu (İpucu)

.gitignore, gereksiz dosyaların repoya girmesini engeller.


Hooks

Senaryo: Commit atmadan önce otomatik test çalıştırmak istiyorsunuz.

Detaylı Örnek:

  1. .git/hooks/pre-commit dosyasını açın veya oluşturun.
  2. Şu script’i ekleyin:
    #!/bin/sh
    npm test
    
  3. Dosyayı çalıştırılabilir yapın:
    chmod +x .git/hooks/pre-commit
    
  4. Sonuç: Her commit öncesi otomatik test çalışır, test geçmezse commit engellenir.
Ipucu (İpucu)

Hooks ile repoda kaliteyi otomatik koruyabilirsiniz.


Submodules

Senaryo: Projenizde başka bir Git reposunu (ör: ortak bir kütüphane) alt modül olarak kullanmak istiyorsunuz.

Detaylı Örnek:

  1. Ortak kütüphane eklemek için:
    git submodule add https://github.com/ornek/ortak-kutuphane.git libs/ortak-kutuphane
    
  2. Submodule güncellemek için:
    git submodule update --remote
    
  3. Sonuç: Alt modül projenize eklenir ve güncel tutulur.
Ipucu (İpucu)

Submodule, ortak kodu birden fazla projede kullanmak için idealdir.


Shallow Clone & LFS

Senaryo 1: Çok büyük bir repo var, sadece son halini hızlıca indirmek istiyorsunuz.

Detaylı Örnek:

  1. Sadece son commit’i indirmek için:
    git clone --depth=1 https://github.com/ornek/buyuk-repo.git
    
  2. Sonuç: Tüm geçmiş yerine sadece son hal indirilir.

Senaryo 2: Projede büyük dosyalar (ör: video, dataset) var ve Git yavaşlıyor.

Detaylı Örnek:

  1. Git LFS’i kurun:
    git lfs install
    git lfs track "*.mp4"
    git add .gitattributes
    git add video.mp4
    git commit -m "LFS ile video eklendi"
    
  2. Sonuç: Büyük dosyalar LFS ile yönetilir, repo hızlı kalır.
Ipucu (İpucu)

LFS, büyük dosyalarla çalışan projelerde performansı artırır.


13. SSS ve Kaynaklar

SSS – Sıkça Sorulan Sorular

Not (Git ile ilgili ileri sorular)

S: Commit geçmişini temiz tutmak için ne yapmalıyım? C: Özellikle takımda çalışırken, feature branch’lerde rebase ve squash kullanmak geçmişi sade tutar.

S: Merge mi, rebase mi? C: Takımda ortak geçmişi korumak için merge, kendi branch’inizde temiz bir geçmiş için rebase kullanılır.

S: Commit’i tamamen silmek mümkün mü? C: git rebase -i ile geçmişi düzenleyebilir, git reset --hard ile tamamen silebilirsiniz. Dikkatli olun!

S: Büyük dosyaları nasıl yönetirim? C: Git LFS kullanarak büyük dosyaları takip edebilirsiniz.

S: Submodule güncellemesi nasıl yapılır? C: git submodule update --remote komutunu kullanın.


Kaynaklar ve İleri Okuma

  • Pro Git Kitabı (Türkçe)
  • Atlassian Git Tutorials
  • Oh Shit, Git!?!
  • GitHub Learning Lab
  • Git Branching
Not

Artık sadece temel değil, profesyonel seviyede de Git kullanmaya hazırsınız!

Geri Dön