Mercurial'de dallanma ve birleştirme Subversion'dan neden daha kolay?


92

Subversion veya CVS'deki dallarda birden fazla birleşmeyi yönetmek, deneyimlenmesi gereken şeylerden sadece bir tanesidir. Mercurial'de (ve muhtemelen başka herhangi bir dağıtılmış sistemde) şubeleri ve birleşmeleri takip etmek aşırı derecede daha kolay ama nedenini bilmiyorum. Başka bilen var mı?

Sorum, Mercurial ile Subversions / CVS'lerin merkezi deposuna benzer bir çalışma uygulamasını benimseyebileceğiniz ve her şeyin gayet iyi çalışacağı gerçeğinden kaynaklanıyor. Aynı dalda birden fazla birleştirme yapabilirsiniz ve commit numaraları ve etiket adlarıyla sonsuz kağıt parçalarına ihtiyacınız olmayacak.

Subversion'ın en son sürümünün şubelerle birleşmeleri izleme yeteneğine sahip olduğunu biliyorum, bu yüzden aynı derecede güçlük çekmiyorsunuz, ancak bu onların tarafında çok büyük ve büyük bir gelişmeydi ve hala geliştirme ekibinin yapacağı her şeyi yapmıyor yapmaktan hoşlanıyorum.

Hepsinin çalışma biçiminde temel bir fark olmalı.

Yanıtlar:


115

Subversion'da (ve CVS'de) depo her şeyden önce gelir. Git ve mercurial'da aynı şekilde bir depo kavramı yoktur; buradaki değişiklikler ana temadır.

+1

CVS güçlük / SVN bu sistemler yok olmasından kaynaklanır değil değişikliklerin ebeveynliğini hatırlıyorum. Git ve Mercurial'de, bir commit birden fazla çocuğa sahip olmakla kalmaz, aynı zamanda birden fazla ebeveyni de olabilir!

Bu, grafik araçlardan birini kullanarak kolayca gözlemlenebilir gitkveya hg view. Aşağıdaki örnekte, 2 numaralı dal, A işleminde # 1'den çatallanmıştır ve o zamandan beri bir kez birleştirilmiştir (M'de, B işlemiyle birleştirilmiştir):

o---A---o---B---o---C         (branch #1)
     \       \
      o---o---M---X---?       (branch #2)

A ve B'nin iki çocuğu varken M'nin iki ebeveyni olduğuna dikkat edin . Bu ilişkiler bilgi havuzuna kaydedilir . Diyelim ki, 2 numaralı şubenin geliştiricisi şimdi 1 numaralı şubedeki en son değişiklikleri birleştirmek istiyor, aşağıdaki gibi bir komut verebilir:

$ git merge branch-1

ve araç otomatik olarak tabanın B olduğunu bilecektir - çünkü 2 numaralı ipucunun atası olan M işleminde kaydedilmiştir - ve B ile C arasında olanları birleştirmesi gerektiğini CVS bu bilgiyi kaydetmez. , SVN de 1.5 sürümünden önce değildi. Bu sistemlerde grafik şöyle görünür:

o---A---o---B---o---C         (branch #1)
     \    
      o---o---M---X---?       (branch #2)

burada M bir dev senet bittikten sonra, olduğu, M. Not üzerine uygulanan, A ve B arasındaki olanlardan, bir tamamlama "ezilmiş" hiç bir iz E burada (potansiyel insan tarafından okunabilir yorumlar hariç) ne kaynaklandığını, ne de kaç işlemin birlikte çökertildiğini - tarihi çok daha anlaşılmaz hale getiriyor.

Bir birleştirme taban ilk birleştirme sırasında ne olduğunu anlamaya sahiptir (ve bir: Daha da kötüsü, ikinci birleştirme gerçekleştirirken bir kabus haline sahiptir için biliyorum ilk etapta bir birleştirme yaşandığını!), O zaman mevcut A..B'yi M'nin üzerine tekrar oynatmaya çalışmaması için araca bilgi verin. Yakın işbirliği içinde çalışırken tüm bunlar yeterince zordur, ancak dağıtılmış bir ortamda kesinlikle imkansızdır.

(İlişkili) bir sorun şu soruyu yanıtlamanın bir yolu olmamasıdır: "X, B içerir mi?" burada B, potansiyel olarak önemli bir hata düzeltmesidir. Öyleyse, neden birleştirme zamanında bilindiği için bu bilgiyi commit'e kaydetmeyelim !

P.-S. - SVN 1.5+ birleştirme kayıt becerileriyle ilgili deneyimim yok, ancak iş akışı dağıtılmış sistemlerden çok daha yaratıcı görünüyor. Eğer gerçekten durum böyleyse, muhtemelen - yukarıdaki yorumda belirtildiği gibi - odak, değişikliklerin kendisinden ziyade depo organizasyonuna konulduğu içindir.


6
SVN 1.5+, içerdiği birleştirilmiş işlemleri listeleyen M birleştirme kaydına bir SVN özelliği koyar, başka bir deyişle AB. Yani aynı bilgilere sahipsiniz.
Simon D

Biraz. Teknik olarak, SVN'nin birleştirme takibi, Git'in "kiraz toplama" dediği şeye benzer ve kullanıcıyı daha kolay hale getirmek için ek bir sihir içerir; anlamsal olarak Git, Hg ve Bzr'nin birleştirme sırasında yaptıklarından farklıdır. DAG'yi ( eagain.net/articles/git-for-computer-scientists ) umursamadığınız sürece pratikte pek bir fark yaratmayacağını tahmin ediyorum .
Damien Diederen

2
+100 düğmesi olmadığı için yazıklar olsun Teşekkürler.
Charlie Flowers

Bahsettiğiniz SVN 1.5 özelliği svn:mergeinfomülkün kullanımı mı?
MatrixFrog

@MatrixFrog: Evet, ne işe yarıyor svn:mergeinfo.
sleske

12

Çünkü Subversion (en azından sürüm 1.4 ve altı) birleştirilenleri takip etmiyor. Subversion için, birleştirme temelde herhangi bir commit ile aynıdır ve Git gibi diğer sürüm kontrollerinde birleştirilenler hatırlanır.


7

Halihazırda verilen cevapların hiçbirinden etkilenmeyen Hg, değişiklikleri birleştirirken daha fazla bilgi kullandığı için üstün birleştirme yetenekleri sundu ( hginit.com ):

Örneğin, bir işlevi biraz değiştirir ve sonra başka bir yere taşırsam, Subversion bu adımları gerçekten hatırlamaz, bu nedenle birleştirme zamanı geldiğinde, birdenbire yeni bir işlevin ortaya çıktığını düşünebilir. . Oysa Mercurial bunları ayrı ayrı hatırlayacaktır: işlev değişti, işlev taşındı; bu, bu işlevi de biraz değiştirirseniz, Mercurial'in değişikliklerimizi başarılı bir şekilde birleştirmesi çok daha muhtemel olduğu anlamına gelir.

Elbette, en son neyin birleştirildiğini hatırlamak (burada verilen cevapların çoğunda değinilen nokta) da büyük bir kazançtır.

Bununla birlikte, 1.5+ subversion, ek birleştirme bilgilerini yıkım özellikleri biçiminde depoladığından her iki iyileştirme de sorgulanabilir: bu bilgi mevcut, subversion birleştirmenin Hg veya Git kadar başarılı bir şekilde birleştirme gerçekleştirememesinin açık bir nedeni yok. Yine de öyle mi bilmiyorum, ama kesinlikle yıkıcı geliştiriciler bu sorunu aşma yolunda gibi görünüyor.


4

Sanırım bu kısmen Subversion'ın merkezi bir sunucu fikrine ve mutlak bir revizyon zaman çizgisine sahip olmasından kaynaklanıyor olabilir. Mercurial gerçekten dağıtılır ve mutlak bir zaman çizgisine böyle bir referansı yoktur. Bu, Mercurial projelerinin alt projeye göre özellikler ve test döngüleri eklemek için daha karmaşık dallar hiyerarşileri oluşturmasına izin verir, ancak ekiplerin güncel kalmak için artık çok daha aktif bir şekilde birleştirmelerin üstesinden gelmeleri gerekir, çünkü güncellemeye ulaşıp onunla yapılamazlar. .


3

Subversion'da (ve CVS'de) depo her şeyden önce gelir. Git ve mercurial'da aslında aynı şekilde bir depo kavramı yoktur; buradaki değişiklikler ana temadır.

Her ikisini de nasıl uygulayacağınız konusunda pek düşünmedim ama benim izlenimim (acı deneyime ve bolca okumaya dayalı olarak), depo tabanlı olmayan sistemlerde birleştirme ve dallanmayı çok daha kolay hale getiren bu fark olduğu.


1

Yalnızca Subversion ile deneyimim var, ancak TortoiseSVN'deki birleştirme ekranının korkunç derecede karmaşık olduğunu söyleyebilirim. Neyse ki, doğru yapıp yapmadığınızı görebilmeniz için bir kuru çalıştır düğmesi içerirler. Karmaşıklık, nerede birleştirmek istediğinizin konfigürasyonunda. Birleştirme için bu ayarı aldıktan sonra, birleştirme genellikle iyi gider. Daha sonra tüm çatışmaları çözmeniz ve ardından birleştirilmiş çalışma kopyanızı depoya kaydetmeniz gerekir.

Mercurial birleştirme konfigürasyonunu kolaylaştırabilirse, Subversion'dan% 100 daha kolay birleştirme yapacağını söyleyebilirim.

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.