git dersleri

Git Dersleri – Git Branch ve Checkout

Merhabalar, bir önceki git dersimizde, commit yapmayı öğrenmiştik. Bu dersimizde de yine en temel kavramlardan biri olan branch kavramını öğreneceğiz. git branch konusuna gelmeden önce, “branch” kelimesini Türkçe’ye “dal” olarak çevirdiğimizi ve derslerimizde bu kelimeyi yoğun olarak kullanacağımızı belirtelim.

Bu derste yapacağımız örnekler bir önceki dersin devamı niteliğinde. Ordaki half-life-2 projemize kaldığımız yerden devam edeceğiz. Örneklerimizde aynı ana gelmek için lütfen önceki derse gidiniz.

Zamanı Geri Almak

Dallanma yani branching kavramına geçmeden önce ilk derste size vadettiğimiz zamanı geri alma olayına bakalım. Hatırlarsanız geçen dersimizde iki commit yapmıştık. Hemen terminal uygulamamızı açıp bir git depomuz olan half-life-2 dizinine gidelim. Daha sonra git log komutunu çalıştıralım.

Siz de benim gibi aşağıdaki gibi bir çıktı alırsınız.

commit 4d8155f86a9d7cc351ef223db3a5af2670224bdc
Author: Omer Ozkan <[email protected]>
Date:   Sun Sep 17 22:33:02 2017 +0300

    Add 'Gordon meets armed Combine officers'

commit 815029b1b00556b277a3b9b87c3b19e24dc755bd
Author: Omer Ozkan <[email protected]>
Date:   Sun Sep 17 21:45:55 2017 +0300

    Add introduction to HL2 Story

Şu anda iki commit yapıldığını görüyoruz. Elbette yapılan commit’lerin id’leri ve yazar bilgisi sizin sisteminizde farklı olacaktır. Lütfen buna dikkat ediniz.

Bir de story.txt dosyamızın içeriğine bakalım.

Nearly twenty years after the Black Mesa Incident the G-Man wakes Gordon Freeman and inserts him (seemingly, without any goals) into a train arriving in City 17, a city under control of the Combine Empire located somewhere in Eastern Europe.

After leaving the train, Gordon and other passengers are welcomed by a broadcast by Dr. Wallace Breen, former administrator of Black Mesa, who is now Earth's administrator. Continuing on his way, Gordon meets armed Civil Protection officers policing the train station and its surroundings. One of them separates him from the rest of the arriving citizens and directs him into a small interrogation room before revealing himself to be former Black Mesa security guard Barney Calhoun, operating undercover for the Resistance.

 

git checkout

Şimdi zamanı geriye alalım. İlk commitimizi hatırlıyor musunuz? Bu commitimizde sadece ilk paragrafı eklemiştik. Şimdi o ana geri dönelim. Bunun için bize gitmek istediğimiz commit’in id’si gerekli. Benim sistemimde bu id 815029b1b00556b277a3b9b87c3b19e24dc755bd olarak tanımlı. İsterseniz bu id’nin tamamını ya da ilk 7 karakterini(815029b) de kullanabilirsiniz.

git checkout komutu git deposunda başka bir yere gitmemizi sağlar. Gitmek istediğimiz yer bir önceki commit olduğu için bu commit’in idsini vereceğiz.

git checkout 815029b1b00556b277a3b9b87c3b19e24dc755bd

Şimdi siz de ilk commit’in idsini alıp yukardaki komutu çalıştırın ve ardından git log ile kontrol edin.

Buradaki asıl önemli nokta story.txt dosyasının içeriğinin ne olduğu. Dosyanın içeriği ise şu hale geldi.

Nearly twenty years after the Black Mesa Incident the G-Man wakes Gordon Freeman and inserts him (seemingly, without any goals) into a train arriving in City 17, a city under control of the Combine Empire located somewhere in Eastern Europe.

Neler oldu?

Peki daha önceki yaptığımız değişiklik yani commit nereye gitti? Eklediğimiz 2. paragraf kayıp mı oldu? Bunu zaten düşünmediğinizi biliyorum ama açıklayalım. Yaptığımız 2. commit olduğu gibi duruyor. Fakat biz zamanda geriye gittik. Zaten asıl amacımız yaptığımız değişiklikleri kaybetmemek.

Git, yaptığınız commit’e göre değişiklikleri sizin dosya sisteminize uygular. Kullandığınız text editörleri dahil bütün araçlar. Dosyaların o anki halini görür.

Şimdi geri dönelim. Bunun için aşağıdaki komutu vermeniz yeterlidir.

story.txt dosyasına baktığınızda eski haline döndüğünü görürsünüz. git log komutu da bize yine 2 commit gösteriyor. Peki master diye verdiğimiz parametre commit id’si mi? Hayır, o dalın adı.

Branch (Dal)

Oturma odası

Geldik asıl konumuza; diyelim ki yeni yapılmış sadece duvarları olan bir daire var. Bu dairenin herhangi bir oturma odasını yaşanabilir hale getireceğiz. Önce bir usta gelip o odanın elektrik tesisatını hazırlayıp gereken kabloları yerleştirecek. Başka bir usta pencere ve kapıları monte edecek. Diğer bir usta odanın duvarlarını ve tavanını boyayıp, duvarlara duvar kağıdı yapıştıracak. Zemine de başka bir usta parke döşeyecek. Bu odanın kullanılabilir hale gelmesi için bir çok adımdan geçmesi gerekiyor. Aslında çoğu iş ortak alanlar dışında birbirinden bağımsız olarak da yapıbilir. Fakat bir oda üzerinde işlemlerin aynı anda yapılması mümkün değil. Bu da verimsiz bir yöntem çünkü her usta diğerini beklemek zorunda kalıyor.

Bu verimsizliği çözmek için her ustaya çalışması için odanın kopyasını versek. Her usta da verilen oda üzerinde serbestçe çalışsa ve işlerini paralel bir şekilde tamamlasa. Daha sonra bu kopya odaları birleştirsek ve tek oda haline getirsek. Bu sorunu çözmüş oluruz. Hatta diyelim ki müşteri parkeleri beğenmedi. Söküp tekrar parke döşemek yerine o ustaya başka bir oda daha veririz. O odada yine istenileni yapar. Müşteriye gösterebilir. Hatta müşteri iki odayı görüp istediğine de karar verebilir. Mümkün mü böyle birşey? Sanal dünyada mümkün.

Aslında ‘solo’ proje dışındaki projelerde bu şekilde çalışıyoruz. Birimiz aynı oda içinde elektrik tesisatını hazırlarken diğerimiz parke döşüyor. Daha sonra yaptığımız işler birleşerek o yazılımı, ürünü ortaya çıkartıyor.

Versiyon kontrol sistemlerinde ustalara verilen odalara dal (Branch) ve bu işleme de dallanma (branching) diyoruz. Bu dallar üzerinde de birleştirme (merging) gibi işlemler yapabiliriz.

Git Branch

Half Life 2, projemizle devam edelim. Oyunumuzun ikinci bölümünü bir başka ustaya verelim. Tabiki ikinci ustada biz olacağız. Fakat kimin olduğunun bir önemi yok. Dallanma işlemlerini git branch komutu ile yapıyoruz. Bu komutu parametresiz olarak verelim.

Bu komut yerelimizde kaç dal olduğunu ve hangi dalda bulunduğumuzu gösterir. Şu anda master adında bir dalımız var ve başındaki asteriks işareti bulunduğumuz dalın master olduğunu gösteriyor.

Bu arada farketmişsinizdir. Kullandığım shell uygulaması sayesinde hangi dalda olduğumu git branch komutuna bakmadan görebiliyorum. Sizin de takip etmenizi kolaylaştıracaktır. Fakat böyle birşeyi şu an için kurmanıza gerek yok.

Git için varsayılan ana dal, master olarak tanımlanır. Bu illa böyle olmak zorunda değildir. Biz bir önceki dersimizde depo oluşturduğumuzda, git bizim için master adında bir dalı otomatik olarak oluşturdu. Yaptığımız iki commit’i de master’a yapmış olduk.

chapter2 isimli bir dal yaratalım. Yeni bir dal oluşturmak için yine git branch komutuna bir isim verirseniz sizin için bulunduğumuz daldan başka bir dal oluşturur.

git branch komutuna baktığımızda iki dal olduğunu ve halen master üzerinde olduğumuzu görüyoruz. O zaman hemen sorumuzu soralım. chapter2 dalına nasıl geçiş yapacağız? (Dersi dikkatli okuyanlar hemen cevaplayacaklardır 🙂 )

Artık chapter2 deyiz. git log ile baktığımızda buradaki commit’lerin de master ile aynı olduğunu görüyoruz. Çünkü master‘ı baz alarak yeni bir dal yarattık. Yeni yapacağımız commit’ler artık master yerine bu dala gönderilmiş olacak. Hemen bir commit yapalım. story.txt dosyasını aşağıdaki commit’leri yapalım. Aynı zamanda pratik yapmış olalım.

Chapter2 dalına commit’ler

Commit Mesajı 1: Add ch2 - "Dr. Kleiner's Lab"

Paragraf:

Alyx, daughter of Eli Vance, a former Black Mesa employee now leading the Resistance against the Combine, takes Gordon to Dr. Kleiner's lab, where he is given an H.E.V. Suit and instructed to be teleported to Black Mesa East with Alyx where he will be able to work alongside other scientists.

Commit Mesajı 2: Add ch2 - "Failed teleporting"

Paragraf:

After teleporting Alyx, Gordon is next, but the interruption from Kleiner's pet headcrab, Lamarr, causes a malfunction in the teleporter leading Gordon to Dr. Breen's office, who recognizes him as a threat and puts the Combine forces on alert.

Commit Mesajı 3: Finalize chapter 2 with Crowbar

Paragraf:

Following the failed teleport sequence, Gordon's only option is to go on foot through the old Canals, with Civil Protection officers in hot pursuit. Before starting his journey, Gordon is given a Crowbar by Barney.

Böylece 3 commit daha yapmış olduk. Fakat bu son yaptığımız commit’leri chapter2 dalına yaptık. Şimdi master‘a geri dönüp, commit’lere ve story.txt dosyamıza bir bakalım.

Yine bahsettiğim gibi master dalına geçiş yaptığımızda, git bu dala yapılan commit’leri alıp sizin dosya sisteminize uygular. Aynı şekilde chapter2 dalına geçtiğinizde yeni yaptığınız commit’lerdeki değişiklikleri de dosyalara uygular ve bu şekilde size bir VCS ortamı sağlamış olur. Son olarak chapter2 dalına geçip tekrar kontrol edelim.

Grafiksel Gösterim

master ve chapter2 dalları arasındaki ilişkiyi aşağıdaki şekilde gösterebiliriz.

git branching
git branching

Şekildeki her daireyi bir commit olarak gösterdik. Zaten anladığınız gibi commit mesajlarını görebilirsiniz. Bu her bir commit’i bir tesbihin boncukları gibi düşünebilirsiniz. Dalları ise birer ip olarak düşünün. Elimizde iki ip var. master ipi ilk iki boncuğun içinden geçiyor. chapter2 ipi ise ekstradan 3 boncuğun içinden de geçiyor. Şu anki git depomuzun yapısı aynen bu şekildedir.

Pratik Zamanı

Geçen dersimizde deponun bulunduğu dizini silerek dersi tekrar edebileceğinizi söylemiştim. Şimdi depoyu silmek yerine chapter2 dalını silip, aynı adımları tekrarlayabiliriz. Aşağıdaki adımları yapınız.

  1. master dalına geçiş yapın,
  2. git branch -D chapter2 ile chapter2 dalını silin,
  3. chapter2 adında yeni bir dal oluşturun. (Öncekini sildiğimiz için git aynı isme sorun çıkartmayacaktır.)
  4. chapter2 dalına geçiş yapın
  5. Yukarıda verdiğimiz değişiklikleri yapın ve commitleyin.

Ev Ödevi

  1. master dalına geri dönmeden yani chapter2 dalından chapter3 isminde bir dal yaratın,
  2. Aşağıdaki paragrafları ekleyin ve commitleri yapın.

    Commit Mesajı 1: Add ch3 - Station 12

    With the Crowbar Gordon is able to disarm two Civil Protection officers who had cornered a couple of Citizens, obtaining in this way his first firearm, the USP Match. Being armed allows Gordon to defeat all Civil Protection Units dispatched to the area before reaching Station 12, one of the many stations set up by the Underground Railroad, a network helping refugees escape City 17.

    Commit Mesajı 2: Add ch3 - Station 6 and the Headcrabs

    Most of these Stations and outposts are already under attack by the time Gordon arrives; generally filled with Manhacks or being bombarded with Headcrab Shells.
    
    Eventually, Gordon reaches Station 6 (now under attack by Headcrabs); where he receives the Airboat, a makeshift vessel with an aircraft-type propeller, to help him traverse the toxic system of canals and get to Black Mesa East quick and safely.
  3. master dalına geri dönün.

Bu işlemlerden sonra depomuzun yapısı aşağıdaki şekilde olmalıdır.

Ev ödevi - branch grafiği
Ev ödevi – dallanma grafiği

Bu dersimizin de sonuna gelmiş olduk. Bu derste bir commit’e dönmeyi, dallanmayı ve dallar arasında geçiş yapmayı öğrendik. Bir sonraki dersimizde chapter2 ve chapter3 dallarındaki değişiklikleri master dalında birleştirmeyi yani merge işlemini öğreneceğiz.

Konu hakkında görüş ve sorularınızı yorum kısmından veya Soru & Cevap sitemizden sorabilirsiniz.

Bir sonraki derste görüşmek üzere…

Git derslerinin tamamı için tıklayınız.

31

Ömer Özkan

Genelde Java teknolojileri ile geliştirme yapar. Özgür ve açık kaynak yazılımlara meraklıdır. Boş zamanlarında gönüllü eğitimler verir. Onun için Clean Code, Test Driven Development gibi konular oldukça önemlidir.

3 Yorum

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?