Modern yazılım geliştirme süreçlerinin vazgeçilmez bir parçası olan Git, günümüzde neredeyse tüm yazılım projelerinin temelini oluşturmaktadır. 2005 yılında Linux çekirdeğini geliştiren ekibin ihtiyaçlarına cevap vermek için Linus Torvalds tarafından oluşturulan Git, kısa sürede yazılım dünyasında devrim yaratarak en popüler versiyon kontrol sistemi haline gelmiştir. Bu blog yazısında, Git’in ne olduğunu, temel kavramlarını, yaygın kullanım senaryolarını ve iş akışı modellerini kapsamlı bir şekilde inceleyeceğiz.

Git Nedir?

Git, dağıtık bir versiyon kontrol sistemidir (DVCS – Distributed Version Control System). Versiyon kontrol sistemleri, dosyalarda veya projede yapılan değişiklikleri zaman içinde takip eden, farklı versiyonları yöneten ve birden fazla kişinin aynı proje üzerinde çalışmasını kolaylaştıran yazılımlardır.

Geleneksel (merkezi) versiyon kontrol sistemlerinden farklı olarak Git, her kullanıcının bilgisayarında projenin tam bir kopyasını (repository) bulundurur. Bu dağıtık yapı sayesinde:

  • Ağ bağlantısına gerek kalmadan çalışabilirsiniz
  • Merkezi sunucuda bir sorun olduğunda veri kaybı yaşamazsınız
  • Değişikliklerinizi yerel ortamda deneyip, hazır olduğunda paylaşabilirsiniz
  • Daha hızlı ve esnek bir geliştirme süreci elde edersiniz

Git’in Temel Kavramları

Git’i etkili kullanabilmek için, temel kavramlarını anlamak kritik öneme sahiptir:

1. Repository (Repo)

Repository (kısaca repo), Git’in proje dosyalarını ve bu dosyaların tüm geçmiş versiyonlarını içeren bir veri deposudur. İki türü vardır:

  • Yerel Repository: Kendi bilgisayarınızda bulunan repo
  • Uzak Repository: GitHub, GitLab, Bitbucket gibi platformlarda veya bir sunucuda barındırılan repo

2. Commit

Commit, projenizde yaptığınız değişikliklerin bir anlık görüntüsüdür. Her commit:

  • Benzersiz bir ID’ye (SHA-1 hash) sahiptir
  • Kim tarafından, ne zaman oluşturulduğu bilgisini içerir
  • Bir commit mesajı ile değişikliği açıklar
  • Önceki commit’e bir referans içerir (parent commit)

3. Branch (Dal)

Branch, Git’in en güçlü özelliklerinden biridir. Ana kod tabanından ayrı bir çalışma hattı oluşturarak, ana kodu etkilemeden yeni özellikler geliştirmenize olanak tanır.

  • master/main: Genellikle ana branch olarak kullanılır
  • feature branches: Yeni özellikler için oluşturulan branch’ler
  • hotfix branches: Acil hata düzeltmeleri için kullanılan branch’ler

4. Merge ve Rebase

Branch’lerde yapılan değişiklikleri ana koda entegre etmek için iki temel yaklaşım vardır:

  • Merge: İki branch’in değişikliklerini birleştirerek yeni bir commit oluşturur
  • Rebase: Bir branch’teki commit’leri alıp başka bir branch’in üzerine yeniden uygular

5. Clone, Pull ve Push

Uzak repository’lerle etkileşim için kullanılan temel komutlardır:

  • Clone: Uzak bir repository’nin tam bir kopyasını yerel bilgisayarınıza indirir
  • Pull: Uzak repository’deki değişiklikleri yerel repository’nize getirir
  • Push: Yerel değişikliklerinizi uzak repository’ye gönderir

6. Working Directory, Staging Area ve Repository

Git, üç “bölge” üzerinde çalışır:

  • Working Directory: Üzerinde çalıştığınız dosyaların bulunduğu alan
  • Staging Area (Index): Commit’e hazırlanan değişikliklerin geçici alanı
  • Repository: Commit edilmiş tüm değişikliklerin saklandığı yer

Git’in Temel Komutları

Git’in günlük kullanımda en sık karşılaşacağınız komutları şunlardır:

Başlangıç ve Yapılandırma

bash
<span class="token"># Yeni bir repository oluşturma</span>
<span class="token">git</span> init

<span class="token"># Uzak bir repository'yi klonlama</span>
<span class="token">git</span> clone https://github.com/kullanici/repo.git

<span class="token"># Git konfigürasyonunu ayarlama</span>
<span class="token">git</span> config --global user.name <span class="token">"Adınız Soyadınız"</span>
<span class="token">git</span> config --global user.email <span class="token">"eposta@adresiniz.com"</span>

Temel İş Akışı

bash
<span class="token"># Dosya değişikliklerini görüntüleme</span>
<span class="token">git</span> status

<span class="token"># Değişiklikleri staging area'ya ekleme</span>
<span class="token">git</span> <span class="token">add</span> dosya.txt    <span class="token"># Belirli bir dosyayı ekleme</span>
<span class="token">git</span> <span class="token">add</span> <span class="token">.</span>            <span class="token"># Tüm değişiklikleri ekleme</span>

<span class="token"># Değişiklikleri commit etme</span>
<span class="token">git</span> commit -m <span class="token">"Değişikliklerin açıklaması"</span>

<span class="token"># Commit geçmişini görüntüleme</span>
<span class="token">git</span> log
<span class="token">git</span> log --oneline    <span class="token"># Daha özet bir görünüm</span>

Branch İşlemleri

bash
<span class="token"># Branch'leri listeleme</span>
<span class="token">git</span> branch

<span class="token"># Yeni branch oluşturma</span>
<span class="token">git</span> branch yeni-ozellik

<span class="token"># Branch değiştirme</span>
<span class="token">git</span> checkout yeni-ozellik
<span class="token"># veya daha yeni versiyonlarda</span>
<span class="token">git</span> switch yeni-ozellik

<span class="token"># Branch oluşturma ve geçiş yapma (tek komut)</span>
<span class="token">git</span> checkout -b yeni-ozellik
<span class="token"># veya</span>
<span class="token">git</span> switch -c yeni-ozellik

<span class="token"># Branch'leri birleştirme</span>
<span class="token">git</span> checkout main
<span class="token">git</span> merge yeni-ozellik

<span class="token"># Branch silme</span>
<span class="token">git</span> branch -d yeni-ozellik

Uzak Repository İşlemleri

bash
<span class="token"># Uzak repository ekleme</span>
<span class="token">git</span> remote <span class="token">add</span> origin https://github.com/kullanici/repo.git

<span class="token"># Uzak repository'leri görüntüleme</span>
<span class="token">git</span> remote -v

<span class="token"># Değişiklikleri uzak repository'ye gönderme</span>
<span class="token">git</span> push origin main

<span class="token"># Uzak repository'den değişiklikleri alma</span>
<span class="token">git</span> pull origin main

<span class="token"># Uzak repository'den değişiklikleri indirme (merge etmeden)</span>
<span class="token">git</span> fetch origin

Değişiklikleri Yönetme

bash
<span class="token"># Dosya değişikliklerini inceleme</span>
<span class="token">git</span> <span class="token">diff</span>
<span class="token">git</span> <span class="token">diff</span> --staged    <span class="token"># Staging area'daki değişiklikler</span>

<span class="token"># Değişiklikleri geri alma</span>
<span class="token">git</span> restore dosya.txt             <span class="token"># Working directory'deki değişiklikleri geri alma</span>
<span class="token">git</span> restore --staged dosya.txt    <span class="token"># Staging area'dan çıkarma (git add'i geri alma)</span>

<span class="token"># Son commit'i değiştirme</span>
<span class="token">git</span> commit --amend -m <span class="token">"Yeni commit mesajı"</span>

<span class="token"># Belirli bir commit'e geri dönme</span>
<span class="token">git</span> reset --hard COMMIT_ID

Stash İşlemleri

bash
<span class="token"># Çalışma dizinindeki değişiklikleri geçici olarak kaydetme</span>
<span class="token">git</span> stash

<span class="token"># Kaydedilen değişiklikleri listeleme</span>
<span class="token">git</span> stash list

<span class="token"># Kaydedilen değişiklikleri geri getirme</span>
<span class="token">git</span> stash apply
<span class="token">git</span> stash pop    <span class="token"># Uygula ve stash listesinden kaldır</span>

<span class="token"># Stash'i silme</span>
<span class="token">git</span> stash drop

Git İş Akışı Modelleri

Git kullanırken benimseyebileceğiniz çeşitli iş akışı modelleri bulunmaktadır. En yaygın olanları şunlardır:

1. Basit İş Akışı (Feature Branch Workflow)

Küçük ekipler için uygun olan basit bir modeldir:

  1. Her yeni özellik veya düzeltme için main branch’ten bir feature branch oluşturulur
  2. Geliştirme bu branch üzerinde yapılır
  3. Geliştirme tamamlandığında main branch’e merge edilir

2. Gitflow Workflow

Daha büyük projeler ve ekipler için yapılandırılmış bir yaklaşımdır:

  • main/master: Sadece sürüm (release) kodlarını içerir
  • develop: Aktif geliştirme branch’i
  • feature/*

    özellikler için develop’tan açılan branch’ler

  • release/*

    ürüm hazırlıkları için branch’ler

  • hotfix/*:Üretim ortamındaki acil hatalar için açılan branch’ler

3. GitHub Flow

Sürekli dağıtım yapılan projeler için daha basit bir alternatiftir:

  1. main branch her zaman dağıtılabilir durumdadır
  2. Yeni bir özellik için main’den branch açılır
  3. Branch’te geliştirme yapılır ve commit’ler push edilir
  4. Pull Request açılır, kod incelemesi yapılır
  5. Onaylandıktan sonra main’e merge edilir ve otomatik olarak dağıtılır

4. Trunk-Based Development

Sürekli entegrasyon/sürekli dağıtım (CI/CD) için optimize edilmiş bir yaklaşımdır:

  1. Geliştiriciler çoğunlukla doğrudan main (trunk) üzerinde çalışır
  2. Değişiklikler küçük ve sık olarak yapılır
  3. Daha büyük değişiklikler için kısa ömürlü feature branch’ler kullanılır
  4. Feature toggles (özellik anahtarları) ile tamamlanmamış özellikler gizlenir

Git ile İlgili İyi Uygulamalar

Git’i daha etkili kullanmak için bazı iyi uygulamalar şunlardır:

1. Etkili Commit Mesajları Yazma

  • İlk satıra 50 karakter veya daha az bir özet yazın
  • Özetten sonra boş bir satır bırakın
  • Detayları açıklayan paragrafları 72 karakter genişliğinde tutun
  • Fiil kullanın (“Add feature” veya “Fix bug” gibi)
  • Ne, neden ve nasıl sorularına cevap verin

2. Küçük ve Anlamlı Commit’ler Yapma

  • Kodlarınızı mantıksal birimler halinde commit edin
  • Her commit bir tek amaca hizmet etmeli
  • Dev bir commit yerine birkaç küçük commit yapmayı tercih edin

3. .gitignore Dosyası Kullanma

  • Derleme çıktıları, log dosyaları, IDE ayarları gibi repository’ye dahil edilmemesi gereken dosyaları .gitignore dosyasında belirtin
  • Dil/framework’e özgü şablonlar için gitignore.io gibi araçları kullanın

4. Branch Stratejisi Belirleme

  • Tutarlı bir branch isimlendirme stratejisi belirleyin (örn: feature/login-page, bugfix/header-alignment)
  • Takım için net bir branch iş akışı (workflow) tanımlayın
  • Geliştirme tamamlanınca eski branch’leri temizleyin

5. Rebase vs Merge Seçimi

  • Merge: Geçmişi korur, ancak daha karmaşık bir commit grafı oluşturur
  • Rebase: Daha temiz, doğrusal bir geçmiş sağlar ancak geçmişi yeniden yazar

6. Pull Request’leri Etkili Kullanma

  • İyi bir başlık ve açıklama ekleyin
  • Değişiklikleri önceden test edin
  • Kod incelemeleri için yeterli bağlam sağlayın
  • Geri bildirimlere açık olun ve yapıcı yorumlar yapın

Git ile İlgili Yaygın Sorunlar ve Çözümleri

Git kullanırken karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:

1. Merge Conflict (Birleştirme Çakışması)

Sorun: İki branch birleştirilirken aynı dosyanın aynı kısmı farklı şekillerde değiştirilmiş.

Çözüm:

  • Çakışan dosyaları açın
  • Çakışma işaretleyicileri arasındaki kodu düzenleyin
  • Değişiklikleri staging area’ya ekleyin
  • Merge işlemini tamamlamak için commit yapın
bash
<span class="token">git</span> merge feature-branch
<span class="token"># Çakışmaları çözün</span>
<span class="token">git</span> <span class="token">add</span> <span class="token">.</span>
<span class="token">git</span> commit -m <span class="token">"Resolve merge conflicts"</span>

2. Yanlış Branch’te Çalışmak

Sorun: Değişikliklerinizi yanlış branch’e commit ettiniz.

Çözüm:

  • Değişiklikleri stash’leyin veya geçici bir branch’e commit edin
  • Doğru branch’e geçin
  • Değişiklikleri uygulayın
bash
<span class="token"># Değişiklikleri kaydedin</span>
<span class="token">git</span> stash

<span class="token"># Doğru branch'e geçin</span>
<span class="token">git</span> checkout doğru-branch

<span class="token"># Değişiklikleri uygulayın</span>
<span class="token">git</span> stash pop

3. Büyük Dosyaları Yanlışlıkla Commit Etmek

Sorun: Büyük bir ikili dosyayı yanlışlıkla repository’ye eklediniz.

Çözüm:

  • Son commit’i değiştirmek için:
bash
<span class="token">git</span> <span class="token">rm</span> --cached büyük-dosya
<span class="token">git</span> commit --amend -m <span class="token">"Commit mesajı"</span>
  • Daha eski bir commit ise Git filter-branch veya BFG Repo-Cleaner gibi araçlar kullanılabilir

4. Yanlış Commit Mesajı

Sorun: Son commit mesajınızda bir hata var.

Çözüm:

bash
<span class="token">git</span> commit --amend -m <span class="token">"Doğru commit mesajı"</span>

5. Uzak Repository’den Değişiklik Reddi

Sorun: Çözüm:

bash
<span class="token"># Önce uzak değişiklikleri alın</span>
<span class="token">git</span> pull

<span class="token"># Çakışmaları çözün ve değişikliklerinizi tekrar gönderin</span>
<span class="token">git</span> push

Git için Kullanışlı Araçlar ve Eklentiler

Git deneyimini geliştirmek için kullanabileceğiniz bazı araçlar ve eklentiler:

1. Grafiksel Kullanıcı Arayüzleri (GUI)

  • GitKraken: Güçlü bir Git GUI, görsel commit grafiği, drag-and-drop özellikleri
  • Sourcetree: Atlassian’ın ücretsiz Git istemcisi
  • GitHub Desktop: GitHub ile entegre, basit arayüzlü Git uygulaması
  • VSCode Git Integration: VSCode içinde entegre Git arayüzü
  • GitLens: VSCode için gelişmiş Git yetenekleri eklentisi

2. Komut Satırı Araçları

  • oh-my-zsh git plugini: Git komutları için kısayollar ve otomatik tamamlama
  • diff-so-fancy: Daha okunaklı diff çıktıları
  • git-flow: GitFlow iş akışı için komut satırı araçları
  • hub: GitHub API’ları ile entegre Git wrapper’ı
  • tig: Git commit geçmişi için metin tabanlı arayüz

3. Git Hook’ları

Git Hook’ları, belirli Git olayları tetiklendiğinde otomatik olarak çalışan scriptlerdir. Örneğin:

  • pre-commit: Commit öncesi kod biçimlendirme, lint kontrolü
  • pre-push: Push öncesi testleri çalıştırma
  • post-receive: Deploy işlemleri tetikleme

Git ve GitHub/GitLab/Bitbucket

Git, bir versiyon kontrol sistemi iken, GitHub, GitLab ve Bitbucket gibi platformlar Git repository’lerini barındıran ve ek özellikler sunan web tabanlı hizmetlerdir:

GitHub

  • Microsoft’a ait en popüler Git repository hosting platformu
  • Açık kaynak projelerin merkezi
  • GitHub Actions ile CI/CD entegrasyonu
  • Issues, Projects, Pull Requests gibi proje yönetim özellikleri
  • GitHub Pages ile statik web sitesi hosting

GitLab

  • Hem bulut hem de kendi sunucunuzda (self-hosted) çalışabilir
  • Entegre CI/CD pipeline’ları
  • DevOps yaşam döngüsünü kapsayan geniş özellik seti
  • Kanban tarzı board’lar, Wiki, container registry

Bitbucket

  • Atlassian’a ait, Jira ve Confluence ile entegre çalışan platform
  • Özellikle kurumsal müşterilere yönelik
  • Sınırsız özel repository’ler
  • Jira entegrasyonu ile gelişmiş issue tracking

Git ile İlgili İleri Seviye Konular

Git’i daha derinlemesine anlamak isteyenler için bazı ileri seviye konular:

1. Interactive Rebase

Commit geçmişini yeniden düzenlemek, commit’leri birleştirmek veya silmek için kullanılır:

bash
<span class="token">git</span> rebase -i HEAD~3  <span class="token"># Son 3 commit'i interaktif olarak düzenle</span>

2. Cherry-Pick

Belirli bir commit’i başka bir branch’e uygulama:

bash
<span class="token">git</span> cherry-pick COMMIT_ID

3. Git Bisect

Hata içeren commit’i ikili arama ile bulma:

bash
<span class="token">git</span> bisect start
<span class="token">git</span> bisect bad  <span class="token"># Şu anki commit'in hatalı olduğunu belirtme</span>
<span class="token">git</span> bisect good COMMIT_ID  <span class="token"># Bilinen iyi bir commit'i belirtme</span>
<span class="token"># Git otomatik olarak commit'ler arasında gezinmeye başlar</span>
<span class="token"># Her commit için iyi/kötü bilgisi vererek hatalı commit'i bulabilirsiniz</span>
<span class="token">git</span> bisect reset  <span class="token"># İşlem sonunda normale dönmek için</span>

4. Git Reflog

Git referans logları, repository’nizde HEAD’in ve branch’lerin hareket ettiği tüm noktaları gösterir:

bash
<span class="token">git</span> reflog

Bu komut, silinen bir branch’i veya reset edilen bir commit’i kurtarmak için kullanılabilir.

5. Git Submodules & Git Subtree

Bir Git repository’si içinde başka bir repository’ye referans verme yaklaşımları:

bash
<span class="token"># Submodule ekleme</span>
<span class="token">git</span> submodule <span class="token">add</span> https://github.com/kullanici/repo.git

<span class="token"># Subtree ekleme</span>
<span class="token">git</span> subtree <span class="token">add</span> --prefix<span class="token">=</span>alt-dizin https://github.com/kullanici/repo.git main --squash

Sonuç

Git, modern yazılım geliştirmenin temel yapı taşlarından biridir ve etkili kullanımı, geliştirme süreçlerinin verimliliğini önemli ölçüde artırabilir. Bu blog yazısında, Git’in temel kavramlarından ileri seviye konularına, yaygın kullanım senaryolarından iş akışı modellerine kadar geniş bir yelpazede bilgiler sunduk.

Git’i öğrenmek başlangıçta karmaşık görünebilir, ancak temel kavramları ve iş akışını anladıktan sonra, Git’in yazılım geliştirme süreçlerinizi nasıl dönüştürdüğünü göreceksiniz. Her gün kullandığınız birkaç temel komutu öğrenerek başlayın ve zamanla bilgi dağarcığınızı genişletin.

Unutmayın ki Git, yalnızca bir araçtır. Asıl değeri, ekip işbirliğini güçlendirmesi, kod kalitesini artırması ve geliştirme süreçlerini daha organize hale getirmesinden gelir. İyi commit mesajları yazmak, anlamlı branch stratejileri belirlemek ve proje ihtiyaçlarına uygun bir iş akışı modeli benimsemek gibi iyi uygulamalar, Git’ten en iyi şekilde yararlanmanızı sağlayacaktır.