Birleştirme çakışmaları nedir?
Burada, birleştirme çakışması çözümünün geliştiricilerin çakışan iki kaynaktan en iyi sonucu üretmesine nasıl yardımcı olduğunu ele alıyoruz.
GitHub Akışı
GitHub, işbirliğine dayalı yazılım geliştirme platformu sağlamaya ek olarak, çeşitli özelliklerinin kullanımını iyileştirmek için tasarlanmış, önceden tanımlanmış bir iş akışı da sunar. Bu ünite özellikle birleştirme çakışmalarını kapsasa da, önce GitHub akışını anlama konusunu gözden geçirmenizi öneririz.
Dalları birleştirme
Bir geliştiricinin, main
temelinde feature-branch
adlı bir dal ve iki commit oluşturduğu bir senaryoyu düşünün. Geliştirici bu çalışmayı yaparken başka birisi ilgisiz bir çekme isteğini main
dalıyla birleştiriyor. Geliştiricimiz, feature-branch
dalını main
dalıyla geri birleştirmeyi denediğinde ne olur?
Yanıt: Duruma göre değişir.
uygulamasından main
oluşturulmuş olsa feature-branch
da, dalın kendisini temel alamıyordu. Bunun yerine o anda main
dalının HEAD commit’ini temel almıştır. O zamandan beri uygulanan main
tüm işlemelerin farkında değildir. Şu anda izlediği işlemeler, son değişikliklerin üzerine yazmadan dalı geçerli durumuna katlamaz.
İşlemelerin dal oluşturulduktan sonra yapılan main
paralel işlemelerle çakışmadığı ortaya çıkarsafeature-branch
, hiçbir sorun yoktur. Yeni dosyalar eklenebilir. Dokunulmayan dosyalar silinebilir. main
dalında değiştirilen kod satırları, feature-branch
oluşturulduğundan beri paralel çalışma tarafından değiştirilmediyse feature-branch
dalında değiştirilebilir.
Peki her iki commit kümesi de aynı kod satırlarına yönelik değişiklikler içeriyorsa ne olur? Bu birleştirme denemesi, birleştirme çakışması nedeniyle başarısız olur.
Birleştirme çakışmaları nedir?
Bir geliştirici, yanlışlıkla paralel değişikliklerin üzerine yazılacak değişiklikleri birleştirmeye çalıştığında, birleştirme çakışmaları oluşur. Bu diğer değişikliklerin, temel dalla nasıl birleştirildiği önemli değildir. Git otomatik olarak bir değişiklik kümesinin üzerine başka bir değişiklik yazmaz. Bunun yerine, yeniden birleştirmeye çalışmadan önce karşılaştırma dalında çözümleyebilmesi için birleştirmeye çalışan kişiye işaret eder.
Birleştirme çakışmalarını çözümleme
Birleştirme çakışmalarını çözmenize yardımcı olmak için GitHub, her daldan farklılıkları içeren geçici bir karma dosya oluşturur. Kural gereği, karşılaştırma dalındaki metinler, taban dalın yukarısında, eşittir işaretlerinden oluşan bir satırla (=======
) ayrılmış olarak gösterilir.
Değişiklikler küçük olduğunda dosyayı doğrudan düzenlemek için bu görünümü kullanabilirsiniz. Saklamaya karar verirseniz, nihai sonuç karşılaştırma dalı için işlenir. Alternatif olarak, birleştirme daha fazla söz konusuysa, diğer geliştirme araçlarını kullanarak üzerinde çalışmayı tercih edebilirsiniz. Her iki durumda da, commit işleminden önce kodunuzdan dal işaretlerini kaldırmayı unutmayın. Çakışma çözümlemenizi yürütürken bu işaretçileri kaldırmayı unutursanız, bunlar dosyada kalır ve açıklama eklenmez.
Not
Bu ünitede, birleştirme çakışmalarının tarayıcı bağlamında çözümlenmesi ele alınmaktadır. Ayrıca tümleşik birleştirme çakışması çözümü deneyimleri sunan Visual Studio gibi birçok geliştirme platformu vardır.
Dalınızın tüm birleştirme çakışmaları çözümlendikten sonra birleştirmeyi yeniden deneyebilirsiniz.
Birleştirme çakışmalarını engelleme
Belirli birleştirme çakışmaları kaçınılmazdır. Herhangi bir birleştirme, onaylanmayı bekleyen diğer çekme istekleri için birleştirme çakışmaları oluşturabilir. Ancak, birleştirme çakışmalarının karmaşıklığını azaltmanın etkili bir yolu, dalınızı sıkça çekmektir.
Erken ve sıkça çekme
Komutu, git pull
henüz geçerli dalınıza uygulanmamış temel dal işlemelerini aşağı çeker. Kavramsal olarak, birçok sürüm denetimi sisteminin yerel kodunuzu en son sürüme güncelleştirmenizi sağlamak için kullandığı En Son Sürümü Al komutuna benzer. Dalınızın güncelleştirmelerini çektiğinizde, dal oluşturulduktan (veya en son çekildikten) sonra gerçekleşen tüm değişiklikleri birleştiriyor olursunuz.
Dalınıza güncelleştirmelerin çekilmesi birleştirme çakışmalarına neden olabilir, ancak bu sorun değil. Bunları daha sonra zaten alırsınız ve bunları daha erken alarak ele almak genellikle daha kolaydır.
Güncelleştirmelerin çekilmesi, birleştirme çakışmalarının etkisini azaltmaya ek olarak, çalışırken commit işlemi yapılan değişiklikleri dalınızla tümleştirmenize de olanak sağlar. Bunun yapılması, olası sorunları erkenden önlemenize olanak sağlar. Örneğin, diğer dosyalarda kodunuzun artık derlenmemasına neden olan sınıf tanımı değişiklikleri olabilir. Bu değişiklik, daha sonra birleştirdiğinizde birleştirme çakışmasına neden olmaz, ancak önce test etmediyseniz derlemeyi bozar. En iyi yöntem, dalı olabildiğince temel dala yakın tutmak için güncelleştirmeleri sıkça çekmektir.
Git yeniden temellendirmesiyle geçmişi düzenli hale getirme
git rebase
(veya git pull --rebase
) komutu, temel dalın geçerli HEAD commit’ini temel olarak kullanmak için dal geçmişinizi yeniden yazar. Başka bir deyişle, dalınız yalnızca temel dalın geçerli durumundan dallanmış gibi davranacak şekilde güncelleştirilir. Bu yeniden temel, tüm değişikliklerinizin başlangıçta dallandırdığınız özgün işlemeyle değil temel dalın en son durumuyla karşılaştırıldığını gösterir. İşlemeleriniz doğrusal bir şekilde önceki paralel işlemeleri takip edeceğinden yeniden dengeleme, nihai birleştirme işleminden sonra geçmişin izlenmesini kolaylaştırabilir. İyi bir yöntem, yukarı akışı birleştirmeden hemen önce dalınızı yeniden temellendirmektir.
Git yeniden temellendirmesi hakkında ve Git yeniden temellendirmesinden sonra birleştirme çakışmalarını çözümleme hakkında daha fazla bilgi edinin.