Я читал в Joel on Software:
При распределенном управлении версиями распределенная часть на самом деле не является самая интересная часть.
Интересная часть состоит в том, что эти системы думают с точки зрения изменений, а не с точки зрения версий.
и HgInit:
Когда нам нужно объединиться, Subversion пытается взглянуть на оба пересмотра - мой измененный код и измененный кода, и он пытается угадать, как разбить их вместе в одном большом нечестивом беспорядок. Обычно это терпит неудачу, производя страниц и страниц "конфликтов слияния" этот arent действительно конфликтует, просто места, где Subversion не удалось выяснить, что мы сделали.
В отличие от этого, пока мы работали отдельно в Mercurial, Mercurial был занят проведением ряда наборов изменений. Итак, когда мы хотим объединить наш код вместе, Mercurial фактически имеет все больше информации: он знает что каждый из нас изменил и может повторите эти изменения, а не просто глядя на конечный продукт и пытаясь угадать, как это сделать вместе.
Изучая папку SVN-репозитория, у меня создается впечатление, что Subversion поддерживает каждую ревизию как набор изменений. И из того, что я знаю, Hg использует оба набора изменений и моментальный снимок, а Git использует только моментальный снимок для хранения данных.
Если мое предположение верно, тогда должны быть другие способы, которые упрощают слияние в DVCS. Что это такое?
* Обновление:
- Меня больше интересует техническая перспектива, но ответы с нетехнической точки зрения приемлемы.
- Исправления:
- Концептуальная модель
- Git основана исключительно на моментальных снимках. Снимки могут храниться как отличия от других снимков, а именно, что различия предназначены исключительно для оптимизации хранилища. - Rafał Dowgird comment
- С нетехнической точки зрения:
- Это просто культурно: DVCS не работает вообще, если слияние было трудным, поэтому разработчики DVCS вкладывают много времени и усилий в упрощение слияния. Пользователи CVCS OTOH используются для дрянной слияния, поэтому нет стимулов для разработчиков, чтобы они работали. (Зачем делать что-то хорошее, когда ваши пользователи платят вам одинаково хорошо за что-то дерьмо?)
...
Напомним: вся суть DVCS состоит в том, чтобы иметь много децентрализованных репозиториев и постоянно сливать изменения взад и вперед. Без хорошего слияния DVCS просто бесполезен. CVCS, тем не менее, все еще может выжить с дерьмовым слиянием, особенно если поставщик может заставить своих пользователей избегать ветвления. - Jörg W Mittag ответ
- Это просто культурно: DVCS не работает вообще, если слияние было трудным, поэтому разработчики DVCS вкладывают много времени и усилий в упрощение слияния. Пользователи CVCS OTOH используются для дрянной слияния, поэтому нет стимулов для разработчиков, чтобы они работали. (Зачем делать что-то хорошее, когда ваши пользователи платят вам одинаково хорошо за что-то дерьмо?)
- С технической точки зрения:
- Запись реальной DAG истории помогает! Я думаю, что основное различие заключается в том, что CVCS не всегда записывал слияние в качестве набора изменений с несколькими родителями, теряя некоторую информацию. - tonfa comment
- из-за отслеживания слияния и тем более фундаментальным фактом, что каждая ревизия знает своих родителей.... Когда каждая ревизия (каждая фиксация), в том числе слияние, знает своих родителей (для фиксации слияния, что означает наличие/запоминание более одного родителя, т.е. Отслеживание слиянием), вы можете восстановить диаграмму (DAG = Direct Acyclic Graph) ревизии история. Если вы знаете график изменений, вы можете найти общего предка коммитов, которые хотите объединить. И когда ваш DVCS знает, как найти общий предок, вам не нужно указывать его как аргумент, например, в CVS.
.
Обратите внимание, что может существовать более одного общего предка из двух (или более) коммитов. Git использует так называемую "рекурсивную" стратегию слияния, которая объединяет базы слияния (общий предок) до тех пор, пока вы не останетесь с одним виртуальным/эффективным общим предком (в некотором упрощении) и сможете сделать простой трехсторонний слияние. - Jakub Narębski ответить
Проверьте также Как и/или почему слияние в Git лучше, чем в SVN?