Git Temelleri: Sürüm Kontrolüne Giriş ve Pratik Kullanım
Geri Dön1. 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
veyamaster
dı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.
- Ana dalda bir dosya var:
mesaj.txt: Merhaba dünya!
feature-a
branch’inde bu satır değiştiriliyor:mesaj.txt: Merhaba Copilot!
feature-b
branch’inde ise aynı satır farklı değiştiriliyor:mesaj.txt: Merhaba insan!
- Önce
feature-a
ana dala birleştiriliyor (merge). Sonrafeature-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:
- Commit’in hash’ini öğrenin:
git log --oneline
- Ana dala geçin:
git checkout main
- Commit’i ana dala taşıyın:
git cherry-pick <commit-hash>
- 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:
- Commit’in hash’ini bulmak için:
git reflog
- 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:
git reflog
ile commit’in hash’ini bulun.- Yeni bir branch açarak commit’i kurtarın:
git branch kayip-commit <commit-hash>
- 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:
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
- Ana dala (main) merge etmeden önce, hepsini tek commit yapmak istiyorsunuz:
git checkout feature/login git rebase -i HEAD~5
- Açılan ekranda ilk commit
pick
, diğerlerinisquash
yapın. Açıklamayı düzenleyin ve kaydedin. - 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:
hotfix/bugfix
branch’inde acil bir hata düzeltildi:fix: login bug düzeltildi
(commit hash:a1b2c3d
)
- Siz
feature/profile
branch’indesiniz ve bu düzeltmeyi almak istiyorsunuz:git checkout feature/profile git cherry-pick a1b2c3d
- 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:
main
branch’inde yanlış bir dosya silindi:commit hash: d4e5f6g
- Bu commit’i geri almak için:
git checkout main git revert d4e5f6g
- 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:
- Son commit’ler:
fix: typo
test: test kodu
debug: console.log eklendi
- Son 3 commit’i silmek için:
git reset --hard HEAD~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:
git reset --hard
ile commit kayboldu.- Kayıp commit’i bulmak için:
git reflog # Çıktıda eski commit hash’ini bulun (ör: 9z8y7x6) git checkout -b kurtarma 9z8y7x6
- 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:
feature/search
branch’indesiniz, kodda değişiklikler var ama commit atmadınız.- 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
- 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:
- Projede
node_modules/
,.env
,dist/
gibi klasörler var. .gitignore
dosyasına şunları ekleyin:node_modules/ .env dist/
- Sonuç: Bu dosyalar Git tarafından takip edilmez.
.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:
.git/hooks/pre-commit
dosyasını açın veya oluşturun.- Şu script’i ekleyin:
#!/bin/sh npm test
- Dosyayı çalıştırılabilir yapın:
chmod +x .git/hooks/pre-commit
- 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:
- Ortak kütüphane eklemek için:
git submodule add https://github.com/ornek/ortak-kutuphane.git libs/ortak-kutuphane
- Submodule güncellemek için:
git submodule update --remote
- 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:
- Sadece son commit’i indirmek için:
git clone --depth=1 https://github.com/ornek/buyuk-repo.git
- 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:
- 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"
- 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
Not
Artık sadece temel değil, profesyonel seviyede de Git kullanmaya hazırsınız!