В Subversion (и CVS) хранилище - это прежде всего. В мерзавце
и ртутный, на самом деле нет концепции хранилища в
так же; здесь изменения являются центральной темой.
+ 1
Проблемы в CVS / SVN происходят из-за того, что эти системы не
помните родительские изменения. В Git и Mercurial,
коммит может иметь не только несколько дочерних элементов, но и несколько
родители!
Это легко заметить с помощью одного из графических инструментов, gitk
или hg
view
. В следующем примере ветка # 2 была разветвлена от # 1 в
коммит A, и с тех пор был объединен один раз (в M, объединен с коммитом B):
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
Обратите внимание, что у А и В двое детей, тогда как у М есть два родителей . Эти
отношения записаны в хранилище. Скажем, хранитель
Ветка №2 теперь хочет объединить последние изменения из ветки № 1, они могут
введите команду, такую как:
$ git merge branch-1
и инструмент автоматически узнает, что base - это B, потому что
был записан в коммите М, предке кончика № 2 - и
что он должен объединить все, что случилось
между B и C. CVS не записывает эту информацию, как и SVN до
версия 1.5. В этих системах граф
будет выглядеть так:
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
где М - просто гигантский «раздавленный» коммит всего, что произошло между А и В,
применяется поверх M. Обратите внимание, что после того, как дело сделано, нет никаких следов
оставил (кроме потенциально в удобочитаемых комментариях) того, где M сделал
от , сколько коммитов было свернуто вместе - создание
история гораздо более непроницаемая.
Что еще хуже, выполнение второго слияния становится кошмаром: нужно разобраться
какой была база слияния во время первого слияния (а у одного есть до знаю
что произошло слияние в первую очередь!), то
представить эту информацию инструменту, чтобы он не пытался воспроизвести A..B на
вершина М. Все это достаточно сложно при работе в тесном сотрудничестве, но
просто невозможно в распределенной среде.
(связанная) проблема в том, что нет возможности ответить на вопрос:
содержат B? ", где B представляет собой
потенциально важное исправление ошибки. Итак, почему бы просто не записать эту информацию в коммит, так как
известно во время слияния!
P.-S. - У меня нет опыта с возможностями записи слиянием SVN 1.5+, но рабочий процесс кажется гораздо более
надуманный, чем в распределенных системах. Если это действительно так, то, вероятно, потому что - как уже упоминалось
в приведенном выше комментарии - основное внимание уделяется организации хранилища, а не самим изменениям.