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
<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ışı
<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
<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
<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
<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
<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:
- Her yeni özellik veya düzeltme için main branch’ten bir feature branch oluşturulur
- Geliştirme bu branch üzerinde yapılır
- 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:
- main branch her zaman dağıtılabilir durumdadır
- Yeni bir özellik için main’den branch açılır
- Branch’te geliştirme yapılır ve commit’ler push edilir
- Pull Request açılır, kod incelemesi yapılır
- 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:
- Geliştiriciler çoğunlukla doğrudan main (trunk) üzerinde çalışır
- Değişiklikler küçük ve sık olarak yapılır
- Daha büyük değişiklikler için kısa ömürlü feature branch’ler kullanılır
- 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
<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
<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:
<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:
<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: Git deneyimini geliştirmek için kullanabileceğiniz bazı araçlar ve eklentiler:
Git Hook’ları, belirli Git olayları tetiklendiğinde otomatik olarak çalışan scriptlerdir. Örneğin:
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:
Git’i daha derinlemesine anlamak isteyenler için bazı ileri seviye konular:
Commit geçmişini yeniden düzenlemek, commit’leri birleştirmek veya silmek için kullanılır:
Belirli bir commit’i başka bir branch’e uygulama:
Hata içeren commit’i ikili arama ile bulma:
Git referans logları, repository’nizde HEAD’in ve branch’lerin hareket ettiği tüm noktaları gösterir:
Bu komut, silinen bir branch’i veya reset edilen bir commit’i kurtarmak için kullanılabilir.
Bir Git repository’si içinde başka bir repository’ye referans verme yaklaşımları:
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.
Çözüm:
<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
1. Grafiksel Kullanıcı Arayüzleri (GUI)
2. Komut Satırı Araçları
3. Git Hook’ları
Git ve GitHub/GitLab/Bitbucket
GitHub
GitLab
Bitbucket
Git ile İlgili İleri Seviye Konular
1. Interactive Rebase
<span class="token">git</span> rebase -i HEAD~3 <span class="token"># Son 3 commit'i interaktif olarak düzenle</span>
2. Cherry-Pick
<span class="token">git</span> cherry-pick COMMIT_ID
3. Git Bisect
<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
<span class="token">git</span> reflog
5. Git Submodules & Git Subtree
<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ç