Git'de Branch Nedir? Nasıl Oluşturulur?
Git'de Branch Nedir? Nasıl Oluşturulur?
Yeni bir web sitesi kurmak veya yeni bir video oyunu geliştirmek gibi büyük bir proje üzerinde çalışıyor olabilirsin. Bu uygulamalar kod üzerinde sürekli değişiklikler yapmanı gerektirebilir. Yaptığın tüm değişikliklerin kaydını tutabilir, böylece gerektiğinde kolayca bir önceki sürüme geri dönebilirsin. Branch, tam da bu noktada sana mucizeler yaratacak bir araç haline geliyor.
Branching, diğer adıyla dallanma veya dallara ayırma, paralel sürümlerde çalışmak üzere geliştirme aşamasındaki programların veya nesnelerin kopyalarını oluşturma, orjinalini muhafaza etme, her birinde farklı değişiklikler yapma uygulamasıdır. Bu uygulama daha fazla verimlilik için farklı ekiplerin bir programın ayrı unsurları üzerinde birlikte çalışmasını mümkün kılar. Yaygın branch ifadeleri arasında break, continue, return ve goto bulunur.
Branch Nedir?
Branch, sürüm kontrolünde ve yazılım yönetiminde, kodda izole değişiklikler yapılırken kararlılığı korumak için kullanılır. Hata düzeltmelerinin geliştirilmesini, yeni yeteneklerin eklenmesini ve yeni sürümlerin izole olarak test edildikten sonra entegrasyonunu kolaylaştırır. Geliştirilen her bir programın kopyası bir branch/dal olarak kabul edilir. Dalın alındığı esas program gövdesi ise taban çizgisi, ana hat veya master olarak adlandırılır. Geliştiricilerin birlikte çalıştığı sürümün kopyaları oluşturulur ve her ekip kendi kopyası üzerinde çalışabilir. Birden fazla dal aktif geliştirme sürecinde olduğunda bir sonraki sürüm olarak ayarlanan dal, geliştirme dalı olarak adlandırılır. Örneğin, web sitesinde için yeni bir özellik üzerinde çalışmak veya bir hatayı düzeltmek için branch yapabilirsin. Yapılan değişikliklerden memnunsan dalı ana kod tabanına geri birleştirebilirsin.
Branching, açık kaynak kodlu bir yazılım programından kaynak kodu alıp ondan tamamen yeni bir program geliştirmeyi içeren çatallanma (forking) ile ilgilidir. Ortaya çıkan yeni program sonrasında çatal (fork) olarak adlandırılır. Branching ve forking, ana kod satırından ayrılmanın iki yolunu sunar. Hem Mercurial hem de Git yerel düzeyde dallanma kavramına sahiptir. Bir depo kodu dalı, bir ağacın dalı gibi orijinal deponun bir parçası olarak kalır. Dallanan kod (ana gövde) ve dal birbirini bilir ve birbirine bağlıdır. Bir ağaç gövdesinin dalı gibi bir kod dalı da kaynaklandığı gövdeyi (orijinal kod tabanı) tanır. Çatal (fork), klon veya kopya demenin bir diğer yoludur. Çatal terimi programlama dilinde mevcut bir sürecin kopyasını oluşturan bir Unix sistem çağrısından türemiştir. Dolayısıyla bir dalın aksine, bir çatal orijinal depodan bağımsızdır. Orijinal depo silindiğinde çatal kalır. Bir depoyu çatallamak, o depoyu ve tüm dallarını almak anlamına gelir.
Branching vs Forking
Çalışma ortamına bağlı olarak branching ve forking kavramlarının kullanımı ve ne ölçüde kullanıldığı değişkenlik gösterebilir. Ekiplerin bu iki işlevle çalışabileceği ve bunları birleştirebileceği birçok yol vardır. Depodaki kullanıcı erişimlerini yönetmek yerine birleştirme üzerinde kontrol, bağımsız dalları destekleme, denemeleri ve değişiklikleri kolayca elemek istiyorsan Bitbucket’daki geliştirme organizasyonlarını (Git-flow) kullanarak branching uygulayabilirsin. Bitbucket dallarını aşağıda yer alan durumlarda kullanmak uygun olabilir:
- Birbirine güvenen ve yakın iletişim içinde olan küçük yazılımcı grupları.
- Geliştirme organizasyonunda bir depoya yazma erişimi verilmesi gereken durumlar.
- Hızlı yineleme döngüsüne sahip geliştiriciler.
Dosyaları güncelleyerek veya yeni dosyalar ekleyerek bir proje üzerinde çalışmak için cihaza veya yerel ağa uzak Bitbucket deposunun bir klonunun oluşturulması gerekir. Bu işlem Bitbucket deposundaki “clone” düğmesi ile yapılabilir. Eğer depoda forking yapıldıysa sadece çatal, branching yapıldıysa depoyu klonlayarak dal kontrol edilmiş olur. Sonuç olarak Bitbucket her ikisini de destekler.
Brunch İfadeleri
Branch deyimleri, iş akışının programın farklı bir bölümüne atlamasını sağlar. Diğer kontrol yapıları içinde kullanılan yaygın branch ifadeleri arasında break, continue, return ve goto yer alır. Goto, modüler yapısal programlamada nadiren kullanılır. Ayrıca brunch öğeleri listesinde programlama dillerinde yaygın olarak kullanılan önceden tanımlanmış bir işlev olarak exit ifadesi yer alır.
Break
Bir case yapısı gibi davranmasını sağlamak için switch ile birlikte veya döngüden çıkmak için bir işlemin parçası olmak üzere break ifadesi iki şekilde kullanılır. Aşağıdaki örnekte döngünün 8 kez çalıştırılacağı görünümü verilmiş ancak break deyimi beşinci dinleme sırasında durmaya yol açmıştır.
counter = 0;
While counter < 8
Output counter
If counter == 4
break
counter += 1
Continue
Aşağıda yer alan örnek, döngünün monitöre 8 kez yazdırılacağı görünümünü verir ancak continue deyimi 4 sayısının yazdırılmamasına neden olur.
For counter = 0, counter < 8, counter += 1
If counter == 4
continue
Output counter
Return
Bir fonksiyondan çıkan return deyimi, fonksiyonun çağrıldığı ifadeye geri döner.
Function DoSometing
statements
Return <optional return value>
Goto
Goto yapısı genellikle iyi yapılandırılmış programlamada kabul edilmez. Ancak bazı programala dilleri, iki nokta üst üste işaretini takip eden tanımlayıcı adı içeren bir etiket oluşturulmasına izin verir. Etiketin ardından goto komutu kullanılır.
some lines of code;
goto label; // jumps to the label
some lines of code;
some lines of code;
some lines of code;
label: some statement; // Declared label
some lines of code;
Exit
Teknik olarak önceden tanımlanmış bir fonksiyon olmasına rağmen exit, programlamadaki yaygın kullanımı nedeniyle branch ifadeleri arasında yer alır. Bir dosyanın açılması ve ardından dosyanın gerçekten açılıp açılmadığının test edilmesi buna iyi bir örnektir. Açılmayan dosya, programın yürütülmesini zamanından önce durdurmak istediğini gösteren bir hata verir. Exit fonksiyonu programın çalışmasını sonlandırarak bu süreçte işletim sistemine bir tamsayı değeri yollar.
Branch Nasıl Oluşturulur?
Branch, Git’in temel bir parçasıdır ve kod tabanındaki değişiklikleri yönetmek için kullanılır. Aynı zamanda değişiklikleri birbirinden izole etmeye olanak tanır. Böylece kod tabanını etkilemeden yeni özellikler deneyebilir veya hataları kolayca düzeltebilirsin. Peki, branch nasıl oluşturulur? Bu soruyu biraz detaylandırarak yanıtlamaya başlıyoruz.
Checkout Kullanarak Branch Oluşturmak
Bir Git dalı oluşturmanın en kolay yolu yeni bir branch için “-b” seçeceği ile “git checkout” komutunu kullanmaktır. Sonrasında ise oluşturmak istediğin dalın adını belirtmen yeterlidir.
$ git checkout -b <branch-name>
Örnek olarak ana branch üzerinden “feature” adından yeni bir Git dalı oluşturmak istendiğini varsayalım. Bunun için “git checkout” komutunu “-b” seçeceği ile çalıştıracak ve branch adı olarak “feature” eklenmelidir.
$ git checkout -b feature
Switched to new branch 'feature'
Yukarıdaki örnekte görüldüğü üzere “git checkout” komutunu kullanarak yeni bir branch oluşturulabilir. Bu yeni dala otomatik olarak geçiş yapmak mümkündür. Peki, yeni dala otomatik olarak geçmeden bir Git branch oluşturulması gerektiğinde neler yapılmalı?
Geçiş Yapmadan Git Branch Oluşturmak
Yeni bir Git dalı oluşturmak için, geçiş yapmadan, “git branch” komutu kullanılır ve oluşturulacak Git dalının adını belirtmek gerekir.
$ git branch <branch_name>
Sonrasında “git checkout” fonksiyonu kullanılarak yeni Git dalına geçiş yapılabilir.
$ git checkout <branch_name>
Örneğe geri dönecek olursak “feature” adında bir branch oluşturmak istediğini varsayalım.
$ git branch feature
Tüm dallar için “git branch” komutunu “-a” seçeceği ile çalıştırarak mevcut dalları incelemek gerekir.
$ git branch -a
Artık başarılı bir şekilde yeni bir Git branch oluşturmuş ve checkout komutunu kullanarak bu dala geçiş yapmış oldun.
Commit ile Branch Oluşturmak
Bazı durumlarda Git geçmişindeki belirli bir Commit üzerinden Git dalı oluşturmak gerekebilir. Bir Commit’ten Git dalı oluşturmak için “git checkout” komutunu “-b” seçeneği ile kullanmak ve dalın oluşturulacağı Commit’in yanı sıra branch adını da belirtmek önemlidir.
$ git checkout -b <branch_name> <commit_sha>
Alternatif olarak yeni branch için adı ve Commit SHA (Secure Hash Algorithm) ile “git branch” komutu kullanılabilir.
$ git branch <branch_name> <commit_sha>
Önceki örneğe geri dönecek olursak Git geçmişindeki belirli bir Commit’ten Git branch oluşturmak istediği varsayalım. Geçmişteki SHA Commit’lerini almak için “-oneline” seçeceği ile “git log” kullanman gerekir.
$ git log --oneline --graph
* 9127753 (HEAD -> master) Commit 3
* f2fcb99 Commit 2
* cab6e1b (origin/master) master : initial commit
İkinci Commit işleminden (f2fcb99) yeni bir Git branch oluşturmak için aşağıdaki komut çalıştırılır.
$ git checkout -b feature f2fcb99
Switched to a new branch named 'feature'
“git log” komutu kullanılarak dalın geçmişteki ikinci Commit’ten oluşturulduğunu doğrulayabilirsin.
$ git log --oneline --graph
* f2fcb99 (HEAD -> feature) Commit 2
* cab6e1b (origin/master) master : initial commit
Artık belirli bir Commit’ten başarıyla yeni Git branch oluşturmuş oldun.
Tag ile Branch Oluşturmak
Bir tag ile yeni Git branch oluşturmak için “git checkout” komutunu “-b” seçeceği ile kullanmak ve yeni branch için etiket adının yanı sıra branch adını da belirtmek gerekir.
$ git checkout -b <branch_name> <tag_name>
Alternatif olarak yeni bir tag’a geçmek istemiyorsan branch adı ve tag ile “git branch” kullanabilirsin.
$ git branch <branch_name> <tag_name>
Önceki örneğe geri dönecek olursak geçmişteki “v1.0” isimli bir tag’den yeni bir Git branch oluşturulacağını varsayalım. Bu durumda mevcut tag’leri listelemek için “git tag” komutu kullanılır. Alternatif olarak bir Commit ile ilişkili tag’i tanımlamak için “git log” komutu kullanılabilir.
$ git tag
v1.0
Artık tag belirlendiğine göre “git checkout” komutu ile yeni bir branch oluşturmak mümkündür.
git checkout -b feature v1.0
Ardından yeni dalın gerçekten tag ile oluşup oluşmadığından emin olmak için Git geçmişini inceleyebilirsin. Bu dalı oluşturmak için alternatif olarak “git branch” komutunu da kullanmak işe yarayabilir.
$ git branch feature v1.0
Branch yapmak, kodu yönetmenin ve diğer geliştiricilerle işbirliği yapmanın güçlü bir yoludur. Kod tabanının izole edilmiş kopyalarını oluşturmana olanak tanır, üstelik bu yolla ana kod tabanını etkilemeden denemeler ve değişiklikler yapabilirsin. Branch özellikle yeni özellikler üzerinde çalışmak, hataları düzeltmek ve değişiklikleri test etmek için akıllıca bir çözüm olan branch işlemleri hakkında kilit noktaları öğrenmek istiyorsan Techcareer.net’e katılmaya ne dersin? Kendi alanından uzmanlarla bir araya gelmek, branch ve çok daha fazlası hakkında deneyimli kişilerden fikir almak istiyorsan Discord kanalına katılıp sen de yazılım camiasındaki en güncel bilgilere hemen ulaşabilirsin.
Sıkça Sorulan Sorular
Hiring Challenge süresi ne kadar?
Hiring Challenge etkinlikleri, yarışmanın türüne göre birkaç saat veya gün boyunca sürebilir. Adaylar şirketler tarafından belirlenen, Android, iOS ve Algoritma gibi problemleri kendilerine tanınan süre boyunca çözmeye çalışır.
Hackathon yarışmalarına katılım şartı nedir?
Teknoloji alanında ilerlemek, yazılım alanında kendini kanıtlamak ve çeşitli projelerde görev almak istiyorsan Hackathon yarışmalarına başvurabilirsin.
Mevcut dalı temel aldığımda nasıl yeni bir branch oluşturabilirim?
Yeni dalı varolan bir dala eklemek istediğinde başlangıç noktası olarak hedef branch adını eklemen gerekir:
$ git branch <new-branch> <base-branch>
Uzak bir branch üzerinden nasıl yani bir branch oluşturabilirim?
Yeni yerel branch için uzak bir dalı temel almak üzere “—track” seçeceğini kullanman gerekir:
$ git branch --track <new-branch> origin/<base-branch>
Alternatif olarak bunu yapmak için “checkout” komutu da işine yarayabilir. Yerel dalı uzak dal gibi adlandırmak gerektiğinde ise yalnızca uzak dalın adını belirtmek gerekir:
$ git checkout --track origin/<base-branch>
Uzak bir depoya nasıl yeni branch oluşturabilirim?
Yeni yerel branch üzerinde bir süre çalıştıktan sonra bunu ekiple paylaşmak için uzak depoda yayınlamak gerekir:
$ git push -u origin <local-branch>
“-u” fonksiyonu Git’e bir “tracking connection” kurmasını söyleyerek gelecekteki hareketleri çok daha kolay hale getirmeyi sağlar.