Visual Studio'da 1 yıllık geliştirme birleştirme stratejileri


32

2016 yılının tamamı için yeni gelişimimizi ana branşlardan ayrı tutmamızda ısrar eden bir müşterim var. Uygulamada çeşitli kapasitelerde çalışan 3-4 başka ekip daha vardı. Çok sayıda büyük değişiklik yapıldı (bağımlılık enjeksiyonunun nasıl yapıldığının değiştirilmesi, ReSharper ile kodun temizlenmesi vb.). Şimdi değişikliklerimizi zinciri yukarı itmek için hazırlanmak için yeni dev şubemizin ana birliğini birleştirmek bana düştü.

İlk birleştirme çekmemde, TFS, çakışma çözümlemeli ~ 6500 dosya bildirdi. Bunlardan bazıları kolay olacak, ancak bazıları çok daha zor olacak (özellikle javascript, api denetleyicileri ve bu denetleyicileri destekleyen hizmetler).

Bunu benim için kolaylaştıracak bir yaklaşım var mı?

Açıklığa kavuşturmak için, bu yaklaşımla ilgili birçok kez endişelerimi dile getirdim. Müşteri bununla ilgili zorlukların farkındaydı ve farkındaydı. KG personelini kısalttıklarını seçtikleri için (4 dev için 1 test cihazı, otomatik test yok, küçük regresyon testi), şubemizi ana şubedeki değişikliklerden izole etmemiz konusunda ısrarcı olduklarını iddia etti. başka yerlerde yapılan değişiklikleri bilmek.

Buradaki en büyük sorunlardan biri, açısal versiyona ve diğer bazı üçüncü parti yazılımlara yapılan bir yükseltmedir - ne yazık ki, tüm parçaları tekrar yerine getirene kadar bu çözümü oluşturmak için iyi bir yol bulamadık.


63
Hayır! Bir yıl boyunca aktif olarak geliştirilen iki ayrı kolunuz var. Birleştirme berbat olacak.
17

2
Takımınızın yaptığı değişikliklerin kapsamı nedir? Bu değişiklikleri tanımlamak ve daha sonra bunları geçerli ana kod tabanına yeniden uygulamak daha etkili olabilir.
kdgregory,

2
2015 ya da 2016'nın tamamı mı? 2015, 2 yıl ise, bu iki kat emmek anlamına gelir.
David, 22: 53'te Monica

1
Müşteri, onlar için yaptığınız işin sürüm kontrol sisteminizde ayrı bir branşta olmasına neden dikkat ediyor?
Ixrec

17
Ne yaparsanız yapın, saatlik olarak faturalandırma yaptığınızdan emin olun.
Sean McSey

Yanıtlar:


37

Sizi bu talihsiz duruma sokmadan yeni gelişmenizi ana branştan ayrı tutmanın basit bir yolu olurdu : Sandıktaki herhangi bir değişiklik günlük olarak dev şubenizde birleştirilmeliydi . (Müvekkiliniz, şubenizin bir gün ana hattına geri dönmesi gerektiğini öngöremediği için gerçekten yetersiz kaldı mı?)

Her neyse, en iyi yaklaşım IMHO'nun ilk elden ne olması gerektiğini yinelemeye çalışıyor:

  • Şube kurulduktan sonraki ana hattaki değişikliklerin anlamını 1. gün için tanımlayın . Bunları mümkün olduğu kadar geçerli kod tabanınıza uygulayın. Eğer bu bir "yerel değişiklik" ise, basit olmalı, yaygın olarak kullanılan bir sınıfı yeniden adlandırmak gibi bir "çapraz kesim yeniden düzenleme" ise, bunu geçerli kod tabanınıza anlamsal olarak eşit şekilde uygulayın. İnşallah o yıl boyunca “temel” şubenizde kod tabanında çelişkili hiçbir çapraz değişiklik yapılmadı, aksi takdirde bu gerçek bir zekâ haline gelebilir
  • sonucu test et (bu görev için iyi bir test odasına ihtiyacın olduğunu söylemiş miydim)? Testin ortaya çıkardığı tüm hataları düzelt
  • Şimdi bu işlemi ana hattaki değişiklikler için 2. gün, 3. gün vb. için tekrarlayın.

Bu, takımlar klasik versiyon kontrol kurallarına ("sadece derlenebilir, test edilmiş durumları yerine getir" ve "erken ve sık kontrol et") kesinlikle uyduğunda işe yarayabilir.

365 kez tekrarladıktan sonra (veya 250, eğer şanslıysanız ve hafta sonu değişiklikleri için çalışmayı paketleyebiliyorsanız), neredeyse bitmiş olacaksınız (neredeyse çünkü entegrasyon döneminde ana hatta olacak değişikliklerin sayısını eklemeniz gerekecek) ). Son adım, güncellenmiş dev şubesini tekrar bagajda birleştirmektir (böylece bagajın geçmişini kaybetmezsiniz). Bu kolay olmalı, çünkü teknik olarak sadece etkilenen dosyaların yerine geçmelidir.

Ve evet, ben ciddiyim, muhtemelen bunun için bir kısayol yoktur. “Günlük porsiyonların” bazen çok küçük olabileceği ortaya çıkabilir, ancak bunu beklemem, belki günlük porsiyonların arı yetiştiriciliğinin çok büyük olabileceği daha muhtemel. Umarım müvekkiliniz size bunun için çok iyi para öder ve bu onun başarısızlığından öğreneceği için çok pahalı.

Şunu da eklemeliyim ki, bunu da değiştirilmiş taraflarla da deneyebilirsiniz - şubenizdeki değişiklikleri küçük parçalarda ana hatta yeniden entegre edin. Bu, dev şubenizde, bagajda olduğundan çok daha az değişiklik olduğunda veya değişikliklerin çoğu, şu anda bagajın bir parçası olmayan yeni kaynak dosyalarında gerçekleştiğinde daha kolay olabilir. Bunu, bir özelliği A ürününden (dev dalı) biraz farklı bir ürün B'ye (bagajın şu anki durumu) bir özelliği "taşıma" olarak görebilir. Ancak, çapraz kesim refactorlarının çoğunluğu ana hat üzerinde yapıldıysa ve yeni kodunuzu etkilediler (6500 birleştirme çakışmaları bunun için bir kanıt gibi görünüyorlarsa), önce tarif ettiğimden daha kolay olabilir.


9
Yeniden entegrasyon sırasında gövde üzerinde gelişmeye devam ediyorsanız, önce ana ipucunu dallamanızı ve bundan geliştirmenizi öneririm. Aksi takdirde, geçmişi ve geleceği aynı anda etkili bir şekilde birleştirirsiniz. Ama doğal olarak herhangi bir uzay-zaman süreksizlikinde Doktor Brown'a erteliyorum.
radarbob,

1
@ radarbob: Önerdiğin şey, yalnızca OP'nin devten gövdeye entegrasyonu halinde, ancak ilk önce tarif ettiğim gibi gövdeden deve birleşmeye karar verdiğinde bir anlam ifade etmez. OP, günden güne (geçmişte 365 gün değişikliklerle başlayan) gün geçtikçe değişikliklerini dev şubesinden dev şubesine aktarırsa, gövdede gelişme devam edip etmeyeceği önemli değildir. Şimdiye kadar bu taktikleri sürdürmesi gerekecek (bu 3-4 takımın değişikliklerini bir günden az bir günde bir günde bütünleştirip test edebileceğini varsayar).
Doktor Brown

Alıntı: “Bunu ayrıca değiştirilmiş taraflarla da deneyebileceğinizi de eklemeliyim - şubenizdeki değişiklikleri günlük paketlerde ana hatta yeniden entegre etmek. ” Spidey anlayışım sigorta atıyor. Çelişkili değişim entegrasyonlarıyla potansiyel bir "harmonik rezonans bozulma" kademesini hissediyorum.
radarbob

Bu iyi bir tavsiye. Burada birkaç şeyi ele almak için düzenlemeye bakın.
kullanıcı258451

1
@ user258451: yani bagaj için farklı QA ekipleriniz ve birbirinizle konuşmak istemediğiniz yeni dev şubeniz oldu mu? Büyük Scott: - ((
Doc Brown

14

Birleşmenin bu aşamasında, otomatik birleştirme işleminin yalnızca süreci zorlaştırdığını söyleyebilirim. Bir yılı aşkın bir süredir ayrılan şubelerle benzer sorunlar yaşadım ve sahip olduğum en etkili yöntem aşağıdakileri yapmak:

  • Orijinal değişmemiş durumun bir kopyasını alın
  • Unmerged ile en son arasındaki fark
  • Ortak öğeleri bozma
    • Örneğin, tüm işlev adı değişiklikleri, ardından parametre değişiklikleri vb.
    • Standartlar değiştiyse fark üzerinde beyaz boşluk yoksay, aksi takdirde çok fazla zaman harcayacaksın
  • Önce çekirdek işlevine odaklanın

Sonunda derleyici uyarıları ve farklar senin en iyi arkadaşların olacak, tam olarak neyin farklı olduğunu görmek için devam etmeyen farkları kullanmaya devam et. Yardım etmek için kullanabileceğiniz çeşitli araçlar olabilir, ancak hangisinin en iyisi olduğunu bulmak size bağlı olacaktır.

Anahtar devam etmektir.

Düzenle:

Bir uyarı kelimesi, bu yaklaşım, şube-şube birleşmesinin yanı sıra dallanmamış dalın geçmişinin kanıtlarını yitirdiğiniz için sürüm kontrol geçmişinin 'bozulacağı' anlamına gelecektir.

'Jack Aidley' ve '17 of 26 'yorumlarına teşekkürler


1
Bu yaklaşımla ilgili en büyük sorun, sürüm kontrol sisteminde kalan değişikliklerin kaydını yok etmesidir.
Jack Aidley

Temelde birleştirme sırasında aynı değişikliklerin hepsini ikinci kez yaparak, hala bir değişiklik günlüğüne sahip olacaktınız, sadece geliştirme sırasında yaptıkları emir yerine birleştirme işleminde olacaktı. İdeal değil, hiç yoktan iyidir. Artı, sürüm kontrolünde tutulmuş olsaydı, hala orijinal durumda kalmamış olacaktın.
Erdrik Ironrose

Değişikliklerin bir günlüğüne sahip olabilirsiniz, ancak değişikliklerin şubeden şubeye birleştirildiğine dair tarihsel bir kanıtınız olmazdı. Bu, şubeden şubeye birleştirirken seçim yapabileceğiniz yalnızca değiştirilmemiş değişiklik kümelerini sunan TFS'de çok büyük bir fırsat olacaktır.
26

@ 17of26 Bazı değişiklik kaydını geri yükleyebileceğinizi kabul ediyorum, ancak 26 kişiden 17'si bu kaydın tamamlanamayacağının doğru olduğunu doğruladı. Bu yaklaşım, şu an içinde bulundukları kötü durum göz önüne alındığında, bu kayıt kaybını kabul edilebilir bir uzlaşma haline getirmek için yeterince kolay olabilir. Ancak, ne karar verdiklerinden bağımsız olarak tanımanın önemli bir dezavantajı olduğunu düşünüyorum.
Jack Aidley

1
@Jack Aidley Kesinlikle sorun olduğuna katılıyorum, bu yüzden cevabımı yansıtması için biraz ekledim. Umarım bu tamamdır?
Erdrik Ironrose,

8

Birkaç yıl önce şubeleri ayrı tutmanın aynı şartlarına sahip bir müşterimiz vardı. Öyleyse yaptık.

Şubelerini asla geri bağlamadık. Onların kendine özgü bir versiyonları vardı. Temelde 1 ana gövde ve dallar yerine iki ana gövdemiz olduğundan, değişiklikler için ekstra ücret aldık.

Gövde ile tekrar birleşmeye çalıştık, ancak 2 hafta sonra somut faydaları olmayan saatlerce süren bu çabayı bırakmaya karar verdik.

Öyleyse tekrar birleştirme. İleriye gitmek, bu müşteri branşında kritik düzeltmeleri gerektiği gibi birleştirir ve geliştirmeler, söz konusu müşteriye özel olarak yüklenir.


Bu strateji, yalnızca farklı gelişim çizgileri farklı müşterileri hedefliyorsa mümkündür. Veya, ürünün dahil olduğu kullanım durumları, iki farklı ürün hattının bütünleşik olmayan şekilde paralel olarak kullanılmasına izin veriyorsa. Anladığım kadarıyla, OP yeni gelişim hattının gövdeyi kullanan müşteri ile aynı müşteriyi hedeflediği ve iki ürün hattının paralel kullanımının durumu için bir anlam ifade edip edemeyeceği net değildir.
Doktor Brown,

1

Eğlenceli olmayacak, ama ne kadar acı verici olacağı değişimlerin doğasına ve ne kadar yalıtılmış olduklarına bağlı.

Gerçek bir birleştirme yapmadan önce dalları yeniden mümkün olduğunca yeniden birleştirmeye çalışmanızı öneririm .

Birleştirme aracı biraz aptalca çünkü yalnızca metinsel farklılıklara bakıyor ve kodu hiçbir şekilde anlamıyor. Ana dal uygulama boyunca kullanılan bir sınıfın adını değiştirdiyse ve özellik dalı bazı yeni kodlarda eski adı kullanıyorsa, birleştirme aracı sınıf adının da yeni kodda değiştirilmesi gerektiğini anlamaz. Ancak, B dalında yeniden sınıflandırma yaparsanız, A dalında olduğu gibi sınıfı yeniden adlandırmak için eski ve yeni kodlarda çalışır ve birleştirme sorunsuz çalışır.

İkincisi, gelişim alanındaki değişikliklerin ne kadar yerel olduğunu incelemelisiniz. Özellik dalındaki değişiklikler birkaç alana yerelleştiriliyorsa, etkilenmeyen kodu birleştirmeniz gerekmez, ana daldan kopyalayıp üzerine yazabilirsiniz.

Her iki dalda da önemsiz değişikliklerin olduğu kodlu alanlarda, kodu dikkatlice incelemeniz ve nasıl yeniden yazacağınıza karar vermeniz gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.