Dahili veri modelleri temelde farklıdır.
Temel olarak, SVN'de bir dalın geçmişine baktığınızda, yalnızca o dalda ne olduğunu görürsünüz. Eğer şubesinden birleştirdiğinizde Yani B
dalına A
, dal tarihinin A
tüm açıkça yapılan değişiklikleri içeren kesinleştirme büyük bir içerecektir B
o kollara beri.
SVN'nin ilk sürümlerinde, B
dalı bir A
kez daha birleştirmek zorunda B
kalırsanız, aynı düzeltmeleri iki kez birleştirmekten kaçınmak için hangi şube aralığını birleştirmek istediğinizi elle belirtmeniz gerekir . Akıllı geliştirici elbette 'B: 1234'te Birleşti' gibi bir taahhüt mesajı kullanır.
SVN 1.5 bunu "sabitledi". Ancak birleşmelerin temelde nasıl uygulandığını değiştirmedi. Sadece şubeye bazı ekstra meta veriler ekleyerek A
, SVN'nin 1234 revizyonunun birleştiğini bilmesini sağlayarak SVN'nin otomatik olarak doğru revizyon aralığını seçmesine izin verdi.
Ancak bu çözüm temelde birleştirilenleri takip etmeyi desteklemeyen bir veri modeli için geçici bir çözümdür.
İki dalı birleştirmek oldukça basit bir örnektir. Ancak bu daha karmaşık senaryoyu görüntüleme
- Şube oluşturma
A
gelen trunk
ve burada birkaç hareketin yapmak
- Şube oluşturma
B
gelen A
ve burada bir kaç hareketin yapmak
- Birkaç taahhüt
trunk
ve yapmakA
B
İçine birleştirmektrunk
A
İçine birleştirmekB
A
İçine birleştirmektrunk
- Birleştirme
B
içine trunk
(bu aslında şey yapmamalıyız)
Bunu doğru kullanarak meta veri modelini kullanmak oldukça karmaşık bir hal alıyor (SVN'nin bu senaryoyu doğru bir şekilde yerine getirip getirmediğini bilmiyorum ve denemeye meyilli değilim).
Bu senaryoyu git'te kullanmak son derece basittir.
Git'te, her işlem yaptığınızda, bu işlemi temsil eden iç nesne önceki başa bir başvuru içerir. Bir dalda birleştiğinizde, birleşme, birleştirilmekte olan tüm dalların önceki başkanına referanslar içerir (git'te bir seferde birden fazla dalda birleştirme yapabilirsiniz)
Bu nedenle, git'teki tek bir taahhüdün geçmişini incelediğinizde tüm tarihi görebilir, dallandığını, ne zaman birleştirildiğini ve dallanma ile birleşme arasındaki her iki dalın tarihini görebilirsiniz.
Dolayısıyla, kısmen birleştirilen bir dalda birleşme işlemi yapıldığında, ne birleştirildiğini ve neyin ayrılmayacağını belirlemek son derece basittir.
Mercurial ile hiçbir deneyimim yok, ancak iç çalışmalarının git ile benzer olduğundan şüpheliyim.
Temel olarak, SVN için, dallanmayı ucuz hale getirmek için bir tasarım hedefi oldu. Ancak git, birleştirmeyi ucuz hale getirmek için bir tasarım hedefi oldu.
Son olarak, SVN'yi en son kullandığımda, bir dosyanın bir dalda yeniden adlandırıldığı ve diğerinde değiştirildiği birleştirme işlemlerini gerçekleştiremedi.