Published on

Git Branch Merge Nedir ?

Authors
  • avatar
    Name
    Alperen Önal
    Twitter

Önceki yazımızda git'de branch konusunu işlemiştik. "Branch Merge" konusunun iyi anlaşılması için branch yapısına hakim olunması gerekiyor.

Adından da anlaşılacağı üzere "branch merge" işlemi, farklı dallardaki değişiklikleri birleştirmek veya entegre etmek için kullanılır. Genellikte proje geliştirirken yeni özellikler eklemek için öncelikle yeni branch üzerinde çalışmalarımızı yürütür ardından istediğimiz sonucu alırsak root branch(main, master vs.) ile birleştiririz. Fast-Forward-Merge ve Three-Way Merge Git'in en kolay iki birleştirme yaklaşımlarıdır.

Fast Forward Merge

Geçerli Git dalı ile hedef dal arasında doğrusal bir bağlantı olduğunda hızlı ileri birleştirme gerçekleştirilir.

Mesela, bir projede root branch üzerinde kendi branch'ınızı oluşturdunuz ve bu yeni branch'a ihtiyacınız doğrultusunda commit'ler attınız ve bu branch ile işiniz bitti. Artık root branch ile yeni branch'ınızı merge etmek istiyorsunuz. Bu bir Fast-Forward-Merge örneğidir.

Aşağıdaki gibi bir komut dizisi Fast Forward Merge için örnek verilebilir.

git checkout master
git merge yenidal
git branch -d yenidal

Örnek Fast Forward Merge Senaryosu:

1-) Master branch'ınızda A, B, C commit'leri var. C'nin olduğu noktadan "feature" isimli yeni bir branch oluşturuyorsunuz. Ardından bu yeni branch'a geçip D, E, F commit'lerini atıyorsunuz :

2-) Master branch'ınıza geçip feature branch'ı ile merge ettiğinizde :


Three Way Merge

Fast-Forward-Merge'ın aksine geçerli dal ile hedef dal arasında doğrusal bağlantı olmayan durumlarda kullanılmaktadır.

Fast-Forward-Merge yaptığınız zaman git tarafından yeni bir commit oluşturulur ve birleştirilen dallardaki son commitler oluşan yeni commit'in ataları olacak şekilde hiyerarşide yerleştirilir. Yani, Fast-Forward-Merge'de 1 ata varken burada 2 ata vardır.

Üç, üç taahhütten gelir: ana dal, ikincil dal ve düzenlenmiş orijinal dal.

Mesela, arkadaşınız ile aynı proje üzerinde çalışıyorsunuz. Arkadaşınız root branch üzerinden yeni bir branch oluşturdu ve ihtiyacı doğrultusunda bu yeni branch'a commit'lerini attı. Siz de arkadaşınız bu commit'leri atarken boş durmadınız ve root branch'ına yeni commit attınız. Arkadaşınız yeni branch üzerindeki işlerini bitirdi ve root branch ile merge etti. Bu bir Three-Way-Merge örneğidir.

Aşağıdaki gibi bir komut dizisi Three Way Merge için örnek verilebilir.

git checkout -b yenidal
git add first-file
git commit -m "ilk dosyayi ekle".
git add second-file
git commit -m "ikinci dosyayi ekle"
git checkout master
git add third-file
git commit -m "ucuncu dosyayi master'a ekle".
git merge yenidal
git branch -d yenidal

Örnek Three Way Merge Senaryosu:

1-) Master Branch'ınızda A, B, C commit'leriniz var. C commit'inin bulunduğu noktadan arkadaşınız "feature" isimli yeni bir branch oluşturuyor. Ardından bu feature isimli branch'a D, E, F isimli 3 commit atıyor. Siz de bu sırada master branch'ına G commit'ini atıyorsunuz :

2-) Master Branch'ınıza geçip feature branch'ı ile merge işlemi yaptığınızda :

Fotoğrafta da görülebileceği gibi git, H isimli bir merge commit'i oluşturur ve önceki 2 branch'ı bu commit'in atası olacak şekilde refere eder.


Merge Conflict Nedir ?

Ne yazikki, Merge işlemleri her zaman kolay olmaz. 2 farklı branch'de aynı yerlerin değiştirildiği durumlarda conflict(çatışma) sorunu ortaya çıkar. Git, böyle durumlarda conflict'i çözmek için hangi branch'daki değişikliliği kabul edeceğini bilemez bu yüzden manual olarak istediğimiz değişikliliği Git'e belirtiriz ve conflict'i ortadan kaldırırız.

Conflict(Çakışma) Çözümleme Adımları

Adım 1: Çatışmayı Belirleme

İlk olarak, hangi dosyalarda veya hangi branch'ler arasında conflict olduğunu bulmanız gerekiyor. Git size merge işlemi sırasında bu çatışmaları belirtecektir.

Adım 2: Çatışma Dosyasını Açma

Git'in belirttiği çatışma olan dosyaları metin düzenleyicinizde açın. Çatışma belirteçleri (<<<<<<<, =======, >>>>>>>) ile işaretlenmiş alanları göreceksiniz. Bu alanlar, farklı branch'lerdeki conflict'leri gösterir.

Adım 3: Değişiklikleri İnceleme

  • Çatışan dosyayı açtıktan sonra, her iki branch'teki değişiklikleri gözden geçirin. Hangi değişikliklerin korunması gerektiğine karar verin veya gerekiyorsa değişiklikleri birleştirin.

Adım 4: Çatışmayı Çözme

  • Belirtileri Temizleme:- Çatışma belirteçlerini (<<<<<<<, =======, >>>>>>>) ve ortak satırları düzenleyerek çatışmayı çözün. İhtiyacınıza göre değişiklikleri yapın.
  • Dosyayı Kaydetme:- Değişiklikleri yaptıktan sonra dosyayı kaydedin ve kapatın.

Adım 5: Dosyayı Commit Edip Merge'yi Tamamlama

  • Çözülen dosyayı Git'e staging area'ya taşımak için git add komutunu kullanın.
  • git commit komutu ile değişiklikleri commit ederek merge işlemini tamamlayın.

Örnek Merge Conflict Senaryosu

Bir ailenin kullandığı en fazla 6 kişiyi tutabilen bir telefonrehberi.txt dosyamız olsun

1-)İlk olarak bu dosya "Telefon Rehberi Oluşturuldu" ismiyle commit ediliyor.

TelefonRehberi.txt içerisi :
2-)Daha sonra evden birisi master branch'ından Telefon Rehberine eklemeler yapıyor ve "Telefon Rehberine Eklemeler Yapıldı" başlığı ile commit ediyor.

Diyagram görüntüsü :

3-)Ardından yine evden başka birisi "feature" isimli yeni bir branch açıp 2 yeni kişi ekliyor ve 1 kişinin kaydını silip onun yerine başka birisini ekliyor ve commit ediyor.
Diyagram görüntüsü :
4-)Daha sonra evden başka birisi geliyor ve master branch'ı üzerinden rehberin 5. satırına yeni ekleme yapıyor ve commit atıyor.
Diyagram görüntüsü :

5-)İşte bu senaryoda bu 2 branch'ı birleştirmeyi deniyoruz ancak conflict hatası alıyoruz :

Conflict olan dosyanın TelefonRehberi.txt olduğunu belirtiyor. Bu dosyayı açtığımızda conflict işaretleri ile yapılandırıldığını görüyoruz.
Ve ihtiyacımıza göre metin içerisini düzenliyoruz(Nasıl düzenleyeceğiniz keyfinize kalmış) :

Kaynakça :

  • git-scm.com/docs/git-merge

  • ionos.com/digitalguide/websites/web-development/git-merge-branch/