Почему ветвление и слияние легче в Mercurial, чем в Subversion?



обработка нескольких слияний на ветви в Subversion или CVS-это только одна из тех вещей, которые нужно испытать. Чрезвычайно легко отслеживать ветви и слияния в Mercurial (и, вероятно, в любой другой распределенной системе), но я не знаю, почему. Кто-нибудь еще знает?



мой вопрос связан с тем, что с ртутный вы можете принять рабочую практику аналогичных диверсий/CVSs центрального репозитория и все будет работать нормально. Вы можете сделать несколько слияний в одной ветке, и вам не понадобятся бесконечные клочки бумаги с номерами фиксации и именами тегов.



Я знаю, что последняя версия Subversion имеет возможность отслеживать слияния в ветвях, поэтому вы не получаете совершенно такую же степень хлопот, но это была огромная и крупная разработка на их стороне, и она все еще не делает все, что команда разработчиков хотела бы сделать.



должно быть фундаментальное различие в том, как все это работает.

634   6  

6 ответов:

в Subversion (и CVS) репозиторий-это в первую очередь. В git и mercurial на самом деле нет концепции репозитория в точно так же; здесь изменения являются центральной темой.

+1

хлопот в CVS / SVN происходит от того, что эти системы делают не помните о родительских изменениях. В Git и Mercurial, у коммита может быть не только несколько детей, но и множественный родители!

что можно легко наблюдать с помощью одного из графических средств, gitk или hg view. В следующем примере ветвь №2 была разветвлена от № 1 по адресу commit A, и с тех пор был объединен один раз (в M, объединен с commit B):

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

обратите внимание, как A и B имеют двух детей, тогда как M имеет два родителям. Эти отношения - это записано в репозитории. Скажем, сопровождающий филиал №2 теперь хочет объединить последние изменения из ветки №1, они могут введите команду, например:

$ git merge branch-1

и инструмент будет автоматически знать, что базовый Б--потому что был записан в commit M, предок кончика №2--и что он должен слиться воедино, что бы ни случилось между B и C. CVS не записывает эту информацию, как и SVN до этого версия 1.5. В этих системах граф будет выглядеть так:

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

где M - это просто гигантская "раздавленная" фиксация всего, что произошло между A и B, нанесенный поверх м. Обратите внимание, что после того, как дело сделано, есть никаких следов слева (за исключением потенциально удобочитаемых комментариев) где M сделал происходят из, ни из сколько коммиты были свернуты вместе, делая история гораздо более непроницаема.

что еще хуже, выполнение второго слияния становится кошмаром: нужно выяснить то, что база слияния была во время первого слияния (и один и to знаю что произошло слияние в первую очередь!), затем представьте эту информацию инструменту, чтобы он не пытался воспроизвести A..Б о top of M. Все это достаточно сложно при работе в тесном сотрудничестве, но есть просто невозможно в распределенной среде.

a (связанная) проблема заключается в том, что нет способа ответить на вопрос: "делает ли X содержать Б?"где B - это a потенциально важное исправление ошибок. Итак, почему бы просто не записать эту информацию в коммит, с это известный во время слияния!

P.-S. -- У меня нет опыта работы с возможностями записи SVN 1.5+ merge, но рабочий процесс, похоже, намного больше надуманнее, чем в распределенных системах. Если это действительно так, вероятно, потому что, как уже упоминалось в приведенном выше комментарии основное внимание уделяется организации репозитория, а не самим изменениям.

потому что Subversion (по крайней мере, версия 1.4 и ниже) не отслеживает то, что было объединено. Для Subversion слияние в основном совпадает с любой фиксацией, в то время как на других системах управления версиями, таких как Git, то, что было объединено, запоминается.

не затронутый ни одним из уже предоставленных ответов, Hg предложил превосходные возможности слияния, поскольку он использует больше информации при слиянии изменений (hginit.com):

например, если я изменю функцию a чуть-чуть, а потом куда-нибудь переставить иначе, подрывная деятельность на самом деле не работает помните эти шаги, поэтому, когда он приходит времени сливать, она может подумать, что новая функция только что появилась из синий. Тогда как Mercurial будет помнить те вещи отдельно: функция изменено, функция перемещена, что означает что если вы изменили эту функцию немного, это гораздо более вероятно что Mercurial успешно сольется наши изменения.

конечно, вспоминая то, что было в последний раз объединено (точка, рассматриваемая большинством ответов, представленных здесь), также является огромной победой.

оба улучшения, однако, сомнительны, так как subversion 1.5 + хранит дополнительную информацию о слиянии в виде subversion свойства: эта информация доступна, нет очевидной причины, по которой subversion merge не может реализовать слияние так же успешно, как Hg или Git. Я не знаю, если это так, Хотя, но это, безусловно, звучит как разработчики subversion находятся на пути, чтобы обойти эту проблему.

Я полагаю, что это может быть частично потому, что Subversion имеет идею центрального сервера вместе с абсолютной временной линией ревизий. Mercurial действительно распределен и не имеет такой ссылки на абсолютную временную линию. Это позволяет Mercurial проектам формировать более сложные иерархии ветвей для добавления функций и циклов тестирования по подпроектам, однако теперь командам нужно гораздо активнее поддерживать слияния, чтобы оставаться в курсе, поскольку они не могут просто нажимать обновление и делать это оно.

в Subversion (и CVS) репозиторий-это в первую очередь. В git и mercurial нет действительно концепции репозитория таким же образом; здесь изменения являются центральной темой.

Я не думал много о том, как вы бы реализовали либо, но мое впечатление (основанное на горьком опыте и большом количестве чтения) заключается в том, что эта разница делает слияние и ветвление намного проще в системах, не основанных на репозитории.

У меня есть только опыт работы с Subversion, но я могу сказать вам, что экран слияния в TortoiseSVN ужасно сложен. К счастью, они включают кнопку сухого хода, так что вы можете увидеть, если вы делаете это правильно. Сложность заключается в конфигурации того, что вы хотите объединить туда, где. Как только вы получите эту настройку для слияния, слияние обычно идет нормально. Затем вам нужно разрешить все конфликты, а затем зафиксировать вашу объединенную рабочую копию в репозитории.

Если Mercurial может упростить конфигурацию слияния, тогда я могу сказать, что это сделает слияние на 100% проще, чем Subversion.

Comments

    Ничего не найдено.