Репозитории
Репозиторий – это инструмент для хранения разных версий одного файла. (А ещё для того, чтобы смотреть, что изменилось между разными версиями, чтобы этими разными версиями обмениваться, перетаскивать кусочки из одной версии в другую версию и много для чего подобного).
Существует множество разных программ для организации репозиториев (как правило, несовместимых друг с другом, хотя зачастую существуют ещё третьи программы, чтобы как-то их подружить): CVS, SVN, git, mercurial, ...
Мы будем пользоваться mercurial. Для него есть хороший графический интерфейс TortoiseHG, которым я рекомендую пользоваться.
mercurial заточен под взаимодействие в команде, поэтому каждую версию файла, за которым он следит, он будет подписывать вашим именем. Для этого ему нужно это имя узнать, и сам он догадываться до этого не умеет. Поэтому прежде, чем общаться с репозиторием, нужно:
- установить себе на компьютер tortoisehg
нажать правой кнопкой мыши на рабочем столе -> tortoise hg -> global settings -> commit
найти там поле username и вписать в него: Имя Фамилия <email>
Основные понятия в меркуриале:
- репозиторий
это все файлы, имеющие отношения к одному проекту. Задача репозитория хранить историю изменения этих файлов. Репозиторий устроен как обычная директория, в которой лежит поддиректория .hg (её меркуриал создаёт сам, и большинство того, что там лежит, ни коим образом не предназначено для человеческих глаз)
- список контролируемых файлов
- меркуриал разрешает хранить в директории репозитория файлы, история изменения которых не отслеживается. Например, не имеет смысла отслеживать историю изменения файлов, которые автоматически генерируются из наших программ за несколько секунд; ещё мы можем решить, что очень большие бинарные файлы не хочется хранить в репозитории из экономии места (для бинарных файлов у меркуриала могут быть менее удачные алгоритмы хранения версий, и это может привести к тому, что меркуриал на каждую версию будет хранить просто копию этого файла). По умолчанию меркуриал не принимает сам решения, за какими файлами он следит, то есть не следит ни за чем.
- история
- список версий файлов. История содержит версии, общие для всего проекта, а не для отдельного файла. Зато из каждой версии можно узнать, что было в конкретном файле в этой версии.
- версия
- сохранённое содержимое файлов в какой-то момент.
Здесь и далее все команды меркуриала я называю так, как они называются в командной строке и, соответственно, в английской версии интерфейса. Замечу, что язык интерфейса у него легко настраивается – поищите в глобальных настройках.
Чтобы начать работать с репозиторием, нужно зайти в (уже созданную) директорию (в которой могут лежать уже созданные файлы) и сказать hg init. Все команды, относящиеся к репозиторию, меркуриалу нужно говорить, находясь в репозитории (или, соответственно, из контекстного меню репозитория).
Далее нам нужно сказать меркуриалу, что мы хотим следить за версиями каких-то файлов. Добавляются файлы командой hg add (добавляет все файлы в директории) или hg add файл (добавляет один или несколько файлов). Если какой-то файл нам надоел, и мы больше не хотим следить за его историей, мы можем его удалить: hg rm файл. При этом прежняя история этого файла сохранится, но меркуриал не будет больше считать его частью репозитория.
Чтобы сказать меркуриалу, что нынешнее состояние файлов хорошее – например, вот ровно сейчас программа работает, не дышать, – нужно сказать: hg commit. Меркуриал при этом откроет окно, в котором предложит вам описать изменения. По умолчанию меркуриал сохраняет состояние всех файлов, но мы можем сохранять их состояние по одному: hg commit файл.
Теперь мы можем посмотреть на историю изменений в репозитории: hg log. (Tortoisehg предоставляет более красивое представление, отыщите его в контекстной менюшке в "моём компьютере")
Ещё мы можем сравнить содержимое двух разных версий: hg diff 1 2. Или узнать, что мы успели сделать с момента последнего коммита: hg diff.
Чтобы разобраться, какие файлы сохранены в репозитории, какие нет, есть команда: hg status. В графическом интерфейса статус каждого файла отображается всегда и везде как кружки, нарисованные поверх иконок файла.
Мы можем вернуться к одной из прежних версий: hg update -r 1 заменяет в рабочей директории все файлы на их содержимое из версии номер 1.
Если вы дома пишете программу на своём компьютере, потом хотите перенести её в класс на флэшке (? зачем на флэшке – этого я понять не могу, но потребность весьма частая), вам полезна команда hg push путь-к-директории, которая содержимое вашего репозитория отправляет в репозиторий, который (уже) лежит в путь-к-директории. (Например, потому, что вы его туда скопировали вместе со всем проектом). И обратная для неё команда hg pull путь-к-директории вытягивает из репозитория путь-к-директории изменения в текущий репозиторий. Для тех, кто не любит возиться с флэшками, меркуриал умеет пользоваться SSH, для этого в качестве пути к репозиторию нужно дать ему что-то в духе: ssh://логин@kodomo.fbb.msu.ru/Term4/.../.../... Единственное, после любой из этих команд нужно сказать hg update в том репозитории, где что-то менялось в истории. (Почему – это вопрос того, как использовать репозиторий для работы в команде – это тема, которую мы оставляем за скобками).
Самая главная команда меркуриала: hg help.
Не бойтесь пробовать! Меркуриал достаточно навязчиво предупредит вас, если вы попытаетесь сделать какое-нибудь необратимое действие.
Мы очень приветствуем, чтобы вы пользовались системой контроля версий для ваших программ.
Литература
Tortoise HG docs, там шикарный quick start, который очень похож на то, что мы делали на занятии
Mercurial Book – очень хорошая книжка, которая подробно разъясняет все сложности. Рассчитана на пользователей командной строки, так что помогает скорее в сложных случаях, нежели в простых.