- Published on
Git Branch Merge Nedir ?
- Authors
- Name
- Alperen Önal
Ö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.
Diyagram görüntüsü :
5-)İşte bu senaryoda bu 2 branch'ı birleştirmeyi deniyoruz ancak conflict hatası alıyoruz :
Kaynakça :
git-scm.com/docs/git-merge
ionos.com/digitalguide/websites/web-development/git-merge-branch/