Aracılığıyla paylaş


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 yorumlar ve tartışmalar, konu dalında yapılan değişikliklere daha fazla bağlam sunar.

Pull request'ten normal birleştirme örneği.

İlgili konu dalının geçmişi nedeniyle, main dalınızdaki (veya diğer varsayılan daldaki) işleme geçmişi 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.

Önkoşullar

Kategori Gereksinimler
Proje erişimi projesiüyesi.
İzinler - Özel projelerde kodu görüntüleme: En az Temel erişimi.
- Özel projelerde kodu klonlama veya katkıda bulunma: Projede Katkıda Bulunanlar güvenlik grubuna üyelik veya ilgili izinler.
- Dal veya depo izinlerini ayarlayın: izinleri yönetin dal veya depo için.
- Varsayılan dalı değiştir: Depo için politika izinlerini düzenleyin.
- Depoyu içeri aktarma: Proje Yöneticileri güvenlik grubunun üyesi veya Git proje düzeyi Depo oluşturma izni İzin verolarak ayarlanmıştır. Daha fazla bilgi için bkz . Git deposu izinlerini ayarlama.
Hizmetler Repo'lar etkinleştirildi.
Araçlar Opsiyonel. az repos komutlarını kullanın: Azure DevOps CLI.

Uyarı

Genel projelerde, Paydaş erişimi olan kullanıcılar, kod görüntüleme, kopyalama ve koda katkıda bulunma dahil olmak üzere Azure Depolarına tam erişime sahiptir.

Kategori Gereksinimler
Proje erişimi projesiüyesi.
İzinler - Kodu görüntüle: En az Temel erişim.
- Kodun bir kopyasını oluşturma veya koda katkıda bulunma: Katkıda Bulunanlar güvenlik grubunun üyesi veya projedeki ilgili izinlere sahip olma.
Hizmetler Repo'lar etkinleştirildi.

Sıkıştırarak birleştirme

Squash birleştirme, bir çekme isteğini tamamladığınızda, konu dallarının Git geçmişini sıkıştırmanıza olanak tanıyan birleştirme seçeneğidir. Konu dalındaki her işlemeyi varsayılan dalın geçmişine eklemek yerine, squash birleştirmesi tüm dosya değişikliklerini varsayılan daldaki tek bir yeni işlemeye ekler. Squash birleştirme işlemi, konu dalına bir başvuru içermez. Konu dalındaki tüm değişiklikleri içeren yeni bir işleme oluşturur. Karışıklığı önlemek için konu dalını silmenizi öneririz.

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 tutar ve takip etmeyi kolaylaştırır. Katkıda bulunanlar, konu dalında istedikleri şekilde çalışır, ve varsayılan dallar, squash birleşimleri kullanarak doğrusal bir geçmiş tutar. Squash birleştirmeleri ile güncelleştirilen bir main dalını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 konu dalının tam işleme geçmişini korumak yerine ne zaman squash birleştirme yapacağınıza 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ı varsayılan dal ile birleştirilmediği için karışıklığı önler.

Çekme isteklerini squash birleştirme yöntemiyle tamamlama

Azure Repos'ta bir çekme isteğini tamamlarken squash birleştirme seçeneğini tercih edebilirsiniz.

Konu dalını squash birleştirmek için, Tamamlama çekme isteği iletişim kutusunda Birleştirme türü altında Squash işleme seçeneğini seçin.

Azure Repos'ta sıkıştırarak birleştirme işlemiyle çekme isteğini kapatma işleminin ekran görüntüsü.

Birden çok birleştirme tabanı

Çekme isteğindeki Dosyalar sekmesi, üçlü karşılaştırma ile farkları algılar. Algoritma, hedef daldaki son işlemeyi, kaynak daldaki son işlemeyi ve bunların ortak birleştirme temeli(örneğin, en iyi ortak atası) 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 git merge-base --all feature master komutunu çalıştırın. Azure DevOps, her bir ç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ı. Çekme isteği (PR) için görüntülenen işlem listesi 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 git merge-basetarafından yapılır. Bu nedenle Azure DevOps, git merge-base yalnızca bir birleştirme tabanı raporladığında bile iletiyi görüntüleyebilir.

Uyarı

Çekme isteği incelemesi sırasında değişikliklerinizi kaybettiyseniz, birden fazla birleştirme tabanının temel sebep olmadığından emin olun.

Aşağıdaki örnek senaryolar Azure DevOps tarafından birden çok temel olarak algılanmıştır ve birleştirme tabanları bir ve iki sayıyla gösterilir:

  • Farklı dallar arasında çapraz geçişler (Azure DevOps ve git merge-basetarafından bildirilen, çapraz birleştirme olarak da bilinen)
---1---o---A
    \ /
     X
    / \
---2---o---o---B
  • Bir branşın diğer iki branşla birleştirilmesi (Azure DevOps tarafından bildirilmiştir, ancak birleştirme tabanı 2'yi ortadan kaldıran git merge-base tarafından bildirilmemiştir)
---1---o---o---o---A
    \         /
     \-------2
      \       \
       \---o---o---o---B
  • Ana dal geri alma işlemlerinin 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, seçici seçmeler ve birleştirmelerle diğer sezgisiz ve karmaşık 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 tabanları arasında farklı sürümler varsa, birden fazla birleştirme tabanı uyarısı oluşur.

Diğer ayrıntılar için resmi git belgeleri gözden geçirin.

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

  • Kötü amaçlı bir kullanıcı, çekme talebinde yer almayan kötü amaçlı değişiklikler yapmak için kullanıcı arabirimi algoritmasını kötüye kullanabilir.
  • Çekme isteğinde önerilen değişiklikler zaten hedef daldaysa, bunlar Dosyalar sekmesinde görüntülenir, ancak klasör değişiklikleriyle ilişkili dal ilkelerini tetiklemeyebilirler.
  • 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.

Çoklu birleştirme temeli sorunu nasıl çözülür?

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 temelinden kurtulmak için, dalınızı hedefe yeniden konumlandırarak veya hedefi dalınızla birleştirerek dalları tek bir ortak ataya 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 oradaysa uzak sunucuya zorla göndermenizi gerektirebilir.

Birden çok birleştirme temeli sorununu önlemek

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

  • Pull isteği hazırlarken ana veya yayın dalının en son sürümlerinden feature branch oluşturun.
  • Gerekli olmadığı sürece, doğrudan deponuzun kararlı dallarından başlamayan dallar oluşturmaktan kaçının.

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

Birçok aktif katkıda bulunana sahip büyük depolarda bu sorun özellikle rahatsız edici 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 meydana gelebilir. Derleme ilkeleri ve testleri çalıştırılıyor olsa da, çekme isteğini tamamlamak için imkanınız yok. 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