Git Temelleri: Sürüm Kontrolüne Giriş ve Pratik Kullanım
25 Haziran 2025
25 Haziran 2025
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!
Git, bir Word belgesinin "Farklı Kaydet" ile her adımda yedeğini almak gibidir. Ama çok daha akıllı ve otomatik!
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.
git --version
yazarak kontrol edin.git config --global user.name "Adınız Soyadınız"
git config --global user.email "mail@adresiniz.com"
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.
main
veya master
dır.Staging area, alışveriş sepetiniz gibidir. Sepete ekledikleriniz commit’lenir, eklemedikleriniz rafta kalır.
git init
Bulunduğunuz klasörü bir Git projesine çevirir.
git status
Çalışma alanınızdaki değişiklikleri ve takip edilen dosyaları gösterir.
git add dosya.txt
Belirli bir dosyayı ekler. Tüm dosyalar için:
git add .
git commit -m "Açıklama yazın"
Yaptığınız değişiklikleri kalıcı olarak kaydeder.
git log
Tüm commit geçmişini listeler.
Aynı anda birden fazla özelliği veya düzeltmeyi birbirine karışmadan geliştirmek için.
git remote add origin <repo-adresi>
git push -u origin main
git pull
git clone <repo-adresi>
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.Senaryo: Bir projede iki kişi aynı dosyanın aynı satırında değişiklik yapıyor.
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!
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.İ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.
git merge feature-branch
İki dalı birleştirir. Commit geçmişi korunur.
git rebase main
Dalınızı ana dalın sonuna taşır, daha temiz bir geçmiş sağlar.
<<<<<<<
, =======
, >>>>>>>
işaretleri çıkar.git add <dosya>
git commit
Çatışmayı çözmeden git add .
ve git commit
yapmak, hatalı kodun ana dala gitmesine neden olabilir.
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:
git log --oneline
git checkout main
git cherry-pick <commit-hash>
git checkout feature
git reset --hard HEAD~1
git cherry-pick
ile istediğiniz commit’i başka bir dala taşıyabilirsiniz.
Senaryo:
git reset --hard
veya rebase sırasında commit kayboldu.
Çözüm:
git reflog
git checkout -b kurtarma <commit-hash>
git reflog
neredeyse tüm hareketlerinizi kaydeder. Panik yapmayın, çoğu commit kurtarılabilir!
Senaryo: Birleştirme veya rebase sonrası bazı commit’ler görünmüyor.
Çözüm:
git reflog
ile commit’in hash’ini bulun.git branch kayip-commit <commit-hash>
Senaryo: Bir dosyayı sildiniz ve commit etmeden geri almak istiyorsunuz.
Çözüm:
git checkout HEAD -- dosya.txt
git checkout <commit-hash> -- dosya.txt
Senaryo:
Çatışma işaretlerini (<<<<<<<
, =======
, >>>>>>>
) yanlışlıkla silip dosyayı bozmak.
Çözüm:
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
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!
| 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
|
Takımda çalışırken her özelliği ayrı branch’te geliştirip, PR ile ana dala birleştirin.
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
git checkout feature/login
git rebase -i HEAD~5
pick
, diğerlerini squash
yapın. Açıklamayı düzenleyin ve kaydedin.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
)feature/profile
branch’indesiniz ve bu düzeltmeyi almak istiyorsunuz:
git checkout feature/profile
git cherry-pick a1b2c3d
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
git checkout main
git revert d4e5f6g
Senaryo: Yanlışlıkla 3 gereksiz commit attınız, tamamen silmek istiyorsunuz.
Detaylı Örnek:
fix: typo
test: test kodu
debug: console.log eklendi
git reset --hard HEAD~3
Senaryo: Yanlışlıkla branch’i veya commit’i sildiniz, geri almak istiyorsunuz.
Detaylı Örnek:
git reset --hard
ile commit kayboldu.git reflog
# Çıktıda eski commit hash’ini bulun (ör: 9z8y7x6)
git checkout -b kurtarma 9z8y7x6
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.git stash
git checkout main
# İşiniz bitince tekrar branch’e dönün
git checkout feature/search
git stash pop
Senaryo: Projenizde derleme çıktıları veya gizli anahtarlar gibi takip edilmemesi gereken dosyalar var.
Detaylı Örnek:
node_modules/
, .env
, dist/
gibi klasörler var..gitignore
dosyasına şunları ekleyin:
node_modules/
.env
dist/
.gitattributes
ile örneğin satır sonu ayarı:
* text=auto
Senaryo: Commit atmadan önce otomatik test çalıştırmak istiyorsunuz.
Detaylı Örnek:
.git/hooks/pre-commit
dosyasını açın veya oluşturun.#!/bin/sh
npm test
chmod +x .git/hooks/pre-commit
Senaryo: Projenizde başka bir Git reposunu (ör: ortak bir kütüphane) alt modül olarak kullanmak istiyorsunuz.
Detaylı Örnek:
git submodule add https://github.com/ornek/ortak-kutuphane.git libs/ortak-kutuphane
git submodule update --remote
Senaryo 1: Çok büyük bir repo var, sadece son halini hızlıca indirmek istiyorsunuz.
Detaylı Örnek:
git clone --depth=1 https://github.com/ornek/buyuk-repo.git
Senaryo 2: Projede büyük dosyalar (ör: video, dataset) var ve Git yavaşlıyor.
Detaylı Örnek:
git lfs install
git lfs track "*.mp4"
git add .gitattributes
git add video.mp4
git commit -m "LFS ile video eklendi"
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.
Artık sadece temel değil, profesyonel seviyede de Git kullanmaya hazırsınız!