Системы управления версиями

Лучшие практики
Я удивляюсь, сколько электронщиков не использует системы управления версиями в своих разработках. Я сам был таким, пока не попробовал. Теперь каждый проект я начинаю с создания репозитория.


Что это такое?
Итак, системы управления версиями (СУВ) — это такая программка, которая позволяет сохранять всю историю разработки проекта.

Зачем это нужно?
Это — очень, прямо мега-удобный инструмент для разработки. Бывает так, что вы писали-писали программу и, наконец, что-то сломали. Если программа находилась в системе управления версиями, можно легко откатиться к прошлой версии проекта и посмотреть, что изменялось, меня это много раз спасало.

К примеру, недавно у меня начали падать ограничения по скорости в проекте на FPGA. Я буквально за 5 минут нашел версию, в которой они еще не падали и нашел в чем причина

Если над проектом работает несколько человек, без СУВ работать вообще практически невозможно — начинается хаос, каждый делает что-то свое и не понятно, кто и что наделал. С СУВ можно удобно посмотреть кто и что сделал, изменения внесенные другими становятся намного менее неожиданными.

Кроме того, есть более экзотические применения. К примеру, изменения этого сайта я передаю на сервер с помощью системы контроля версий.

Какую выбрать?
Систем контроля версий существует огромное множество. Лично я для себя выбрал Mercurial. Отличная система, которую всем рекомендую — быстрая, кросплатформеная, с отличным графическим клиентом. Очень весомым аргументом в ее пользу оказалось существование сайта bitbucket. Я ни разу не пожалел о выборе.

Кроме Mercurial, сейчас довольно распространены git и svn. Git больше распространен в около linux'овской тусовке, svn — в корпоративной среде. Я их попробовал использовать (правда, очень не долго), но ничего такого, из-за чего стоило бы бросать mercurial я не увидел.

Bitbucket
Есть такой сайт bitbucket.org, на нем можно хранить ваши проекты. Он примечателен тем, что там, в отличии от github можно бесплатно создавать закрытые репозитории (репозиторий — место, где хранится проекты). Платить нужно только за те проекты, которые закрыты и над которыми работает больше, чем 5 человек. При этом, лимит можно расширить до 8ми, рассылая приглашения. Я, пока, не превышал этого лимита. Кроме этого, есть wiki и багтрекер, вообщем, все, что нужно для разработки проектов.
bitbucket
Когда я начинал с ним работать, сайт поддерживал только Mercurial (отчасти из-за этого, я и выбрал mercurial), но сейчас там можно создавать и git-репозитории. Кроме того, к bitbucket можно привязать свой домен. Вот, к примеру, мой вариант: hg.bsvi.ru

Как начать?
Сначала нужно скачать клиент. Я использую tortoiseHg. Думаю, с установкой проблем не возникнет.
tortoise hg
После установки, неплохо бы задать имя пользователя по умолчанию. Для этого, нужно отредактировать файл С:/Users/BSVi/mercurial.ini туда нужно добавить строчку

[ui]
username = bsvi


Естественно, bsvi нужно заменить на ваше имя.

Теперь мы готовы создать проект и начать что-то делать. Для этого на bitbucket.org жмем «Create repository»:
Создать репозиторий

Там заполняем название, описание, выбираем язык. Можно добавить wiki и багтрекер.
Создание репозитория

Теперь жмем на кнопку «clone» и копируем то, что там появилось:
Клонирование

Дальнейшие операции зависят от того, какой файловый менеджер вы используете. Лично я использую far. Я просто вставляю скопированную строчку в коммандную строку:
Клоинрование

Если вы испольуете проводник (эм), total commander или что-то в таком духе, то нужно щелкнуть правой кнопкой мышки и выбрать:
Клоинрование
Там, в поле source нужно вставлять путь, естественно, без hg clone:
Клоинрование

Вас спросят о вашем пароле, и появится директория test-repo, в которой, собственно и будет находиться проект.

Добавим немного файлов
Если у вас уже есть наработки по проекту, их можно просто скопировать в директорию. Мы-же, для учебных целей, создадим файл main.c с вот таким содержимым:

#include <stdio.h>

int main()
{
	return 0;
}


Теперь сделаем коммит. Коммит — это внесение изменений в проект. Для этого запускаем hg workbench. Я просто пишу в командной строке thg, для эксплорерообразных файловых менеджеров нужно нажать ПКМ->Hg Workbench.

Напротив нашего файла будет знак вопроса (это значит, он не добавлен в проект). Поставим около него галочку и напишем описание того, что было сделано:
первый коммит
Естественно, после этого, жмем кнопку «commit».

Все, изменения в проект внесены. Тут нужно обратить внимание, что изменения внечены только на локальном компьютере (тоесть, их еще нету на сервере). Для того, чтобы перенести изменения на сервер, нужно нажать кнопку «push», вот она:

Кнопка push

Естественно, для проталкивания изменений на сервер, потребуется пароль.

Изменим файл
Теперь давайте посмотрим, одну из очень важных фишек систем контроля версий — отслеживание версий файлов. Добавим к нашей программе вывод на экран:

#include <stdio.h>

int main()
{
	printf("mercurial rules!");
	return 0;
}


Перейдем в hg workbench. Я когда работаю над проектом его даже не закрываю (об этом-дальше), нажимаем f5 чтобы обновить список файлов. Теперь видно, что изменилось со времени последнего коммита:

Различия файлов

И это — очень сильный инструмент. Обычно, во время отладки в файлах появляется куча разного мусора. Дак вот, просматривая то, что вы собираетесь закоммитить очень неплохо очищает от мусора проект.

А что делать с мусором?
При работе над проектом появляется очень много мусора — к примеру, объектные файлы, файлы, которые генерирует IDE, какие-то временные файлы, итп. Все, то, что не относится к самому проекту, неплохо бы убрать из репозитория. Для этого существует файл .hgignore (да, с точкой в начале названия).

Добавим мусорный файл к проекту. Я, к примеру, создал main.obj:

Мусор

Если сейчас обновить список файлов, то, естественно, hg workbench предложит добавить этот файл в проект:

добавление мусорного файла

Теперь, создадим файл .hgigonre и напишем там, что мы хотим игнорировать все файлы с расширением obj:
syntax:glob
*.obj


Если обновить список файлов, то obj файлы пропадут, зато появится файл .hgignore, который можно закоммитить:
hgignore

А как откатить изменения?
Восстановим нашу программу до того состояния, которое было до вывода на экран. Для этого достаточно выбрать коммит, до которого хочется откатиться и нажать вот эту кнопку:

Откатиться

Точно практически так-же можно откатить отдельный файл.

Откатить один файл

Ссылки
Книга «Mercurial: Полное руководство»
Wikipedia о mercurial
Русская страница mercurial-wiki

Заключение
Вот и все, это — минимум знаний о системах контроля версий, который позволит вам сохранять историю разработки проекта. Естественно, есть очень много других возможностей, про которые я расскажу попозже.

Многие думают, что системы контроля версий нужно использовать только если разрабатываешь что-то большой толпой, но это — не так :) Даже когда работаешь над проектом в одиночку, системы контроля версий сильно выручают.

Для примера, вот скриншот моего UTC (который я разрабатываю сам) в самом сложном месте в hg workbench:
UTC в hg workbench

9 комментариев

avatar
Вот только несколько дней назад была мысль попросить тебя написать об этом! Здорово, спасибо!
avatar
Mercurial клёвый.
Git клиент мне не очень понравился. Что-то базовое можно через него, чуть сложнее — привет консоль. Лично мне удобнее, когда есть клиент с удобным гуём.
SVN уже не стоит использовать, старый он и неудобный(в сравнении с Mercurial и git).
avatar
Насчет git согласен, но вот SVN, хоть и старый, очень широко используется в корпоративной среде (по факту, 90% компаний, которые я знаю, используют SVN). Это связано с тем, что SVN уже внедрен, а что-то новое внедрять компаниям — довольно проблематично. Так и живут.
avatar
Немного некорректно выразился. Не стоит начинать использовать SVN для своих проектов. Есть более удобные системы.
avatar
Я в своих проектах Git использую. Правда более сложные вещи чем создать новую ветку, попробовать новый функционал, слить, посмотреть разницу пока еще не понадобился. Использую вкупе в плагинами для Eclipse. Удобно. Получается все в одном флаконе (в одной IDE).
avatar
Если вы испольуете проводник (эм), total commander или что-то в таком духе, то нужно щелкнуть правой кнопкой мышки и выбрать:
Небольшое уточнение: в тотале точно так же можно сделать копипаст в командную строку.
avatar
Надо тоже попробовать Hg, спасибо за статью. На работе же у меня во всю юзается Perforce и SVN
avatar
Настроил Mercurial для Eclipse ARM — работает супер и в одной среде, невероятно удобно. Жаль что не все IDE так поддерживают Mercurial, например CooCox IDE…
avatar
В строчке ошибочка:

Теперь, создадим файл .hgignore и напишем там, что мы хотим игнорировать все файлы с расширением obj:

Я долго не мог понять, почему hg не игнорит «мусор»… Оказалось, тупо скопировал имя файла именно из этой строчки :/
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.