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
, master
dalından dallandığı için master
‘a şu ana kadar yapılan commitler chapter2
dalında da yer alıyor. Benzer işlemi chapter3
ve chapter2
dalları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 işlemini yukardaki gibi özetleyebiliriz. merge
işlemi chapter2
dalı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.
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 chapter2
ve 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.
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.
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
Merhaba,
Anlatımınız için teşekkür ederim, gayet yararlı ve faydalı oldu. devamını bekliyoruz.
hocam hangi console uygulaması bu acaba
Oh My ZSH kullaniyorum. https://github.com/ohmyzsh/ohmyzsh adresinden ulasabilirsin. https://gist.github.com/kevin-smets/8568070 burda da OS X icin detayli kurulum notlari var. Linux sistemler icin de uygulanabilir.