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 main
varsayı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.
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.
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.
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-base
yapı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-base
bildirilir)
---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.