Projede git init komutu ile versiyon kontrolünü başlattığımızda aslında varsayılan bir branch (genellikle main, bazı projelerde master) oluşur. Bu main branch (dal) üzerinde genelde geliştirme yapılmaz (özellikle ekip halinde çalışıyorsa). Çünkü bu dalda projemizin sorunsuz çalışan hali saklanır. Geliştiriciler yeni bir branch açarak bu en güncel daldan kendilerine -ileride main ile birleştirilmek üzere- kendi kopyalarını oluştururlar.
Bunu bilimkurgu filmlerindeki paralel evrenlere benzetebiliriz. Mevcut projenin birer kopyasını oluşturup o kopya üzerinde çalışabiliriz. Bu kopyada yaptığımız değişiklikler biz özellikle birleştirene kadar ana branch'ı etkilemez.
Neden Branch Kullanılır?
Aslında tek bir cevabı yok. Kodumuzu güvenli geliştirme, ekiple paralel çalışma, temiz bir tarihçe gibi başlıklar altında toplayabiliriz.
Git, SVN gibi VCS (version control system) sistemlerinin günümüzde belki de en büyük avantajı aynı projede birden fazla geliştiricinin çalışmasını kolaylaştırmasıdır. Git'teki branch yapısı bunu bir adım daha ileri taşıyor. Branch'lar, her geliştiricinin projenin son halini baz alarak kendi bilgisayarında birden fazla kopyasını oluşturabilmesini sağlıyor.
- Güvenli geliştirme: projemizin çalışan en güncel halinden bir branch oluşturarak yeni özellikler/alternatif yöntemler deneyebiliriz. İşimizin yarım kalması veya hata almamız sorun yaratmaz çünkü bu değişiklikler sadece o dala özgüdür.
git mergeile ana dalı birleştirmediğimiz zaman ana dal hiçbir şekilde etkilenmez. - Paralel çalışma: Aynı projede herkes ayrı bir işi yapıyor ama birbirini beklemesi gerekmiyor. Kendi branch'lerinde çalışıp işleri bitince main branch ile birleştiriyorlar. Git dünyasında bu işleme
git mergedenir. Farklı dallarla çalışmak sadece ekiplere özgü değildir. Eğer tek çalışıyorsak bile farklı dallarda farklı geliştirmeleri birbirini etkilemeden yapmamız mümkündür.Aynı anda birden fazla kişi farklı branch'ler üzerinde çalışabilir. Birbirlerini etkilemez.
- Temiz tarihçe: Her özellik kendi branch'inde geliştirilir. Bu, kod incelemesi (review) yapma olanağı getirir. Proje geçmişine
git logçektiğimizde her değişikliğin ne zaman, kim tarafından ve neden yapıldığını takip etmek kolaylaşır.
Branch yapısı olmasaydı ana proje kodunda çalışmak zorunda kalabilirdik. Bu da ana kodun bozulması, başkasını beklememize sebep olurdu. Ayrıca geçmiş anlamsız bir karmaşaya dönerdi.
Git Branch Nasıl Kullanılır?
Git'te branch kullanımı genellikle yeni bir özellik geliştirirken veya mevcut kodu bozmadan değişiklik yapmak istediğimizde devreye girer. En yaygın kullanım senaryosu, ana branch'ten ayrılarak yeni bir dalda çalışmaktır.
Diyelim ki çalışan bir projemiz var. Yeni bir özellik ekleyeceğiz ama yarım bırakırsak proje bozulacak. Böyle durumlarda branch açmak en ideal yoldur. Yeni kodu orada yazıyoruz işimiz bitince ana koda merge (birleştirme) işlemi yapıyoruz. Böylece geliştirme süreci daha kontrollü ilerler ve hataların ana koda yansıma riski azaltılır.
Basit Bir Kullanım Örneği
# yeni bir branch oluştur ve geçiş yap
git switch -c feature/login
# geliştirme yap
git add .
git commit -m "login özelliği eklendi"
# ana branch'e geri dön
git switch main
# yapılan değişiklikleri ana branch ile birleştir
git merge feature/login
Bu akışta, yeni geliştirmeyi doğrudan ana branch üzerinde yapmak yerine ayrı bir dalda çalışırız. Böylece ana kod her zaman stabil kalır. Commit oluşturma hakkında detaylı bilgi için git commit yazısına bakabilirsiniz.
Gerçek projelerde neredeyse tüm geliştirmeler bu mantıkla ilerler: her özellik için ayrı bir branch açılır ve iş tamamlandığında ana branch ile birleştirilir.
Temel Branch Komutları
- git branch ozellik-login: Yeni bir branch oluşturur
- git switch ozellik-login: Mevcut bir branch'e geçiş yapar.
- git switch -c ozellik-login: Yeni branch oluşturur ve geçiş yapar (kısayol)
- git branch -d ozellik-login: Merge edilmiş branch'i siler.
- git branch -D ozellik-login: Merge edilmemiş branch'i zorla siler.
- git branch -m yeni-isim: Mevcut branch'in adını değiştirir.
- git switch main: Ana branch'e geri döner.
- git switch -: Önceki branch'e hızlıca döner.
- git branch: Mevcut branch'leri listeler. * olan aktif branch'tir.
- git status / git status -sb: Bu kodlar status komutuna ait olsa da aktif branch bilgisini bize gösterir.
Branch İsimlendirme Alışkanlıkları
Aslında teknik bir kural yoktur ama geliştiriciler arasında kabul görmüş bazı kurallar vardır. Birkaç örneği aşağıda okuyabilirsiniz. / ile hiyerarşiyi - ile kelimeleri ayırıyoruz. Boşluk ve büyük harf kullanımı önerilmez. Solo projelerde bu kadar resmi olunması şart değil ama alışkanlık olması açısından iyidir.
| feature/login-sayfasi | yeni özellik |
| bugfix/sepet-hatasi | bug düzeltme |
| hotfix/odeme-crash | acil production düzeltmesi |
| release/v1.2.0 | sürüm hazırlığı |
Git Branch Nasıl Çalışır?
Git'te her commit'in bir ID'si vardır (SHA hash). Branch, bu commit'lerden birini işaret eden küçük bir referans dosyasıdır.
.git/refs/heads/main #içinde: abc123
.git/refs/heads/yeni-ozellik #içinde def456
Yani branch oluşturduğumuzda aslında git altyapısında bir dosya oluşturmuş oluruz. Bu yüzden hızlı ve maliyetsiz çalışır. Her branch için bir dosya vardır ve içinde sadece bir commit'in hash'i yer alır.
Branch aslında 40 karakterlik bir hash tutan küçük bir text dosyasıdır.
Git Switch vs Git Checkout Farkı Nedir?
Eğer amacımız branch değiştirmekse her iki komut da çalışır. Peki neden aynı görev için iki farklı komut var? Git 2.23'te (2019) git checkout komutunun sorumlulukları bölündü (branch için git switch, dosya için git restore) ve iki komut da destekleniyor.
git checkout feature/login # eski yöntem
git switch feature/login # yeni yöntem, aynı sonuç
git checkout hala çalışıyor ama önerilmiyor.
Sık Yapılan Hatalar
- Ana branch üzerinde çalışmaya devam etmek belki de en yaygın hatadır. Branch açmayı unutup doğrudan ana branch'te commit atmak. Küçük projelerde veya solo çalışırken kritik olmayabilir ama alışkanlık kazanmak iyidir.
- Branch'i silmeyi unutmak Merge yapıp görevini tamamlayan branch'leri silmezsek zamanla gereksiz dallar birikir.
- Çok uzun süre merge etmemek branch ne kadar uzun yaşarsa ana daldan o kadar uzaklaşır. Çakışma (conflict) riski de o kadar artar.
- Yanlış branch'e commit atmak switch yapmayı unuttuk ve farkında olmadan main'e veya başka bir dala commit attık.
git statusbu hatayı önlemeye yardımcı olur (her commit öncesi hangi daldayız görebiliriz). - Alakasız isimlerle branch açmak kötü bir alışkanlıktır. Sadece test, deneme gibi isimler fikir vermez. Unutabiliriz ve takım arkadaşlarımız için anlamsızdır.
- Merge etmeden branch silmeye çalışmak:
git branch -dkomutu merge edilmemiş branch'leri silmez. Benzeri durumlarda Git'e teşekkür edeceksiniz.