Распределённая система контроля версий (Distributed VCS, DVCS) - это тип VCS, в котором каждый клон репозитория содержит полную историю проекта. Не «снимок текущей версии», как у централизованных систем (см. vcs), а буквально все коммиты от первого до последнего.
Главные представители - Git, Mercurial, Bazaar. Реже встречаются - Darcs, Pijul, Fossil.
Что меняется по сравнению с централизованной
Сервер технически не нужен
Маша и Петя могут синхронизироваться напрямую: «забери у меня изменения». На практике сервер всё равно появляется - он удобен как точка встречи (GitHub, GitLab) и как резервная копия. Но он не главный. Он один из равноправных клонов.
Работа без сети
Коммиты, ветки, история, поиск - всё локально, мгновенно. Сеть нужна
только чтобы синхронизироваться с другими через push и pull.
Скорость
Локальная операция - это чтение с диска. SVN-клиенту нужно сходить на сервер, дождаться ответа. Git-клиенту - нет.
Дешёвые ветки
Создание ветки - это запись 40 символов в файл (см. branch). В SVN ветка - копия директории на сервере. Это меняет подход к работе: в Git ветки делают для каждой задачи, в SVN ветки боялись делать.
Надёжность
История продублирована у каждого разработчика. Чтобы потерять её, нужно одновременно сломать все клоны. Сравни с централизованной: один сервер падает без бэкапа - всё пропало.
Цена
- Дисковое место. Каждый клон содержит полную историю. Для
репозиториев на гигабайты это заметно. Mitigations:
git clone --depth=1(shallow),git lfsдля бинарных файлов. - Чуть сложнее ментальная модель. Нужно понимать, что мой коммит
и коммит на сервере - это разные коммиты, пока я не сделал
push.
История
BitKeeper - первая широкоизвестная DVCS, 1998. Линус Торвальдс использовал её для ядра Linux с 2002 по 2005. После отзыва бесплатной лицензии в 2005 году Линус написал Git за 10 дней.
Параллельно в 2005 году появились Mercurial и Bazaar - обе распределённые, обе с похожими идеями. Технически они были не хуже Git. Победил Git благодаря двум вещам: ядро Linux переехало на него сразу, и в 2008 году появился GitHub.
Сравнение
| Централизованная (SVN) | Распределённая (Git) | |
|---|---|---|
| История на клиенте | только текущая версия | полная |
| Сеть для коммитов | обязательна | не нужна |
| Ветки | дорогие (копия директории) | бесплатные (40 байт) |
| Точка отказа | сервер | нет |
| Размер клиентского хранилища | маленький | пропорционально истории |