Сегодня речь пойдет о том, что такое системы контроля версий. Рассмотрим самые базовые понятия, которые следует знать перед началом работы.
Для начала давайте определимся, что же вообще такое система контроля версий (СКВ). По википедии система управления версиями это:
Программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.
Конечно же наиболее частым применением этих систем является разработка кода. С этой точки зрения СКВ обладает совершенно незаменимым свойством - позволяет организовать работу нескольких людей над одним программным проектом, невероятно облегчая при этом труд программистов как по удобству разработки, так и по соединению (сливанию) наработок всех участников проекта.
Базовым понятием СКВ является репозиторий. Репозиторий - это хранилище СКВ, в котором хранятся все версии ваших файлов - то есть прокаченная папка с вашим проектом. Следующими по иерархии понятиями СКВ являются:
Ветки (Branches). Ветки - это параллельные направления развития вашего проекта. Например, типичным случаем создания ветки является работа над исправлением некоторого бага или проверка/прототипирование неоднозначного функционала. В качестве примера приведу такую ситуацию.
Основная ветка (trunk в SVN, master в Git). Основная ветка - это текущая версия вашего проекта. При этом другие ветки проекта могут как отставать, так и опережать её по "функциональному прогрессу" вашего кода. Но в подавляющем большинстве случаев в какой-то момент времени каждая побочная ветка сливается с главной.
Тэги (Tags). Тэги служат для фиксации определенных версий веток. Например, добившись стабильной версии проекта (v1.0) из неё можно сделать тэг и использовать его как отправную точку для последующих экспериментов или для загрузки на продуктивный сервер. Как правило, после создания тэги больше не изменяются.
Следующим понятием СКВ является коммит (commit). Коммит - это фиксация текущего состояния конкретной ветки, которая в отличии от тэгов носит локальный характер и не претендует на полную стабильность и завершенность проекта. Это просто контрольные точки, до каждой из которых вы можете в любой момент откатиться. Жизненный цикл файлов в репозитории можно представить следующим образом:
Все системы контроля версий можно разделить на две категории: централизованные и децентрализованные (то есть распределенные). Типичным и весьма популярным представителем первого типа является SVN (Subversion), второго - все более набирающая популярность Git.
Централизованные системы подразумевают наличие выделенного, доступного всем участникам сервера, на котором находится уже известная нам структура проекта:
Такая же структура папок находится и на машине разработчика. При этом разработчик работает с СКВ по клиент-серверной архитектуре. Как только разработчик делает коммит - изменения отправляются на сервер. Проверяется возможность слить новые версии файлов с теми, что есть на сервере и если конфликтов нет - сливание происходит автоматически, иначе разработчику приходит сообщение с просьбой разрешить конфликтную ситуацию. Примером конфликтной ситуации может быть совпадение названия функции в отправляемом файле и в файле на сервере. То есть, кто-то раньше нас уже завел такую функцию и нам предстоит решить, что нужно сделать: или заменить чужую реализацию своей или же переименовать свою функцию.
В распределенных системах, как и в централизованных, обычно есть выделенный сервер с репозиторием. Отличие заключается в том, что на машине разработчика СКВ по функционалу ничем не отличается от серверной. То есть разработчик может создавать коммиты, ветки и теги у себя на машине, не отражая это на центральном сервере. И лишь когда захочет - отправляет свою версию на сервер.
В следующем посте я опишу основные команды, которые нужно знать для того чтобы начать работать с распределенной системой Git.