07 / 07
Git
Commit, branch ve uzak depo ile sürüm kontrolü.
Git Nedir
Version control (sürüm kontrolü), dosyalardaki değişiklikleri zaman içinde kaydeden bir sistemdir. Bir dosyayı ya da tüm projeyi eski bir hâline döndürebilir, neyin ne zaman ve kim tarafından değiştirildiğini görebilirsiniz.1
Git, en yaygın sürüm kontrol sistemidir ve dağıtıktır: her geliştiricinin bilgisayarında projenin ve tüm geçmişinin tam bir kopyası bulunur. Bu yüzden commit atmak için internete bağlı olmanız gerekmez.21
GitHub ise Git değildir. Git depolarını (repository, kısaca repo) barındıran ve üstüne pull request, code review gibi ekip araçları ekleyen bir servistir. GitLab ve Bitbucket aynı işi yapar.2
Kurulum ve İlk Ayar
macOS ve Linux'ta Git çoğu zaman kuruludur; terminalde git --version ile kontrol edin. Kurduktan sonra ilk iş adınızı ve e-postanızı tanımlayın. Her commit bu bilgiyi taşır ve sonradan değiştirilemez:3
git config --global user.name "Ada Yılmaz"
git config --global user.email ada@ornek.com
git config --global init.defaultBranch mainSon satır, yeni açtığınız projelerde ana branch'in adını main yapar. GitHub ve diğer servisler main kullanır; Git de 3.0 sürümünde varsayılanı master'dan main'e çekecek.34
Temel Akış
Git'te bir dosya üç durumdan birindedir:5
| Durum | Anlamı |
|---|---|
| Modified | Dosyayı değiştirdiniz ama henüz kaydetmediniz |
| Staged | Değişikliği bir sonraki commit'e girmek üzere işaretlediniz |
| Committed | Değişiklik Git'in veritabanına güvenle kaydedildi |
Yani akış hep aynıdır: dosyayı değiştirirsiniz, commit'e girecek değişiklikleri git add ile staging area'ya eklersiniz, sonra git commit ile o anın fotoğrafını çekersiniz.52
| Komut | Ne yapar |
|---|---|
git init | Bulunduğunuz klasörde yeni bir repo başlatır |
git clone <url> | Uzaktaki bir repoyu tüm geçmişiyle bilgisayarınıza indirir |
git status | Hangi dosyaların değiştiğini ve hangilerinin staged olduğunu gösterir |
git diff | Henüz staged olmayan değişiklikleri satır satır gösterir |
git add index.html | Dosyayı staging area'ya ekler (git add . hepsini) |
git commit -m "Mesaj" | Staged değişiklikleri geçmişe kaydeder |
git log --oneline | Commit geçmişini kısa listeler |
İpucu
Ne yapacağınızdan emin değilseniz önce git status çalıştırın. Çıktısı çoğu zaman bir sonraki komutu da önerir.
.gitignore
Repoya girmemesi gereken dosyaları kökteki .gitignore dosyasına yazarsınız. Frontend projelerinde bunlar genelde node_modules, build çıktıları (dist, .next) ve .env gibi gizli bilgi taşıyan dosyalardır.6
node_modules
dist
.envUyarı
Zaten commit edilmiş bir dosyayı .gitignore'a yazmak onu repodan çıkarmaz. Önce git rm --cached .env ile takipten çıkarın. Şifre ya da API anahtarı bir kez push edildiyse, anahtarı da değiştirin.6
Branch
Branch, ana koddan ayrılıp kendi değişikliklerinizi yaptığınız bağımsız bir çalışma hattıdır. main bozulmadan yeni bir özelliği deneyebilirsiniz.
git switch -c sepet-butonu # yeni branch aç ve ona geç
git switch main # main'e geri dön
git branch # yereldeki branch'leri listelegit switch -c, branch'i oluşturup ona geçer.7 Eski kaynaklarda aynı iş için git checkout -b görürsünüz; ikisi de çalışır.8
İşiniz bitince branch'i main'e merge edersiniz:
git switch main
git merge sepet-butonumain siz ayrıldığınızdan beri değişmediyse Git yalnızca işaretçiyi ileri alır (fast-forward). İki taraf da ilerlediyse iki ucu ve ortak atalarını birleştiren yeni bir merge commit oluşturur.8
Uzak Depo
Bilgisayarınızdaki repo local, GitHub'daki remote'tur. Varsayılan remote'un adı origin'dir.2
| Komut | Ne yapar |
|---|---|
git pull | Remote'taki yeni commit'leri indirip bulunduğunuz branch'e ekler |
git push | Yerel commit'lerinizi remote'a gönderir |
git push -u origin sepet-butonu | Yeni bir branch'i ilk kez gönderir ve remote'taki karşılığına bağlar |
Commit yerel bir işlemdir; git push yapana kadar ekip arkadaşlarınız değişikliğinizi görmez.2
İş Hayatında Git
Ekipte günlük akış
Çoğu ekip GitHub flow'a benzer bir akışla çalışır:910
main'i güncelleyin:git switch mainvegit pull.İş için yeni bir branch açın.
Küçük commit'ler atın ve branch'i push edin.
Bir pull request açın; ekip arkadaşlarınız kodu inceler (bkz. Kod ve Ekip).
Yorumları yeni commit'lerle düzeltin. Push ettikçe PR kendiliğinden güncellenir.
Onay gelince PR'ı merge edin ve branch'i silin.
Bu düzende main'e doğrudan commit atılmaz; her şey PR ile girer. Böylece main her zaman çalışan kodu taşır.10
Branch'e isim vermek
İyi bir branch adı, ekibin listeye bakıp kimin ne üzerinde çalıştığını anlamasını sağlar: kısa ama açıklayıcı.9 Jira kullanan ekiplerde ad genelde ticket numarasıyla başlar, çünkü Jira branch adındaki numarayı görüp branch'i, commit'leri ve PR'ı ticket'ın altında gösterir:11
git switch -c feature/PROJ-123-sepete-ekle-butonu
git switch -c bugfix/PROJ-456-fiyat-yuvarlamaYaygın kalıp tür/TICKET-NUMARASI-kisa-aciklama'dır. Tür ön ekleri genelde feature/, bugfix/, hotfix/ ve release/ olur.12 Küçük harf ve tire kullanın; Türkçe karakter ve boşluktan kaçının. Ekibinizin belirlediği bir kural varsa o geçerlidir.
Bir iş, bir branch
Birbiriyle ilgisi olmayan işler aynı branch'e girmemeli. GitHub'ın önerisi de bu: her ilgisiz değişiklik grubu için ayrı branch.9
İnceleme kolaylaşır. Tek bir işi anlatan PR daha hızlı ve dikkatli okunur.
Biri diğerini bekletmez. İki iş aynı branch'teyse, birinde çıkan sorun diğerinin de yayına çıkmasını engeller.9
Conflict azalır. Küçük ve kısa ömürlü branch'ler daha az değişiklik taşır,
main'e geri dönmeleri kolaydır.13
İşi yaparken başka bir hata fark ederseniz onu aynı branch'te düzeltmek yerine yeni bir ticket ve branch açın. Tek istisna, işinizi doğrudan engelleyen küçük düzeltmelerdir; onları da PR açıklamasında belirtin.
Commit mesajı
Commit mesajı, birkaç ay sonra "bu satır neden böyle?" diye soran kişiye yazılır. Chris Beams'in yaygın kabul gören kuralları kısaca şunlar:14
Başlık 50 karakteri geçmesin ve nokta ile bitmesin.
Başlığı emir kipiyle yazın: "Sepete ekle butonunu düzelt", "Düzeltildi" değil.
Gerekirse bir boş satırdan sonra neyi ve neden değiştirdiğinizi açıklayın.
Jira kullanan ekiplerde ticket numarası commit mesajına da eklenir: PROJ-123 Sepete ekle butonunu düzelt.11
Conflict çıkınca
Merge conflict, iki branch aynı dosyanın aynı satırlarını farklı şekilde değiştirdiğinde ya da biri bir dosyayı silip diğeri değiştirdiğinde çıkar. Git hangisinin doğru olduğuna karar veremez ve merge'i durdurur.15 Ekipte en sık şöyle görürsünüz: siz kendi branch'inizde çalışırken bir arkadaşınızın PR'ı main'e girer ve sizin PR'ınız "conflict" uyarısı verir.
Çözmek için güncel main'i kendi branch'inize alın:
git switch main
git pull
git switch feature/PROJ-123-sepete-ekle-butonu
git merge mainConflict varsa Git hangi dosyalarda olduğunu söyler; git status bunları Unmerged paths altında listeler.8 Dosyayı açtığınızda iki versiyonu işaretlerle yan yana görürsünüz:815
<<<<<<< HEAD
<button class="btn-primary">Sepete ekle</button>
=======
<button class="btn btn-lg">Sepete Ekle</button>
>>>>>>> mainHEAD ile ======= arası sizin branch'inizdeki, ======= ile >>>>>>> arası gelen branch'teki hâlidir. Sonra:16
Hangisinin kalacağına karar verin. Çoğu zaman doğru cevap ikisini birleştirmektir.
Üç işaret satırını silin.
Projeyi çalıştırıp test edin.
git add <dosya>ile çözüldü olarak işaretleyin.git commitile merge'i tamamlayın vegit pushedin.
VS Code gibi editörler conflict'li dosyada "Accept Current", "Accept Incoming" ve "Accept Both" butonları gösterir; aynı işi tıklayarak yaparsınız.
Yapma
Conflict'i "benimki kalsın" diyerek karşı tarafın değişikliğini okumadan silmeyin.
İşaret satırlarını (
<<<<<<<,=======,>>>>>>>) dosyada bırakıp commit etmeyin.
Bazı ekipler git merge main yerine git rebase main kullanır. Sonuç benzerdir ama geçmişi yeniden yazar; ekibinizin hangisini tercih ettiğini sorun.
Detaylı Öğrenmek İçin
Pratik: Learn Git Branching; branch, merge ve rebase'i tarayıcıda görsel olarak deneyerek öğretir.17
Kitap: Pro Git, Git'in resmi ve ücretsiz kitabı. İlk üç bölüm günlük kullanım için yeterli.1
Git'in içi: Mary Rose Cook'un Git'in commit'leri ve branch'leri nasıl bir graf olarak sakladığını anlattığı yazısı ve konuşması.18
Konuşma: Pro Git'in yazarı Scott Chacon'ın az bilinen Git özelliklerini anlattığı FOSDEM 2024 konuşması (50 dk). Temelleri oturttuktan sonra izleyin.19
Kaynaklar
Sürüm kontrolünün tanımı, yerel, merkezi ve dağıtık sistemler; her kopyanın tam yedek olması.
Git ile GitHub farkı, dağıtık sürüm kontrolü; `clone`, `pull`, `add`, `commit`, `push` akışı.
`user.name`, `user.email` ve `init.defaultBranch` ayarları.
Git 3.0'da yeni repolarda varsayılan branch adının `main` olacağı; sürümün henüz tarihi yok.
Modified, staged ve committed durumları; working tree, staging area ve Git klasörü.
`.gitignore`, takip edilen dosyanın `git rm --cached` ile çıkarılması ve hazır şablonlar.
`git switch` ve `-c` ile branch oluşturup geçmek.
Branch açmak, fast-forward ve merge commit, conflict işaretleri, `Unmerged paths` ve `git add` ile çözmek.
Branch, commit, PR, review, merge ve branch'i silme adımları; kısa açıklayıcı branch adları ve ilgisiz işler için ayrı branch.
Her özelliğin kendi branch'inde geliştirilmesi ve `main`'in bozuk kod taşımaması.
Jira anahtarını branch adına, commit mesajına ve PR başlığına yazarak Jira'ya bağlamak.
`feature/`, `bugfix/`, `hotfix/` ve `release/` ön ekleri.
Feature branch, entegrasyon sıklığı; küçük ve sık entegrasyonun conflict'leri azaltması.
İyi commit mesajının yedi kuralı ve emir kipi testi.
Conflict'in ne zaman çıktığı, işaretler, `git status`, `git merge --abort`.
Conflict'i terminalde adım adım çözmek: düzenle, `git add`, `git commit`.
Tarayıcıda çalışan, görsel ve interaktif Git alıştırmaları.
Git'in commit, branch ve HEAD'i bir graf olarak nasıl tuttuğu; da var.
50 dakika. Az bilinen Git ayarları ve komutları; deneyimli kullanıcılar için.
Son güncelleme tarihi: 17 Ekim 2026
