Программное обеспечение для контроля версий
Полезная информация о программном обеспечении для контроля версий: преимущества и недостатки наиболее распространённых инструментов.
Что такое программное обеспечение для контроля версий?
Программное обеспечение для контроля версий (VCS) — это инструмент, который записывает изменения в наборе файлов с течением времени, позволяя вам вернуться к любой более ранней версии, увидеть, кто и что изменил, а также объединять работу многих людей без взаимной перезаписи. Это основа любого совместного рабочего процесса разработки программного обеспечения, необходимая с того момента, как над кодовой базой начинает работать более одного человека.
На этой странице объясняются два семейства программного обеспечения для контроля версий, рассматриваются наиболее известные инструменты и их компромиссы, а также помогается определить, какой из них подходит для вашего проекта. Если вы хотите сначала разобраться с базовой концепцией, прочитайте Система контроля версий; чтобы понять, почему именно Git стал победителем, смотрите Что такое Git.
Централизованные и распределённые системы
Почти каждая VCS относится к одной из двух архитектур, и это различие определяет всё остальное.
- Централизованная (CVCS): единственный сервер хранит каноническую историю. Клиенты извлекают рабочую копию и фиксируют изменения прямо на этот сервер. Примеры: CVS, SVN. Преимущество — один очевидный источник истины и простое управление доступом; недостаток — для фиксации изменений нужен доступ к сети, а сервер является единой точкой отказа.
- Распределённая (DVCS): каждый клон — это полная копия всего репозитория, включая всю историю. Вы фиксируете изменения, создаёте ветки и просматриваете историю локально и в офлайн-режиме, а затем синхронизируетесь с другими по мере готовности. Примеры: Git, Mercurial, Monotone. Это делает большинство операций мгновенными и устраняет единую точку отказа, за счёт чуть более сложной концептуальной модели.
Распределённый дизайн Git — главная причина, по которой создание веток и фиксация изменений ощущаются мгновенными: нет обращения к серверу. Каждый клон, созданный с помощью git clone, уже содержит полную историю проекта.
Широко используемые инструменты
Git
Git — это де-факто стандартная распределённая система контроля версий сегодня. Она быстрая, эффективная и работает с проектами любого размера. Её отличительные сильные стороны — дешёвое локальное ветвление (см. git branch), удобная область подготовки (см. git add) и поддержка множества рабочих процессов. Это бесплатное программное обеспечение с открытым исходным кодом.

Ограничения. Поддержка больших бинарных файлов слабая из коробки — хотя Git LFS решает эту проблему. Операции могут замедляться на очень больших репозиториях с длинной историей, а широта команд может казаться ошеломляющей для новичков.
CVS
CVS (Concurrent Versions System) — это централизованная система, которая была исторически популярна, но сейчас в основном устарела, вытесненная современными распределёнными инструментами. Она записывает историю файлов и документов и работает практически на любых аппаратных платформах и операционных системах. Это бесплатное программное обеспечение с открытым исходным кодом.

Ограничения. CVS не проверяет целостность репозитория и не поддерживает атомарные коммиты, отслеживание слияний и подписанные ревизии — недостатки, которые непосредственно послужили поводом для создания её преемников.
SVN
SVN (Apache Subversion) — централизованная система контроля версий, широко использовавшаяся в 2000-е годы и до сих пор встречающаяся в некоторых корпоративных и унаследованных средах. Её возможности включают версионирование директорий, атомарные коммиты, отслеживание слияний, первоклассные операции копирования/перемещения/переименования/удаления, клиент-серверную модель, свободную версионированную метаинформацию, полную поддержку MIME и блокировку файлов. Это бесплатное программное обеспечение с открытым исходным кодом.

Ограничения. Время изменения файлов не хранится, нормализация имён файлов может быть проблематичной на разных платформах, и отсутствует поддержка подписанных ревизий.
Mercurial
Mercurial — это распределённая система контроля версий, написанная преимущественно на Python. Она быстрая, поддерживает проекты любого размера и отличается предсказуемым, простым в освоении интерфейсом. Работает на Unix-подобных системах, Windows и macOS, хорошо работает с бинарными файлами и обладает развитыми возможностями слияния и ветвления. Это бесплатное программное обеспечение с открытым исходным кодом.

Ограничения. Python требуется для всех дополнений, частичное извлечение не поддерживается, и система не всегда хорошо работает со сторонними расширениями.
Monotone
Monotone — это распределённая система контроля версий, написанная на C++. Это однофайловая транзакционная VCS, предлагающая полностью автономную работу, слияние с учётом истории, лёгкие ветки, низкие накладные расходы на обслуживание и одноранговую синхронизацию. Работает на Linux, Solaris, macOS, Windows и других Unix-системах. Это бесплатное программное обеспечение с открытым исходным кодом.

Ограничения. Без поддержки HTTP пользователи не могут извлекать или фиксировать изменения из-за прокси-сервера, а некоторые операции — в особенности начальное извлечение — имеют проблемы с производительностью. Сегодня Monotone в основном заброшена и имеет ограниченную актуальность.
Краткое сравнение
| Инструмент | Архитектура | Статус | Ключевое преимущество | Основной недостаток |
|---|---|---|---|---|
| Git | Распределённая | Отраслевой стандарт | Скорость, ветвление, экосистема | Большие бинарные файлы, кривая обучения |
| Mercurial | Распределённая | Поддерживается, нишевая | Предсказуемость, простой интерфейс | Меньшая экосистема |
| SVN | Централизованная | Устаревшая / корпоративная | Блокировка файлов, простая модель | Требует сервера для фиксации |
| CVS | Централизованная | Устаревшая | Историческое значение | Нет атомарных коммитов или проверки целостности |
| Monotone | Распределённая | В основном заброшена | Надёжная модель целостности | Нет HTTP, медленное начальное извлечение |
Какой выбрать?
Для почти каждого нового проекта ответ — Git: у него самое большое сообщество, лучшая поддержка хостинга (GitHub, GitLab, Bitbucket) и богатейший инструментарий. Прибегайте к альтернативе только тогда, когда конкретное ограничение подталкивает вас к этому:
- Mercurial — если ваша команда предпочитает меньший, более согласованный набор команд и вы не привязаны к экосистеме Git.
- SVN — если вам нужна строгая блокировка файлов для несливаемых бинарных ресурсов или вы поддерживаете существующий централизованный рабочий процесс.
- CVS / Monotone — как правило, только при поддержке существующего унаследованного репозитория; избегайте для новой работы.
После того как вы определились с Git, следующий шаг — установить его и узнать, как работает управление исходным кодом на практике.