Git Notları #5 — Branch Kavramı

Herkese merhaba. Bu yazımızda da branch (dal) kavramından bahsedeceğim. Git’in son derece güzel bir özelliği olan branchler, hayatınızı kurtaracak.

Nedir Bu Branchler ve Ne İşe Yararlar ?

Branchler projelerimizi dallara ayırmamızı sağlarlar. Böyle söyleyince çok havada kalıyor tabii, o yüzden güzel bir örnek vererek açıklamaya çalışayım. Diyelim ki projemize yeni bir özellik (feature) eklemek istiyoruz ama bu özelliğin projemizi patlatma ihtimali var. Projemizin o anki haline bir şey olmadan geliştirmeye devam etmek ama bir yandan da diğer özelliği geliştirip denemek istiyorsunuz. Veya başka bir örnek verelim. Projeniz yayına (production) çıktı ve değişiklikler yapmalısınız. Production sürümünü hiç bozmadan geliştirmeleri yapıp daha sonra eğer çalışıyorsa bunları productiona eklemek istiyorsunuz. Bu noktada branchler imdadımıza yetişiyor. Veya başka bir senaryo daha yazalım. Projenize yeni bir versiyon çıkartıyorsunuz ama her versiyonda farklı bir repo (ilerleyen yazılarda bu kavrama değinilecek) açmak istemiyorsunuz. Bu tarz durumlarda da her bir versiyon için farklı branchler açabilirsiniz. Olası senaryolarımızdan aklıma gelenler bunlar ama tabii ki farklı amaçlarla kullanabilirsiniz bu özelliği.

Git init komutunu verdiğimiz zaman aslında bizim için master adında bir ana branch oluşturuluyor. Biz eğer ayarlarımızda hiçbir değişiklik yapmazsak bütün geliştirmemizi master dalı üzerinden gerçekleştiriyoruz. Şimdi master dalımızı production dalı olarak düşünelim. Yeni bir özellik eklemek için bir dal oluşturuyoruz ve projemiz resimde branch yazan kısımdaki gibi oluyor.

Kaynak: http://rogerdudler.github.io/git-guide/

Bu aşamadan sonra iki tane proje klasörümüz olduğunu düşünebilirsiniz. Birisi normal production versiyonumuz ve diğeri de özellik eklediğimiz versiyon. Özellik ekleyeceğimiz zaman özellik klasöründeki dosyaları düzenliyoruz, productionda bir işlem yapacağımız zaman production klasörümüzdeki dosyalarımızı düzenliyoruz. Yaptığımız işlemi buna benzetebilirsiniz.

“E zaten klasör oluşturup yapabiliyoruz, neden Git branchlerini kullanalım ki ?” diyebilirsiniz. Buna verilebilecek birçok cevap var ama konuyu çok uzatmadan en sevdiğim cevabı vermek istiyorum. Git, dosya kalabalığının ve dosya boyutunun katlanmasının önüne geçiyor (bazı dosya formatları hariç). Ayrıca bunun dışında da istediğiniz zaman bu iki farklı dalı rahatça birleştirmenizi sağlıyor.

Şimdi hemen örneğimiz için yeni bir klasör oluşturalım ve git init komutunu verelim.

Öncelikle PHP’de toplama işlemi yapan bir fonksiyon yazalım.

func.php

Fonksiyonumuz, kodu okuduğunuzda da rahatça anlayabileceğiniz üzere içerisine girilen argümanları alıp topluyor. Şimdi şöyle bir şey hayal edelim. Biz bir de aynı fonksiyonun çarpma işlemi yapanını yapacağız ama bu çarpma işlemi yaptığımız fonksiyonu yazdığımızda bizim toplama fonksiyonumuzun bozulma ihtimali var (Aslında şu anda pek öyle bir ihtimal yok ama hayal edelim yine de). Bu özellik ekleme işlemini önce güvenli bir ortamda yapmak istiyoruz. Eğer bir problem çıkmazsa productiona alacağız. Senaryomuz bu şekilde. Şimdi işin asıl kısmına geçelim.

Her şeyden önce çalışma dizinimizde git init diyelim. Şimdi yukarıda kodlarını verdiğim ve sizin de oluşturduğunuz func.php dosyasını Git’e ekleyip commit edelim.

git add func.php

git commit -m "Toplama fonksiyonu yazildi."

Her şey iyi güzel şu an. Şimdi projemizin o kritik kısmına geldik, çarpma fonksiyonumuzu yazmamız lazım ama toplama fonksiyonumuzu bozma ihtimali var. Biz de bu yüzden yeni bir dalda çalışmaya karar verdik. Öncelikle yeni dalımızı oluşturmamız lazım.

Yeni Branch Oluşturmak

Git’te yeni bir branch oluşturmanın (benim bildiğim) iki yolu var. Bu yollardan bir tanesi git branch komutunu kullanmak, diğeri ise git checkout komutuna -b parametresi vermek. Aralarında çok ufak bir fark var. Git branch komutu sadece yeni bir branch oluşturur. Git checkout komutuna -b parametresi verirseniz önce ismini yazdığınız branch yoksa onu oluşturulur ve o an bulunduğunuz branch değiştirilir. Yeni branchinize geçersiniz. Şimdi isterseniz checkout ile yeni bir branch oluşturalım.

git checkout -b carpma_ozelligi

Bu komutu verdikten sonra eğer şu çıktıyı görüyorsanız doğru yoldasınız demektir.

Switched to new branch 'carpma_ozelligi'

Şu anda yeni branchimizi oluşturduk ve bundan sonra yapacağımız değişiklikler bu branche kaydedilecek. Şimdi func.php dosyamızı açalım ve şu şekilde değiştirelim.

Branchleri Listelemek ve Branchler Arasında Gezinmek

Git’te branch değiştirmek için checkout komutunu kullanıyoruz. git checkout dedikten sonra branch adımızı yazmamız yeterli. Eğer branch adımızı hatırlamıyorsak git branch yazarak bütün branchleri listeleyebilirsiniz. Öncelikle aşağıdaki komutu kullanarak mevcut branchlerimizi listeleyelim.

git branch

Bize şu çıktıyı vermiş olması lazım.

Gördüğünüz gibi şu anda carpma_ozelligi branchindeyiz. Fark edebileceğiniz üzere bu branch hem yeşil/sarı görünüyor hem de sol tarafında bir yıldız var. O an üzerinde bulunduğumuz branchi bu şekilde anlıyoruz. Ben OhMyZSH’ın git eklentisini kullandığım için benim terminalimde sizinkilerden farklı olarak turuncu olan kısımda mevcut branch görünüyor. Buna çok takılmayın. Eğer merak eden varsa kurulumu hakkında bir videom var. Yazının sonuna bırakacağım linkini.

Şimdi dosyamızın bu yeni halini gite ekleyip commit edelim.

git add func.php

git commit -m "Carpma ozelligi eklendi."

İsterseniz şu an func.php dosyanızın içeriğine bakabilirsiniz. Eğer hala carpma_ozelligi branchindeyseniz dosyamızın içeriğinde carpma fonksiyonumuzun da bulunuyor olması lazım. Şimdi tekrar master dalımıza dönelim. Bunun için:

git checkout master

komutunu çalıştırıyoruz. Şimdi func.php dosyamızın içeriğine baktığınız zaman içerisinde sadece toplama fonksiyonumuz olduğunu görebilirsiniz.

Gördüğünüz üzere şu anda master adındaki temel branchimizden, carpma_ozelligi adında yeni bir branch oluşturduk. Bu şekilde istediğimiz herhangi bir branchten yeni branchler oluşturabiliriz. Örneğin şu anda carpma_ozelligi branchine geçip oradan da yeni bir branch oluşturalım. Öncelikle carpma_ozelligi branchine geçmek için şu komutu kullanalım.

git checkout carpma_ozelligi

Switched to branch ‘carpma_ozelligi’ ifadesini gördüysek eğer bu iş tamamdır. Şu anda carpma_ozelligi branchindeyiz demektir. Artık bu branchteki düzenlenmiş kod üzerinden başka bir branch daha oluşturabileceğiz. Bu sefer de branch komutunu kullanarak yeni bir branch oluşturalım. Yapmamız gereken tek şey git branch dedikten sonra branch adımızı yazmak.

git branch advanced_carpma

Aslında gelistirilmis_carpma ismini vermeyi düşünüyordum ama çok uzun olacağı için advanced demeyi tercih ettim. Bu komutu verdikten sonra herhangi bir çıktıyla karşılaşmayacaksınız ama komutumuzun branchi oluşturup oluşturmadığını anlamak için git branch ile bütün branchlerimizi listeletebiliriz.

git branch

Gördüğünüz gibi şu anda carpma_ozelligi branchindeyiz ve advanced_carpma adında bir branch oluşturulmuş. Başta da bahsettiğim gibi, checkout -b ile branch oluşturduğumuz zaman branch oluşturulduktan sonra o branche geçiş yapıyoruz. Ancak git branch ile branch oluşturduğumuz zaman sadece oluşturmuş oluyoruz. Oluşturduktan sonra tekrar checkout ile geçiş yapmamız gerekiyor. İstediğinizi kullanabilirsiniz, seçim tamamen size kalmış. Şimdi branchimizi değiştirelim.

git checkout advanced_carpma

Tekrar Switched to branch ifademizi gördüysek eğer doğru yoldayız demektir. Şimdi bu çarpma fonksiyonumuza şöyle bir özellik ekleyelim, içerisine yazılan bütün sıfırları es geçsin. Aslında son derece saçma bir özellik ama işte başka bir şey uyduramadım, kusura bakmayın 😁.

Bundan sonra çarpma işlemlerimizde parametrelere 0 versek bile çarpma işlemimize herhangi bir etkisi olmayacak.

Şimdi isterseniz bir git status çekip son duruma bakalım.

Gördüğünüz gibi en üstte advanced_carpma branchinde olduğumuzu söylüyor. En altta, commit edilecek bir değişikliğimizin olmadığını, dosyaları Git’e eklememiz gerektiğini söylüyor. Ve son olarak da gördüğünüz gibi func.php dosyamızın modified hale geldiğini söylüyor. Modified, staged vb. kelimeler kullanıldığında durumu daha iyi kavrayabilmek için aklımıza hemen şu diyagramı getirmeliyiz.

kaynak: https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository

Bu diyagramda da görebileceğiniz gibi dosyamız şu anda Git’e eklenmiş durumda değil. Dosyamızı hemen Git’e ekleyip bir commit alıyoruz.

git add func.php

git commit -m "Carpma islemi gelistirildi."

Artık, elimizde üç tane branch var. Bunlardan birisinde sadece toplama işlemi yapıyoruz. Diğerinde çarpma işlemi yapıyoruz ve sonuncusunda da daha gelişmiş bir çarpma işlemi yapıyoruz.

Bu yazıda dallar oluşturmayı, dallar arasında gezinmeyi ve dalları listelemeyi öğrendik. Bir sonraki yazıda branch silmeyi ve bu ayırdığımız branchleri nasıl tekrar birbiriyle birleştirebileceğimizi anlatacağım (muhtemelen 😁).

Son olarak, yukarıda bahsi geçen video:

Yazıyı oturup tek seferde yaz(a)madığım için bazı yerlerde ufak tefek kopukluklar olabilir. Bunun için kusura bakmayın. Yazının herhangi bir yerinde bir eksik veya yanlışlık sezerseniz lütfen bunu yorum olarak bildirin. Ve çok sevgili okurlar, lütfen bu yazı bittikten sonra yorumlara bir göz atın. Belki bir yanlışımız vardır ve birileri düzeltmiştir. En büyük korkum sizlere yanlış bilgi vermek. Siz de lütfen aldığınız bilginin doğru olduğundan emin olmak için elinizden geleni yapın.

Bu yazılık bu kadar, başka yazılarda görüşmek üzere… Herkese iyi çalışmalar dilerim.

--

--

--

Web Developer @ Megafonn Creative Digital Agency. Blogger, Youtuber. (More information: zahidefe.net)

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Mustafa Zahid Efe

Mustafa Zahid Efe

Web Developer @ Megafonn Creative Digital Agency. Blogger, Youtuber. (More information: zahidefe.net)

More from Medium

Git:- Git is a distributed version control system for tracking changes in source code during…

Go To Project Script

Shows a command line terminal with the start of a sudo command

How git worktrees enhance your efficiency while also save memory