В Subversion (и CVS) репозиторий - это прежде всего. В git и mercurial нет одинаковой концепции репозитория; здесь изменения - центральная тема.
+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)
Обратите внимание, что у A и B двое детей, а у M - двое родителей . Эти отношения записываются в репозиторий. Допустим, сопровождающий ветки №2 теперь хочет объединить последние изменения из ветки №1, он может выдать такую команду, как:
$ git merge branch-1
и инструмент автоматически узнает, что это база B - потому что она была записана в коммите 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. Обратите внимание, что после того, как действие выполнено, не остается никаких следов (за исключением потенциально удобочитаемых комментариев) того, где M действительно произошел, и сколько коммитов было свернуто вместе, что делает историю намного более непонятной.
Что еще хуже, выполняя второе слияние превращается в кошмар: один должен выяснить , что слияние база была в момент первого слияния (и один имеет в знать ,
что произошло слияние в первую очередь!), То представьте , что информацию в инструмент, чтобы он не пытался воспроизвести A..B поверх M. Все это достаточно сложно при работе в тесном сотрудничестве, но просто невозможно в распределенной среде.
Связанная с этим проблема заключается в том, что нет способа ответить на вопрос: «содержит ли X B?» где B - потенциально важное исправление ошибки. Так почему бы просто не записать эту информацию в коммит, поскольку она известна во время слияния!
П.-С. - У меня нет опыта работы с возможностями записи слиянием SVN 1.5+, но рабочий процесс кажется намного более надуманным, чем в распределенных системах. Если это действительно так, то, вероятно, потому, что, как упоминалось в комментарии выше, упор делается на организацию репозитория, а не на сами изменения.