вторник, 5 апреля 2011 г.

Понять ветвления

Централизованные системы контроля приучили нас к единому репозиторию. Ветвления осуществляются между каталогами, или депотами, как их не назови. Ну CVS мы за систему контроля (поддерживающую ветвления) вообще не считаем. Во всех остальных, насколько я знаю - деревья.

Вообще любой подход имеет как плюсы, так и минусы. svn хорошо, пока не захочешь посмотреть историю по ветке... В которой обычно можно наблюдать только последствия мерджей (MFC, MFC, MFC, MFC) - реальная природа изменений похоронена в транке.

Децентрализованные системы сливают весь чейнджсет, и мы можем видеть историю, не зависимо от того, в какой ветке находимся, это плюс.

Но я, почему-то, думал что одной центральной базы хватит всем. Нет! Природа децентрализованных систем такова, что каждая ветка, до слияния, живет в своей базе. Коммиты, попавшие в базу никуда не исчезают. И если вдруг есть вероятность, что данная ветка может не понадобиться, ее нельзя пушить в центральную базу, она там не нужна. Можно хранить ее на сервере, но только в отдельной базе.

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

Есть возможности публиковать только часть изменений - git публикует текущую ветку, mercurial'у можно указать что публиковать (со всеми парентами). При этом mercurial выталкивает на сервер все родительские коммиты. Сделал локальное слияние - все уйдет на сервер.

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

Думал, что можно выбрать в качестве альтернативы для текущей, централизованной системы? Mercurial вероятно наиболее подходящий кандидат. Во первых в базе Меркуриала есть номера ревизий. Пускай в каждой клонированной базе и свои, главное, что на сервере они неизменны. Я могу применять их в сборках и при этом сборки однозначно будут идентифицироваться с соответствующим коммитом. Этим свойством обладают почти все централизованные, и отсутствие этого служит препятствием к переходу. git или bazar не обладают такой упорядоченностью и компактностью (одна цифра) версий.

В остальном системы, по моему, идентичны. В bazar вообще нет локальных ветвлений, но как написано выше, они и в mercurial не особо помогают.

Надо сказать, что у меня не большой опыт работы с DVCS. Чтобы полноценно это осознать - нужно поработать в распределенной команде. Я только учусь. Возможно я и до сих пор в чем-то ошибаюсь.