
Git, kararlı sürüm dalının kirlenmesini önlemek için geliştirme akışlarını izole etmek için dalları kullanır. Bir şubedeki işi ana akıma taşımak, şubeleri birleştirmek anlamına gelir. İşte bunu nasıl yapacağınız.
Git’te Birleştirme Nedir?
Git, dallanmayı basit ve hızlı hale getirmek için tasarlandı. Diğer sürüm kontrol sistemlerinin aksine, Git’te dallanma önemsiz bir konudur. Özellikle çok geliştiricili projelerde dallanma, Git’in temel organizasyonel araçlarından biridir.
Dallar, yeni geliştirme çabalarını korumalı alana alır, böylece kod diğer dallardaki, özellikle ana veya ana daldaki kodu etkilemeden değiştirilebilir veya eklenebilir. Bu genellikle kod tabanınızın kararlı sürümünü içerir.
Bu değişiklikleri kararlı kod sürümünüzden izole etmek çok mantıklı. Ancak er ya da geç yeni kod test edilecek, gözden geçirilecek ve ana şubeye gönderilmek üzere onaylanacak. Bu noktada, şubenizi ana şubeyle birleştirmeniz gerekir.
Aslında, şubelerin alt şubeleri olabilir, bu nedenle şubenizi ana şube yerine başka bir şubeyle birleştiriyor olabilirsiniz. Sadece birleştirmelerin her zaman bir dal aldığını ve onu bir hedef şube, o şube ne olursa olsun. Master şubenizi başka bir şubeyle birleştirmek isterseniz onu da yapabilirsiniz.
Git’teki çoğu eylem gibi, yerel deponuzda birleştirmeler gerçekleştirir ve bunları uzak deponuza gönderirsiniz.
Git’te Bir Dalı Birleştirmeye Hazırlanma
Yerel Git deposu ve uzak Git deposu olan küçük bir geliştirme projemiz var. “Master” dalından “bugfix14” isimli bir şube oluşturduk ve bir bug’a çözüm üzerinde çalıştık.
Bu çalışma tamamlandı ve kodumuzu test ettik. Her şey beklendiği gibi çalışıyor. Düzeltmemizin yazılımın bir sonraki sürümünün bir parçası olması için bu değişiklikleri ana dala aktarmak istiyoruz.
Birleştirmeyi gerçekleştirmeden önce yapılması gereken küçük bir hazırlık var. Hedef dalın – bu durumda “ana” dalın – ve onunla birleştireceğimiz dalın her ikisinin de güncel olduğundan emin olmamız gerekir.
Bunu yapmak için kullanacağız git status
emretmek.
git status
- Şubede bugfix14: Şu anki şubemizdir.
- Şubeniz ‘origin/bugfix’ ile güncel: Yerel depomuzdaki şube, uzak depodaki şube ile aynı taahhüt geçmişine sahiptir. Bu, aynı oldukları anlamına gelir.
- taahhüt edecek bir şey yok Aşama alanında taahhüt edilmemiş herhangi bir değişiklik yoktur.
- çalışan ağaç temiz: Çalışma dizininde hazırlanmamış değişiklik yok.
Bunların hepsi, şubenin güncel olduğunu ve devam edebileceğimizi gösteriyor. Bunlardan herhangi biri değişikliklerin var olduğunu gösteriyorsa, bunları hazırlamamız, işleme koymamız ve uzaktan kumandaya göndermemiz gerekir. Bu dosyalar üzerinde başka biri çalışmışsa, değişikliklerini uzak depodan çekmemiz gerekebilir.
Birleştireceğimiz şubeyi kontrol etmek, birleştirme işlemini basitleştirir. Ayrıca güncel olduğunu doğrulamamızı da sağlar. Ana şubeye bir göz atalım.
git checkout master
git status
“Ana” şubenin güncel olduğuna dair aynı onayları alıyoruz.
İLİŞKİLİ: Ekibiniz İçin Doğru Git İş Akışı ve Dallanma Modelini Nasıl Seçersiniz?
Birleştirme gerçekleştirme
Birleşmeden önce, taahhütlerimiz şöyle görünür.
“bugfix14” şubesi, “master” şubesinden ayrıldı. “bugfix14” dalı oluşturulduktan sonra “master” dalı için bir taahhüt olmuştur. “bugfix14” şubesine birkaç taahhüt verildi.
İki şubemizin güncel olduğundan emin olduk ve “ana” şubeyi kontrol ettik. “bugfix14” şubesini “master” şubesiyle birleştirmek için komut verebiliriz.
git merge bugfix14
Birleştirme gerçekleşir. “bugfix14” dalı hala mevcuttur, ancak artık o dalda yapılan değişiklikler “master” dalı ile birleştirilmiştir.
Bu örnekte, birleştirme komutu bir üçlü birleştirme. Yalnızca iki şube var, ancak ilgili üç taahhüt var. Her iki şubenin de başıdırlar ve birleştirme eyleminin kendisini temsil eden üçüncü bir taahhüttür.
Uzak depomuzu güncellemek için, git itme emretmek.
git push
Bazı insanlar yan dalları birleştirdikten sonra silmeyi tercih eder. Diğerleri, onları projenin gerçek geliştirme geçmişinin bir kaydı olarak korumaya özen gösterir.
Şubeyi silmek istiyorsanız, bunu kullanarak yapabilirsiniz. git branch
komutu ile -d
(sil) seçeneği.
git branch -d bugfix14
Uzak havuzdaki dalı silmek için şu komutu kullanın:
git push origin --delete bugfix14
Doğrusal bir taahhüt geçmişiniz olacak, ancak bu gerçek tarih olmayacak.
İLİŞKİLİ: Yerel ve Uzak Depolardaki Git Dalları Nasıl Silinir?
Git’te Hızlı İleri Birleştirme Gerçekleştirme
“Master” şubesine herhangi bir taahhütte bulunmadıysanız, geçmişiniz bu şekilde görünecektir. Ayrıca, geliştirme dalınızı “ana” dalın sonuna eklenecek şekilde yeniden temellendirdiyseniz, bu şekilde görünecektir.
“Master” dalında herhangi bir taahhüt olmadığından “bugfix15” dalını birleştirmek için Git’in tek yapması gereken “master” baş işaretçisini “bugfix15” dalının son taahhüdüne yönlendirmek.
Her zamanki kullanabiliriz git merge
emretmek:
git merge bugfix15
Bu da bize şu sonucu veriyor.
Hangisi bununla aynı:
Bu sadece bununla aynı:
Git hızlı ileri birleştirme gerçekleştirecek ne zaman yapabilirse. “Ana” dala yapılan taahhütler hızlı ileri birleştirmenin mümkün olmadığı anlamına geliyorsa, Git bir üçlü birleştirme.
yapamazsın Kuvvet hızlı ileri birleştirme – sonuçta bu mümkün olmayabilir – ancak bunun hızlı ileri birleştirme olacağını veya hiçbir şey olmayacağını ilan edebilirsiniz. Git’e yapabiliyorsa hızlı ileri birleştirme kullanmasını, yapamıyorsa üç yollu birleştirme yapmamasını söyleyen bir seçenek vardır. seçenek --ff-only
(yalnızca hızlı ileri sarma).
Bu, “bugfix15” dalını “ana” dalla birleştirir, ancak yalnızca hızlı ileri sarma mümkünse.
git merge --ff-only bugfix15
Git şikayet edecek ve mümkün değilse çıkacaktır.
git merge --ff-only bugfix16
Bu durumda, “ana” dalda taahhütler vardır, bu nedenle hızlı ileri birleştirme mümkün değildir.
Git’te Birleştirme Çakışmaları Nasıl Çözülür?
Her iki dalda da aynı dosyanın aynı bölümleri değiştirilmişse dallar birleştirilemez. Çakışan düzenlemeleri çözmek için insan etkileşimi gereklidir.
Burada “bugfix17” adlı bir dalda bulunan “rot.c” adlı bir dosyada “master” dalına birleştirmek istediğimiz değişiklikleri yaptık. Ama “master” dalında da “rot.c” değişti.
git merge bugfix17
Birleştirmeye çalıştığımızda çakışma olduğuna dair bir uyarı alıyoruz. Git, çakışan dosyaları listeler ve bize birleştirmenin başarısız olduğunu söyler. kullanarak tamamen geri çekilebiliriz. --abort
seçenek:
git merge --abort
Ancak birleştirmeleri çözmek göründüğü kadar korkutucu değil. Git bize yardımcı olmak için bazı çalışmalar yaptı. Çakışan dosyalardan birini düzenlersek -bizim durumumuzda yalnızca bir tane var- çakışan kod bölümlerinin bizim için vurgulanmış olduğunu görürüz.
Her çakışma, yedi küçük karakterle sınırlandırılmıştır “<<<<<<<
” ve yedi büyüktür karakteri”>>>>>>>
“, yedi eşittir işaretli”=======
” onların arasında.
- Eşittir işaretlerinin üzerindeki kod, birleştirdiğiniz şubedendir. içine.
- Eşittir işaretinin altındaki kod, denemeye çalıştığınız dalın kodudur. birleştirmek.
Yedi karakterlik kümelerden birini kolayca arayabilir ve dosyanız üzerinden bir çatışmadan diğerine geçebilirsiniz. Her çakışma için, hangi düzenleme grubunu tutacağınızı seçmeniz gerekir. Reddettiğiniz kodu ve Git’in eklediği yedi karakterlik satırları düzenlemelisiniz.
“bugfix17” dalındaki kodu tutacağız. Düzenledikten sonra dosyamız bu şekilde görünüyor.
Şimdi birleştirme işlemine devam edebiliriz. Ama dikkat, kullandığımız commit
bunu yapmak için komut, merge
emretmek.
Dosyayı hazırlayarak ve her zamanki gibi taahhüt ederek değişikliği taahhüt ediyoruz. Son taahhüdü yapmadan önce durumu kontrol edeceğiz.
git add rot.c
git status
git commit -m "Merged bugfix17"
Birleştirme tamamlandı. Artık bunu uzak depomuza gönderebiliriz.
İLİŞKİLİ: Git İşlemlerini Düzeltme, Düzenleme veya Geri Alma (Git Geçmişini Değiştirme)
Her şey Sonunda Birleşir
Sonunda tüm dalların birleştirilmesi gerekir, böylece içlerindeki değişiklikler yetim kalmaz ve unutulmaz.
Şubeleri birleştirmek kolaydır, ancak yoğun, daha büyük ekiplerde çatışmalarla uğraşmak karmaşık hale gelebilir. Çakışmaları çözmek, her geliştiriciden yalnızca kodlarının ne işe yaradığını ve değişikliklerini neden yaptıklarını açıklamak için girdi gerektirebilir. Hangi düzenlemeleri saklayacağınız konusunda bilinçli bir karar vermeden önce bunu anlamanız gerekir.
Ne yazık ki Git bu konuda yardımcı olamaz.
İLİŞKİLİ: GUI Git İstemcisi Kullanmalı mıyım?