У 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)
Зверніть увагу, як у А та В двоє дітей, тоді як у М - двоє батьків . Ці відносини реєструються у сховищі. Скажімо, супровідник гілки №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)
де М - це просто гігантський "зім'ятий" коміт усього, що сталося між А і В, застосований поверх М. Зауважимо, що після вчинення вчинку не залишається сліду (крім потенційно зручних для читання коментарів) місця, де М справді походили з того, скільки комітів було згорнуто разом - що робило історію набагато непроникнішою.
Що ще гірше, виконуючи другу злиття перетворюється в кошмар: один повинен з'ясувати , що злиття база була в момент першого злиття (і один має в знати ,
що відбулося злиття в першу чергу!), То уявіть , що інформацію до інструменту, щоб він не намагався відтворити A..B поверх M. Усе це досить складно при роботі в тісній співпраці, але просто неможливо в розподіленому середовищі.
(Пов’язана) проблема полягає в тому, що немає можливості відповісти на питання: "чи X містить B?" де B - потенційно важливе виправлення помилки. То чому б просто не записати цю інформацію у коміті, адже вона відома під час злиття!
П.-С. - Я не маю досвіду роботи зі записами злиття SVN 1.5+, але, схоже, робочий процес набагато вигадливіший, ніж у розподілених системах. Якщо це справді так, це, мабуть, тому, що - як уже згадувалося у вищезазначеному коментарі - акцент робиться на організації сховища, а не на самих змінах.