git merge

Git Dersleri – Git Merge 2: Çakışmaları (Conflict) Çözmek

Java Kotlin Eğitimi

Merhabalar, geçenki dersimizde git ile iki dalı birleştirmeyi, git merge komutunu görmüştük. Bu dersimizde ise merge işleminden kaynaklanan conflict yani çakışmaları görüp bu çakışmanın nasıl çözüleceğini göreceğiz.

Bir versiyon kontrol sistemi kullandığınızda yaşayacağınız en büyük problem çakışmalardır. Bu çakışmalar yaptığınız geliştirmeye bağlı olarak bazen basitçe çözebilir bazen de saatlerce zamanınızı alabilir. Hatta ekip içinde tatsızlıklara bile sebep olabilir.

Çakıma aslında çok basit bir şekilde karşımıza çıkabilir. İki kişi aynı dosyayı ve aynı satırı değiştirirse ve git otomatik olarak merge edemezse bu durumda conflict yani çakışma olacaktır. Bu durumda çakışma yaşayan kişi gerekirse ekipteki diğer kişi ile beraber oturup çakışmayı çözdükten sonra merge işlemine devam etmelidir.

Depomuzun Son Hali

Geçen dersimizden hatırladığımız gibi chapter2 ve chapter3 branch’lerini master‘a birleştirmiştik. story.txt dosyamızda üç bölüme ait paragraflar yer alıyor.

Conflict sorununa geçmeden önce story.txt dosyamızı biraz daha takip edilebilir bir hale getirelim. story.txt dosyasında her bölümün başına hangi ‘Chapter’ a ait olduğunu ekleyelim. Dosyamızın son hali aşağıdaki gibi olacaktır.

Şimdi bu dosyayı commit’leyelim.

Chapter 4 ve Chapter 5

Son commit’imizin ardından senaryomuza devam ediyoruz. Chapter 4 için ve Chapter 5 için bir branch oluşturup buraya commitlerimizi yapalım.

chapter4 branch’ini yaratıp aşağıdaki paragrafı commit’leyelim.


Şimdi sırada chapter5 ve aşağıdaki paragrafta. Branch’i master‘dan yaratmayı unutmayın!

chapter4 vs chapter5

Şimdi elimizde iki branch var. Bu branch’lerin ikisini de master’a birleştirmemiz gerekiyor. Gelin öncelikle bu iki branch arasındaki farkları inceleyelim.

Hangisini önce getirelim? Aslında hiç farketmez. İlk master’a getiren çakışma yaşamayacak. Yani burda hızlı olan kazanıyor 🙂

master’a geri dönüp chapter4’ü merge edelim.

Conflict Zamanı

Şimdi chapter5’i merge edelim.

Aşağıdaki mesajı aldık.

Auto-merging story.txt
CONFLICT (content): Merge conflict in story.txt
Automatic merge failed; fix conflicts and then commit the result.

story.txt dosyasında bir conflict oluştuğunu açıklıyor. Şu an bu çakışmayı düzeltip tekrar bir commit yapmamız gerekecek. Düzeltme işlemine geçmeden önce story.txt dosyasının son satırlarına bakalım.

İçeriğe baktığımızda <<<<<<< HEAD yazan bir satır görüyorsunuz. Yine aynı şekilde bu paragrafın sonunda ======= bir satır daha var. (Kendi eklediğimiz satırla karıştırmayınız.) HEAD burda bulunduğumuz branch’in yani masterın son commitini ifade eder. Dosyanın devamında ise 5. bölümü ve sonunda da >>>>>>> chapter5 satırını görüyoruz. Git bize çakışma yaşadığımız değişiklikleri bu şekilde gösteriyor.

Bu aslında standard bir format. Unix sistemlerde diff komutunu kullandıysanız aynı formatta sonuç alırsınız. Hatta bir uygulama ile bu değişiklikleri daha güzel görebilirsiniz.

Örnek olarak kendi sistemime kurduğum Meld adlı uygulamada bu şekilde gözüküyor.

Melt diff ekranı
Melt diff ekranı

Yine eğer Eclipse, IntellijIdea gibi IDE kullanıyorsanız size yine daha güzel bir araç sağlayacaktır.

Çakışmayı (Conflict) Düzeltelim

Biz şimdi düzeltme işlemini yine vim kullanarak yapalım. Zaten burdaki çakışmayı çözmek oldukça basit. İstediğimiz her iki değişikliği de kabul etmek.

Şimdi bizden istenen commit’i gerçekleştirelim.

Böylece chapter5‘i de master’a birleştirmiş olduk. Bir git deposunda veya herhangi bir versiyon kontrol sisteminde sürekli aynı dosyayı değiştiriyorsanız çakışma sürekli karşınıza çıkacaktır. Yüzlerce satır kodda bu sorunu yaşadğınızı düşünün. İşin içinden çıkmak her zaman bu kadar kolay olmayacaktır. Bu sorunu yaşamak, ekibin yapısına, yazılılım geliştirirken kullandığınız programlama diline, uygulama çatılarına, yazılım prensiplerine uyup uymadığınıza vs. gibi bir çok etken bulunmaktadır. Örneğin bir Java uygulamasını ‘Tek Sorumluluk Prensibi (Singe Responsiblity Principe)’e uymayıp bütün kodu tek bir sınıfa yazarsanız, çakışma yaşamamanıza imkan yoktur.

Kullandığımız her araç ve o aracı nasıl kullandığımız da yazılım geliştiriken önemli konulardan biridir. Git ile ilgili ilerleyen derslerimizde bu konuları daha detaylı ele almayı düşünüyoruz.

Bu dersimizde conflict yani çakışma örneği görmüş olduk. Bir sonraki dersimizde artık uzak bir sunucu ile çalışmayı öğ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.

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

Yorum Yaz

Haftalık Bülten

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