Система контроля версий Mercurial HG

Система контроля версий Mercurial HG

Mercurial - распределенная система контроля версий. Если Вы знаете, что такое система контроля версий, то цитату ниже можете пропустить. Если нет, то...

Система контроля версий (СКВ) - система, которая регистрирует изменения в файлах проекта в процессе его разработки.
Пример 1: Вы разработали сайт, он работает и всё замечательно. Сделали сохранение (в СКВ называется commit) Но потом вы решили добавить в него какой-то функционал, или расширить текущий. Вы начали ошибку, но в какой-то момент обнаружили, что допустили ошибку, которая привела, например, к полной поломке сайта. Где именно вы допустили ошибку неизвестно, а сайт должен работать. Тут Вы и обращаетесь к системе контроля версий - Вы просто пишете команду, которая приводит сайт к состоянию, когда всё работало, а вы не начали осуществлять доработки. При этом, вы можете сохранить Ваши доработки и в спокойном режиме их доработать.
Пример 2: здесь обратимся к компьютерным играм. Допустим, вы играете в стратегию, и после каждой миссии сохраняете игру (в СКВ называется commit). Но в какой-то момент понимаете, что три миссии назад, совершили неверное действие, из-за которого сейчас не можете добиться нужного результата (победить противника, заработать ресурсы и т.п.). Благодаря одному из таких многих сохранений (commit, или «коммитов»), вы можете вернуться назад и исправить ситуацию.

Сегодня мы с вами установим Mercurial и изучим основы работы с ним.
Я буду работать на базе windows, но если вы используете macOS или linux, то ничего страшного - Mercurial работает со всеми системами. Хотя у Mercurial и есть удобный графический интерфейс в windows, я всё равно буду показывать работу именно в консоли, т.к. такого графического интерфейса нет под linux и mac. Под mac и linux существуют графические решения, но они отличаются от решения на windows, а команды в консоли везде будут одинаковые, за редкими мелкими исключениями. Кроме того, когда Вы набьёте руку - окажется, что работать с консолью удобнее.

Установка Mercurial HG

Думаю, тут проблем быть не должно. Заходим на официальный сайт Mercurial HG - www.mercurial-scm.org - скачиваем на свой компьютер дистрибутив (правильный Вам предложит сам сайт) и устанавливаем его.

Важный момент при установке, чтобы все галочки были поставлены как на скриншоте ниже, чтобы всё у вас корректно работало.

Установка Mercurial

Первичная настройка

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

Домашний каталог

Создаём в домашнем каталоге файл mercurial.ini со следующим содержимым:

Базовая настройка mercurial
[ui]
username = Andrew <info@prost-web.ru>

У Вас, соответственно, будут свои имя и e-mail.

Начало работы с Mercurial, первые шаги.

Если вы уже знакомы с системами контроля версий то вероятно, вам не нужно объяснять, что такое инициализация проекта. Но если нет, то:

Инициализация проекта - по сути своей, его регистрация. Т.е. мы регистрируем его в системе Mercurial, чтобы в дальнейшем система могла с ним работать.

Для начала создадим проект с некоторым набором файлов.

Проект с набором файлов

Как видите, в моём случае проект называется project, и хранит в себе файлы index.php, а также файл functions.php, который расположен по адресу /inc/functions.php относительно корня проекта.

Проект с набором файлов 2

Инициализируем проект: для этого открываем командную строку и переходим в каталог, в котором находится проект. Для этого используем команду CD #Ваш_путь_к_каталогу_с_проектом#
В моём случае эта команда выглядит так:

Переход к каталогу с проектом через командную строку

При этом, мы с вами держим в голове, что в каталоге learn находится сам проект, который (в моём случае) представляет собой директорию project.

Теперь инициализируем проект в нашей директории - для этого введем команду $ hg init project

Инициализация проекта

Открываем каталог project, и видим, что там создалась директория .hg.

Проект инициализирован, создана папка .hg

Собственно, это и говорит о том, что проект был инициализирован меркуриалом.

Директорию .hg менять настоятельно не рекомендуется! Это может привести к некорректно работе СКВ, или к поломке проекта с точки зрения СКВ - вы можете просто потерять все данные, которые прошли commit.

Теперь мы должны добавить файлы к проекту (для mercurial) и "закоммитить" их.

Commit (коммит, коммиты, закоммитить) - понятие во всех системах контроля версий, и подразумевает фиксацию состояния проекта в том виде, в каком нам нужно его сохранить. Теоретически, мы могли-бы просто скопировать каталог и вставить его, например, в каталог Projects backups, а саму сохраненную копию назвать как-то вроде "Project_30.04.2018". А чтобы было понятно, что это за резервная копия - добавить в корень резервной копии файл readme.txt, с подробным описанием. Но это долго и не так удобно по сравнению с коммитом, который делает это быстрее и удобнее.

Добавим файлы командой $ hg add.

Добавление файлов
Если посмотреть на скриншот выше, то можно увидеть, что при первой попытке добавить файлы в проект перед коммитом у меня не получилось. Так вышло, потому что я находился в директории learn, которая не была инициализирована как проект у Mercurial. Да и кроме того, работаем мы с проектом project, поэтому и зайти нужно сначала в него, а потом уже выполнять команду $ hd add - все это проделано на скриншоте выше.

Имейте ввиду, что вы должны находиться в каталоге проекта, перед тем, как выполнять данную команду (как и большинством других).

А теперь закоммитим проект командой $ hg commit

Первый commit

Открывается блокнот:

Открылся блокнот

Удаляем всё содержимое открывшегося файла и вписываем комментарий для нашего коммита, сохраняем и закрываем файл. Комментарии очень желательно писать на латинице!

Теперь давайте посмотрим состояние нашего проекта. Для этого пропишем команду $ hg status:

Открылся блокнот

Как видим, Меркуриал нам ничего не показал. Но давайте для примера изменим какой-то файл. Я изменю файл index.php:

Изменяем файл index.php

А теперь повторим команду $ hg status:

Смотрим статус файла после изменения

Как видим, меркуриал подсветил синим файл index.php и обозначил его индексом М.

Индекс М означает, что файл был изменен.

А с помощью команды $ hg diff мы можем посмотреть изменения более подробно:

Команда Diff

Как видите, здесь уже видно, какие строки были добавлены мной в этот файл, а какие удалены.

Добавим снова наш файл ($ hg add) и закоммитим его. Вот только на этот раз, мы не просто напишем команду $ hg commit - мы пропишем для нее ключ -m, чтобы прописать комментарий к коммиту прямо в командной строке. Получится такая команда:
$ hg commit -m "test commit width key m».

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

Проверяем статус:

Commit width -m

Видим, что бекап (коммит) создан, т.к. меркуриал после выполнения команды нам ничего не показал.

Команду $ hg status можно прописать аналогичной командой $ hg st - это будет тоже самое.

Логично, что резервные копии (коммиты) мы делаем для того, чтобы потом пользоваться ими. Значит, нам нужно научиться просматривать дерево коммитов (т.е. все коммиты, которые мы делали для данного проекта).

Чтобы посмотреть дерево (список) коммитов данного проекта, необходимо выполнить команду $ hg log:

Смотрим дерево коммитов

И так мы сразу увидели наши коммиты, которые сделали ранее для данного проекта.
Теперь давайте попробуем какой-то из этих коммитов посмотреть детально. Для этого необходимо выполнить команду $ hg log -p -r #Номер_коммита#

Номер коммита можно узнать из дерева, он виден с желтой строке "changeset: #Номер_коммита#:#######"
Я выберу последний коммит, т.е. первый (с номером 1) и напишу команду $ hg log -p -r 1.

Смотрим коммит детально

И, как видим, мы посмотрели его содержимое.

Чтобы откатиться к какому-то коммиту, для начала давайте уйдём от текущего - т.е. от коммита 1. Для этого, необходимо создать новый коммит. А чтобы создать новый коммит - необходимо хоть что-то изменить хотя-бы в одном из файлов. Я внесу изменения в файл
index.php

Новые изменения файла index.php

Я сохраню его, выполню команды $ hg add и $ hg commit -m "new test commit" соответственно, и потом заново посмотрю дерево командой $ hg log:

Новые изменения файла index.php

А теперь сделаем откат к коммиту 1. Для этого выполним команду $ hg update -r 1.

Новые изменения файла index.php
Ключ -r означает, что мы обращаемся к репозиторию - т.е. к раннее сохраненных состояний (копий) нашего проекта. Получается, мы говорим системе, что то, что будет после этого ключа (-r) - это репозиторий, и к нему нужно обратиться.

Открываем файл index.php и видим, что мы действительно вернулись к его более ранней версии.

index.php после отката

На этом всё, а в следующих статьях мы с вами будем более глубоко знакомиться с системой контроля версий Mercurial.

Наверх