Birleştirme çakışmaları nedir?

Tamamlandı

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 mainoluş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.

Birleştirme çakışması olmayan bir çekme isteği.

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ışması.

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ı olan bir çekme isteği.

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.

Birleştirme çakışmasını çözme.

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.