git dersleri

Git Dersleri – Git Merge – Dalları Birleştirelim

Merhabalar, git öğrenmeye kaldığımız yerden devam ediyoruz. Bu dersimizde yine en temel kavramlardan biri olan merge‘i ve dallarımızı git merge ile birleştirmeyi öğreneceğiz.

Geçen dersimizde dallanma konusu işlemiş, yeni oluşturduğumuz dallara commit’ler yapmıştık. Depomuzda şu an ana dalımız olan master, chapter2 ve chapter3 dallarımız yer almaktadır. Eğer bir önceki dersimizi okumadıysanız lütfen bu derse devam etmeyiniz. Bu arada verdiğimiz ev ödevini de tamamlamanız gerektiğini tekrar hatırlatalım.

Bir önceki dersimizde dalları anlatırken bir evin odasının inşaatından örnek vermiştik. Her usta bu odanın kopyasını alarak paralel bir şekilde çalışıyordu. Bu dersimizde bu ustalar artık işlerini bitirdi. Bundan sonra birden farklı odaları birleştirip tek bir oda haline getirmemiz gerekiyor.

Dallar arası işlemler

Hatırladığınız gibi chapter2 ve chapter3 dallarına yapılan yeni commit’ler bağımsız olarak devam ediyordu. chapter2, masterdalından dallandığı için master‘a şu ana kadar yapılan commitler chapter2dalında da yer alıyor. Benzer işlemi chapter3 ve chapter2dallarında da yaptık. Burdaki amacımız tamamlanmış olan chapter2 ve chapter3 dallarına yaptığımız yeni commitleri asıl odamıza yani master‘a aktarıp müşteriye odanın son halini teslim etmemiz gerekiyor.

Diff Komutu

Birleştirme işlemine geçmeden önce iki dal arasındaki farkları nasıl inceleyebileceğimizi öğrenelim. Bunun için git diff komutunu kullanabiliriz.

Sonucu incelediğinizde son üç paragrafın önünde + işaretlerini görüyoruz. Bu chapter2 dalına o satırların eklendiğini master‘da bulunmadığını gösteriyor. Şimdi aynı işlemin tersini yapalım.

Bu kez + işareti yerine - işaretini görüyoruz. Bu o üç paragrafın chapter2 de bulunduğunu ama master dalında o satırların eksik olduğunu gösteriyor.

Git merge

Git’de dallar arasındaki commit’leri almanın birden fazla yolu var. Bu yollardan en temeli bir dalı, diğer dala birleştirme yani merge işlemidir.

Şimdi geldik birleştirme işlemine. chapter2 dalına yapılan işlemlerin master‘a da yapılmasını istiyoruz. Bunun için önce dalı nereye merge etmek istiyorsak o dala git checkout ile geçiş yapmamız gerekiyor. git merge komutunu kullanabiliriz.

Birleştirme işlemini tamamladık. Bakalım bu komut nasıl bir işlem gerçekleştirmiş. Şimdi git log ile commit’lere ve cat ile story.txt dosyasının içeriğine bakalım.

story.txt dosyasının içeriğinin chapter2 dalı ile aynı olduğunu görüyoruz. chapter2 dalına yapılan commit’ler de master‘a gelmiş. Aslında birleştirme işlemini yine commitler üzerinden yapmış olduk. git merge komutu master’da olmayan commitleri belirleyip onları master‘a da uyguladı. Yeni öğrendiğimiz git diff ile de bakalım.

Karşımıza bomboş bir ekran çıktısı aldık. Yani aradaki farkın olmadığını gösteriyor.

Grafiksel Gösterim

Merge chapter2 branch

After Merge chapter2

Merge işlemini yukardaki gibi özetleyebiliriz. merge işlemi chapter2dalındaki commit’leri master‘a aktarmış oldu.

Unutulan paragraf

Senaryonun ilk bölümünü (chapter1) yazan kişi paragraflardan birini eklemeyi unuttuğunu farketti ve kendine master‘dan yeni bir dal yarattı.

story.txt dosyasını inceledikten sonra 2. ve 3. paragraf arasına aşağıdaki unutulmuş paragrafı ekledi. Yaptığı bu değişikliği de commit’ledi.

Barney contacts Dr. Isaac Kleiner, Gordon's mentor from his MIT days and former Black Mesa employee. After a bit of discussion they decide to send Gordon over to Kleiner's Lab. Along the way, Gordon finds himself in the middle of a Civil Protection raid on a tenement house; after being captured, Gordon is rescued by a young woman named Alyx Vance.
git commit -am "Add ch1 - 'Gordon is rescued by Alyx Vance'"

chapter1 dalında işini tamamlayan yazar, bu dalı master‘a birleştirmeye karar verdi.

Böylece 1. bölümde unutulan paragraf ana dalımız master‘a gelmiş oldu.

Gerçek bir merge işlemi

Şimdi chapter3‘e geri dönelim ve master ile arasındaki farklara bakalım.

1. bölümde unutulan paragrafın bu dalda olmadığını ve 3. bölümün paragraflarının da yeni eklendiğini görüyoruz.

Bu bölümün de tamamlandı ve artık master‘a gelmesi gerekiyor. Bu işlemi gerçekleştirelim.

git log --oneline ile commit’lere baktığımızda aşağıdaki listeyi görüyoruz.

6c6f018 Merge branch 'chapter3'
f96d86c Add ch1 - 'Gordon is rescued by Alyx Vance'
bea0653 Add ch3 - Station 6 and the Headcrabs
078db27 Add ch3 - Station 12
f707b25 Finalize chapter 2 with Crowbar
e4fa7d8 Add ch2 - "Failed teleporting"
690c75c Add ch2 - "Dr. Kleiner's Lab"
4d8155f Add 'Gordon meets armed Combine officers'
815029b Add introduction to HL2 Story

En üstteki commit’e baktığınızda Merge branch 'chapter3' commitini görüyoruz. Bu commit mesaji biz merge işlemini yaparken soruldu ve “Merge branch ‘chapter3′” mesajını da varsayılan olarak verdi. Ama bu commit’i git commit komutu ile yapmadık. Peki neden böyle bir commit mesajı istedi?

Bunu cevaplamak için aşağıdaki bir önceki merge işleminin grafiğini tekrar inceleyelim.

Merge chapter2 branch

chapter2 ve chapter1 dallarını birleştirirken master‘a yeni bir commit yapılmamıştı. Bu yüzden git gerçek bir merge işlemi yapmak yerine chapter2ve chapter1 dallarına yapılan yeni commit’leri alıp master‘a olduğu gibi aktardı. Bu işleme ‘fast-forward’ diyoruz. Bu konuyu ilerleyen derslerimizde daha detaylı inceleyeceğiz.

Şimdi son yaptığımız işlem için aşağıdaki grafiği inceleyelim.

merge chapter3

Grafikten anladığınız gibi chapter3 ile master arasında farklı commit’ler var. Farklı commit’ler olduğu için birleştirme işlemini farklı bir strateji (recursive) ile yaptı. Kısacası iki daldaki iki farklı story.txt dosyasını birleştirmeye çalıştı ve başarılı oldu. Bunun sonucunda bizden bir commit mesajı daha istedi. Otomatik olarak yapılan bu commit, diğerlerine göre özel bir commit. Bunu yine ilerleyen derslerimizde göreceğiz.

Şimdi merge işleminden sonra master‘ın grafiksel gösterimine bakalım.

After merge chapter3

Yine sıralamaya bakarsanız chapter1 için yapılan commit’in chapter3‘e yaptığımız commitin önünde olduğunu görüyoruz. Bunun sebebi chapter3‘e bu commit’i daha önce yapmış olmamız.

Dilerseniz master dışındaki dalları ana dalımıza birleştirdiğimiz için bu dalları yerel deponuzdan silebilirsiniz.

git branch -D <branch_adi>

 

Bu dersimizin de sonuna gelmiş olduk. Git merge işlemini her zaman otomatik olarak yapamaz. Bu durumda bu işlemin manuel olarak yapılması gerekir. Bir sonraki dersimizde bu durumu görmüş olacağız.

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.

27

Ö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?