Sık Görülen Karmaşık Birleştirme Çatışmaları Bir Sorun İşareti midir?


35

Ekibimizde Git'i kaynak kontrolümüz olarak kullanıyoruz. Neredeyse bağımsız ancak birbiriyle çakışan birkaç kod alanımız var. Son zamanlarda, iş akışlarını ve kaynak kontrolünü kullanma yaklaşımlarını tartışıyoruz. Bir özellik dalı iş akışını kullanmaya başladığımda ortaya çıkan şikayetlerden biri , insanların genellikle yanlış çözdükleri karmaşık birleştirme çatışmalarıyla karşılaştıklarıdır. Karmaşık olarak, "nasıl çözüleceği belli değil" demek istiyorum. Bunun ışığında, diğer iş akışları daha aktif bir şekilde kullanılıyor, böyle bir "geri çekilme" temelli iş akışı.

Özellik dalı yaklaşımının bir savunucusu olarak, gerçekten şikayet almıyorum. Evet, yerel özellik dallarınızı ustadan veya herhangi bir yerden güncel tutmalısınız, ancak bu gördüğüm tek gerçek sorun. Birleşmeleriniz her zaman karmaşıksa ve ikincil etki yaratabiliyorsa, bunun bir Git probleminden çok bir ekip çalışması problemi olduğunu düşünüyorum.

Bunu düşünmekte haklı mıyım? Karmaşık birleştirme çatışmaları iyi ya da kötü bir şeyin işareti midir?


1
Özellikler ne kadar sürer? Kod ne kadar iyi modüler? (Örneğin), test kodundaki vişne seçiminin, fonksiyonelliğin nasıl değiştiğini görmek için (ilk önce yapıldı ve gerçek koddan ayrı, değil mi?) Kabul edermisiniz?

@MichaelT Kod tabanı, otomatik test kodu tabanımız içindir. Projemize bir miktar paralel gelişmeye ihtiyaç duyacak olan yeni bir eklemeye yönelik çalışmaya başlamak üzereyiz. Dolayısıyla özellik-dallarının tartışılması diğerleri ile tartışılmaktadır.
joshin4colours,

7
İnsanlar gerçekten bu tür bir sorunla mı karşılaşıyorlar yoksa bu sorunların ortaya çıkmasından korkuyorlar mı?
Christopher Creutzig,

2
Bu arada,
müthiş bir

1
Özellik dalını yeniden kaplamak veya gövde ile birleştirmek, benzer birleştirme ile sonuçlanır. Rebasing aslında daha fazla birleştirme yapar ve bu nedenle kötü çatışmalar yaratma olasılığı daha yüksektir. Önemli olan ne sıklıkta yapıldığı.
Jan Hudec

Yanıtlar:


23

Sorunun sizin kodunuz olması imkansız değil. Kod tabanınızın modüller arasında çok fazla birbiriyle ilişkisi varsa, her değişiklik her yerde eğilimlere sahip olacak ve her bir dev başka birinin kodu ile etkileşime girecek, bu bir kabus olacak.

Bunu önce başka yollardan farkedeceğinizi düşünmeye meyilliyim ama artık göremeyeceğiniz kadar alışıksınız.


9
Bu benim ilk düşüncemdi. Karmaşık birleştirme çakışmaları aynı kodda birden fazla değişiklik yapıldığında ortaya çıkar. Oldukça genç bir projeniz varsa, o zaman bu yaygındır, ancak eğer iyi bir kod temeli varsa, o zaman bu "tanrı nesnelerinin" bir işareti olabilir veya bazı modüllerin / sınıfların çok şey yaptığını ve yeniden yapılandırılması gerekebileceğini gösterir. Ayrıca onlarca küçük değişiklik yapan aşırı gayretli müteahhitlerden de kaynaklanabilir, ancak bu daha az yaygındır.
TMN

1
Kod tabanımızın biraz "genç" olması (yaklaşık 6 aylık, birkaç büyük refaktörden geçti) bunun bir göstergesi olabilir.
joshin4colours

10
@ joshin4colours Birisi büyük bir özellik yazarken yeniden yönlendiriyorsanız, başınız belada demektir.
Sean McSom şey

17

"Getirme-rebase-push" iş akışına alışkınım. Aslında, öğreticinizde açıklanan ilk, en ilkel iş akışıdır. İşte avantajlar:

  • Gerçek sürekli entegrasyon
  • Erken ihtilaf yönetimi - bir kişi kodu yazıp test ettikten hemen sonra
  • Hızlı tepki - "-Hey, Bob, yazdığın kübik enterpolasyon komik çıktılar veriyor, ben öğle yemeğindeyken bakabilir misin?"
  • Birleştirme işlemi yok - bir geliştirici her zaman yazmış gibi temiz zaman çizelgesi

Şimdi, karmaşık birleşme çatışmaları ile ilgili. Bir ikisi sık yaşayabilir anlamıyorum ve karmaşık birleştirmelerini. Komplikasyon uzun süre rebasing / cherry-picking işleminden, bir ay boyunca bu yalnız özellik üzerinde çalışmaktan kaynaklanıyor.

Şahsen, herşeyi kapsayan nadir birleştirme korkusu yerine sık sık, kolay birleştirme (aslında yeniden düzenleme) çatışmalarıyla uğraşmayı tercih ederim.


1
Git iş akışının harika bir açıklaması, ancak bu sorumu tam olarak cevaplamıyor.
joshin4colours,

2
@joshy bu doğru. Sadece orta paragraf türü sorunuzu çözebilir. Ancak burada doğrudan bir cevap. Birleşmenin sık ve zor olması durumunda, bu kesinlikle sorunlu iş akışı / iletişim problemi / mimarlık problemi / bölünme veya rol probleminin bir göstergesidir.
Vorac

7

Birleşmeler ve yeniden asmalar, bir insanın çözmesi gereken doğal çatışmalar için (yani aynı kod satırını değiştiren iki geliştirici) aynı çatışmalara neden olmalıdır. Diğer çatışmalar için, birleşme aslında daha temiz olma eğilimindedir, çünkü her yerde SHA-1'i değiştirmiyorsunuz. Birleşmelerin yeniden doğuştan daha fazla çatışmaya neden olduğu bir duruma girmeyi nasıl başardığınızdan emin değilim, ancak bu kesinlikle bazı insanların iş akışının berbat olduğu ve muhtemelen nasıl çalıştığı konusunda daha fazla eğitime ihtiyaç duyduklarının bir işareti. Yerel yeniden doğuşlarını veya benzeri bir şeyi yaparken başkalarının birleşme taahhütlerini kaldırıyorlar mı?

Pull-rebase yönteminin yararı ve dezavantajı, birçok insanın kullanıldığı merkezi iş akışlarına çok benzemesidir. Kullanmak için dallanmayı anlamak zorunda değilsiniz.

Her halükarda, başkalarının oturum açmasını sağlayamazsanız, özellikli şube iş akışını yalnızca yerel olarak yapmak kesinlikle mümkün.


5

Üzerinde çalıştığım proje zaman zaman bu tür bir problem yaşıyor ve birkaç faktörden kaynaklanıyor gibi görünüyor:

  • Visual Studio kullanıyor ve Visual Studio. çok kötü birleştirilir ve dosyaların kaybolmasına neden olur.
  • Bazı insanlar kodun benzer alanlarında çalışıyorlar, bu yüzden itilen değişikliklerin hemen yanında sınıflarda olabilirler. Bu durumda kaçınılmaz olmasına rağmen, bu tür bir yapılandırma, herhangi bir kaynak kontrol sistemi için çok zor olacak. Ekibinizde iyi iletişim kursanız bile, bazen insanlar birbirlerinin kodlarına çarptıklarının farkına varamaz ve çatışmalar ortaya çıkar.

Anlamsal Birleştirme'nin bu sorunların bazılarına yardımcı olma potansiyeli ile ilgileniyorum , ancak açıkçası bu yalnızca ayrıştırılabilecek bir dilde çalışıyorsanız ve henüz ne zaman önemli bir sorunla karşılaşmadım. kullanıyorum, bu yüzden etkinliği için kefil olamam.


4

Geliştiriciler, tarihsel taahhütleri (saf birleştirme yerine) değiştirmiyorsa, özellik iş akışı türü git modelindeki çakışmalar, sıkı bir şekilde birleştirilmiş kod temeli (/ brandnew kod temeli) veya örtüşen özellik atamasının bir işaretidir.


0

Bir ana (ana) dalınız var ve herkes kendi özellik dallarında çalışıyor.

Özellik dallarında çalışmak birkaç saatten birkaç aya kadar sürebilir.

Her şimdi ve sonra birileri değişiklik setlerini ana şubeye geri döndürecek. Takım liderinizin bir seferde yalnızca bir kişinin tersine birleştiğinden emin olması gerekir. Bu yapıldıktan sonra, birleştirme işlemini Ana daldan özellik dalınıza iletmeniz gerekir. Herkes ileri doğru birleştirme yaptığında, başka bir kişinin birleştirme işlemini ana şubeye tersine çevirmesine izin verilebilir. Aksi takdirde, çok fazla değişiklik ters birleşti- rilecek ve ileri birleştirme işleminizde tonlarca birleştirme çatışmaları olacak.

Sadece terminolojiyi açıklığa kavuşturmak için "ters birleştirme" ile özellik dalından ana dalı birleştirmeyi ve "ileri doğru birleştirme" anlamına gelmesini ana daldan özellik dalına birleştirmeyi kastediyorum. Daha önce deneyimlediklerime dayanarak, ileri birleştirme yerine, ters birleştirme konusunda daha fazla birleştirme çatışması göreceksiniz.


1
Ana şubeyle birleşme hiçbir zaman bir çelişki yaşamamalıdır. Her zaman ana özelliği ilk önce birleştiğinden, ana özelliği değiştirdikten sonra çakışma olmaz.
gnasher729

@ gnasher729 - Bence bu cevabın söylediği şey - benim gördüğüm gibi öneri, her geliştiricinin anadan özellik dallarına kadar her şeyi birleştirmesi, herhangi bir şeyi anaya teslim etmesi, böylece tüm çatışmaların anında özellik dallarında çözülmesi.
Periata Breatta


0

Yardımcı olabilecek iki şey: Birincisi, kendi başlarına değişiklik yapan araçlardan kaçının. Farklı sekme ayarları kullanan iki geliştirici felaket için bir reçetedir. İkincisi, farklı yerlerde değişiklikler yapın. Örneğin, üç geliştirici aynı dosyanın sonuna kod eklerse sorun yaşarsınız - farklı yerlerde kod eklerlerse çok daha iyidir.

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.