Birleştirme stratejileri ve squash birleştirme

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Bir çekme isteğini tamamladığınızda, konu dalını genellikle mainvarsayılan dalınızla birleştirirsiniz. Bu birleştirme, konu dalının işlemelerini ana dalınıza ekler ve varsayılan dal ile konu dalı arasındaki çakışmaları mutabık hale getirmek için bir birleştirme işlemesi oluşturur. Çekme isteğindeki açıklamalar ve tartışmalar, konu dalında yapılan değişiklikler için ek bağlam sağlar.

Çekme isteğinden normal birleştirme örneği.

Dalınızın (veya diğer varsayılan dalınmain) işleme geçmişi, ilgili konu dal geçmişi nedeniyle düz bir çizgi izlemez. Bir proje büyüdükçe, aynı anda üzerinde çalışılması gereken konu dallarının sayısı artarak varsayılan dal geçmişinin takip etmek giderek daha zor hale geliyor.

Varsayılan dal, her konu dalının geçmişinin doğru bir gösterimidir, ancak projenizin geliştirilmesiyle ilgili daha geniş soruları yanıtlamak için kullanmak zordur.

Sıkıştırarak birleştirme

Squash birleştirme, çekme isteğini tamamladığınızda konu dallarının Git geçmişini daraltmanıza olanak tanıyan bir birleştirme seçeneğidir. Konu dalındaki her işlemenin varsayılan dalın geçmişine eklenmesi yerine, squash birleştirmesi tüm dosya değişikliklerini varsayılan daldaki tek bir yeni işlemeye ekler. Sıkıştırma birleştirme işlemesinin konu dalı için bir başvurusu yoktur, konu dalındaki tüm değişiklikleri içeren yeni bir işleme oluşturur. Ayrıca, herhangi bir karışıklığı önlemek için konu dalını silmeniz önerilir.

Azure Repos'ta çekme isteklerinde squash birleştirme diyagramı.

Bunu düşünmenin basit bir yolu, squash birleştirmenin size yalnızca dosya değişikliklerini, normal birleştirmenin ise dosya değişikliklerini ve işleme geçmişini vermesidir.

Squash birleştirme nasıl yararlı olur?

Squash birleştirme, ekibinizde herhangi bir iş akışı değişikliği gerektirmeden varsayılan dal geçmişlerinizi temiz ve takip etmek kolay tutar. Konu dalının katkıda bulunanları konu dalında istedikleri gibi çalışır ve varsayılan dallar, squash birleştirmeleri kullanarak doğrusal bir geçmiş tutar. Sıkıştırma birleştirmeleriyle güncelleştirilen bir main dalın işleme geçmişi, birleştirilmiş her dal için bir işlemeye sahiptir. İşin tam olarak ne zaman yapıldığını öğrenmek için bu geçmişe adım adım ilerleyebilirsiniz.

Squash birleştirmede dikkat edilmesi gerekenler

Squash birleştirme, varsayılan dalınızdaki değişikliklerin geçmişini daraltır, bu nedenle birleştirmeyi ne zaman veya bir konu dalının tam işleme geçmişini ne zaman tutmak istediğinize karar vermek için ekibinizle birlikte çalışmanız önemlidir. Squash birleştirme sırasında kaynak dalı silmek iyi bir uygulamadır. Kaynak dalın silinmesi, konu dalını varsayılan dalda birleyen bir işlemeye sahip olmadığından karışıklığı önler.

Squash birleştirme ile çekme isteklerini tamamlama

Azure Repos'ta çekme isteğini tamamlarken sıkıştırma birleştirmeyi seçebilirsiniz.

Konu dalını sıkıştırmak için Çekme isteğini tamamla iletişim kutusundaki Birleştirme türü altında Sıkıştır işleme'yi seçin.

Azure Repos'ta squash birleştirme ile çekme isteğini kapatma işleminin ekran görüntüsü.

Birden çok birleştirme tabanı

Çekme isteğindeki Dosyalar sekmesi üç taraflı karşılaştırmayla farkları algılar. Algoritma, hedef daldaki son işlemeyi, kaynak daldaki son işlemeyi ve bunların ortak birleştirme tabanını (en iyi ortak üst öğe) dikkate alır. Algoritma, değişiklikleri algılamanın hızlı, uygun maliyetli ve güvenilir bir yöntemidir. Ne yazık ki bazı durumlarda birden fazla gerçek temel vardır. Çoğu depoda bu durum nadirdir, ancak birçok etkin kullanıcısı olan büyük depolarda yaygın olabilir. Dallar arasında birden çok birleştirme tabanı olup olmadığını el ile de kontrol edebilirsiniz. Bunu yapmak için komutunu çalıştırın git merge-base --all feature master . Azure DevOps, her çekme isteği için birden çok birleştirme tabanının varlığını algılar. Bunlar algılandığında Azure DevOps şu iletiyi görüntüler: "Birden çok birleştirme tabanı algılandı. Görüntülenen işlemeler listesi, çekme isteği için eksik olabilir". Azure DevOps birden çok birleştirme tabanını algılamayı çalıştırsa da, olası birleştirme tabanının zaten birleştirilip birleştirilmediğini denetlemez. Bu tür bir denetim tarafından git merge-baseyapılır. Bu nedenle Azure DevOps yalnızca bir birleştirme tabanı raporladığında git merge-base bile iletiyi görüntüleyebilir.

Not

Çekme isteği gözden geçirmesi sırasında değişiklikleri kaybettiyseniz, lütfen kök nedenin birden çok birleştirme tabanı olmadığından emin olun.

Aşağıdaki senaryolar Azure DevOps tarafından birden çok temel olarak algılanmıştır (birleştirme tabanları 1 ve 2 sayısıyla gösterilir):

  • Farklı dallar arasında çapraz birleştirmeler (çapraz çapraz olarak da bilinir) (Azure DevOps tarafından da git merge-basebildirilir)
---1---o---A
    \ /
     X
    / \
---2---o---o---B
  • Bir dalın diğer iki dalla birleştirilmesi (Azure DevOps tarafından bildirilir, ancak birleştirme tabanı 2'yi ortadan kaldırmaz git merge-base )
---1---o---o---o---A
    \         /
     \-------2
      \       \
       \---o---o---o---B
  • Ana dal geri dönmelerinin sonlarını işleme, örneğin birleştirme işlemesini değiştirme
*   42bb2d2 (HEAD, A) Amended merge commit
|\  
| | *   67c9bb8 (other) Merge branch 'A' into B
| | |\  
| |/ /  
|/| /   
| |/    
| * fa78e32 add second commit
* | 15845c9 add first commit
|/  
* 6a52130 add init
  • Özellik dallarının etkin yeniden kullanımı
  • Geri döndürmeler, kiraz seçimleriyle ve birleştirmelerle diğer sezgisel olmayan ve kıvrımlı manipülasyonlar

Birden çok birleştirme tabanı algılama, güvenlik farkındalığının bir parçasıdır. Birden çok birleştirme tabanı varsa, kullanıcı arabirimi için dosya fark algoritması, hangi birleştirme tabanını seçtiğine bağlı olarak dosya değişikliklerini düzgün algılamayabilir. Çekme isteğindeki dosyaların birleştirme temelleri arasında farklı sürümleri varsa, birden çok birleştirme temeli uyarısı oluşur.

Daha fazla ayrıntı için lütfen resmi git belgelerini gözden geçirin.

Birden çok temelden birleştirmenin olası güvenlik riskleri

  • Kötü amaçlı bir kullanıcı, çekme isteğinde bulunmayan kötü amaçlı değişiklikleri işlemek için kullanıcı arabirimi algoritmasını kötüye kullanabilir.
  • Çekme isteğinde önerilen değişiklikler zaten hedef daldaysa Dosyalar sekmesinde görüntülenir, ancak klasör değişiklikleriyle eşlenen dal ilkelerini tetiklemeyebilir.
  • Birden çok birleştirme tabanından aynı dosyalarda yapılan iki değişiklik kümesi PR'de mevcut olmayabilir. Bu durum, tehlikeli mantık boşlukları oluşturabilir.

Birden çok birleştirme temeli sorununu çözme

Birden çok birleştirme tabanına sahip olmak mutlaka kötü değildir, ancak her şeyin yolunda olup olmadığını bir kez daha denetlemeniz gerekir. Birden çok birleştirme tabanından kurtulmak için, hedefte dalınızı yeniden açarak veya hedefi dalınızla birleştirerek dalları tek bir ortak ata bağlayın. Bu eylemler uyarı iletisinden kurtulur ve gerçek değişikliklerin iyi olup olmadığını denetlemenize yardımcı olur.

Yaklaşımlardan biri, yeniden bağlamadan veya birleştirmeden önce geçici sıfırlama yapmak ve ilerleme durumunuzu saklamaktır. Daha sonra yeni bir dal oluşturabilir veya boş bir dalı yeniden temel alabilir ve değişikliklerinizi net bir noktadan uygulayabilirsiniz. Bu işlem, değişiklikleriniz zaten varsa uzak sunucuya zorla gönderme gerektirebilir.

Birden çok birleştirme temeli sorununu önleme

Birden çok birleştirme temel sorununu önlemeye yönelik genel ipuçları şunlardır:

  • Çekme isteği hazırlarken ana veya yayın dalının en son sürümlerinden özellik dalları oluşturun.
  • Gerekli olmadığı sürece doğrudan deponuzun kararlı dallarından kaynaklanmaması gereken dallar oluşturmaktan kaçının.

Birden çok birleştirme temeli sorunu yeniden ortaya çıkarsa ne yapmalı?

Birçok etkin katkıda bulunana sahip büyük depolarda bu sorun özellikle uygunsuz olabilir. Birleştirme yoluyla birden çok temelden kurtulsanız bile, durum yeniden ortaya çıkabilir. Birisi uzun süredir devam eden bir çekme isteğini kapatırsa, bu durum yeniden oluşturulabilir. Derleme ilkeleri ve testleri çalıştırılıyor olsa da, çekme isteğini tamamlamak için bir aracınız yoktur. Yeni bir dalı sıfırlamak ve başlatmak yararlı olabilir. Hiçbir değişiklik yapılmazsa, durum yineleniyor olsa bile değişiklikleriniz büyük olasılıkla açıktır.

Sonraki adımlar