Mercurial

подготовлено редакций сайта

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

Система контроля версий Mercurial — это набор написанных на языке Python скриптов, позволяющих сохранять различные версии кода в репозиториях. Причем в качестве физического хранилища можно использовать абсолютно любую аппаратную платформу, не обязательно отдельный выделенный сервер, как это реализовано в другой популярной системе управления версиями GitHub. Репозиториев можно создавать неограниченное (точнее, на сколько хватит свободного места) количество как на своем собственном ПК, так и на компьютерах других пользователей. Также в Mercurial есть возможность обмениваться версиями с другими разработчиками, синхронизировать изменения и т. д.

Рабочий процесс в Mercurial версий

Работа с версиями исходного кода происходит следующим образом:

  • На личном ПК пользователь создает новый локальный репозиторий — либо открывает новый, либо клонирует уже имеющийся.
  • В каталоге созданного репозитория осуществляется редактирование, добавление или удаление файлов.
  • В локальном хранилище фиксируются изменения, внесенные в файлы.
  • Далее этапы 2 и 3 осуществляются столько раз, сколько необходимо для выполнения задачи.
programmers
  • Из локальных репозиториев, размещенных на ПК других пользователей, извлекаются и переносятся сделанные ими изменения, которые синхронизируются с теми, которые внес первый разработчик.
  • Пользователь также может сам отдать внесенные им в программный код изменения другим разработчикам.

Общий механизм работы Mercurial подразумевает, что любые изменения, внесенные в код, даже если они бесполезны, сохраняются как на локальном, так и на внешних репозиториях. Однако разработчику действительно часто необходимо редактировать или удалять эти изменения. Поэтому в Mercurial реализовано локальное изменение истории, которое не затрагивает внешние репозитории. Сделано это потому, что ревизии кода, сохраненные на них, могут использоваться в работе другими разработчиками, давать начало новым ветвям изменений. Чтобы отслеживание публичности и приватности изменений было удобным для пользователей, в Mercurial задействована система фаз. Всего их три:

  • Public (публичная) — к этой фазе относятся изменения, уже опубликованные во внешних репозиториях, из-за чего редактировать их нельзя.
  • Draft (черновик) — это локальный набор изменений, который пока никуда не отправлялся, из-за чего его еще можно изменять — до первой публикации во внешних репозиториях, автоматически переводящей его в фазу public.
  • Secret (секретная) — к этой фазе пользователь вручную относит те изменения, которые он по какой-либо причине не хочет публиковать (редактировать их можно свободно).

То есть, когда пользователь только создает набор изменений, они имеют статус Draft. Как было сказано выше, в Mercurial предусмотрена как ручная, так и автоматическая публикация ревизий во внешних репозиториях. Как только это происходит, изменения получают статус Public и менять их уже нельзя. Если пользователь хочет в течение какого-то времени локально работать с этими изменениями или иметь возможность вернуться к ним в будущем, то ему нужно явно придать им статус Secret.

Каталог изменений

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

Сами ревизии, сделанные пользователем, сохраняются в виде сетевой структуры взаимосвязанных друг с другом позиций (графов). Для ориентации самой Mercurial внутри этого множества наборов изменений используется система идентификаторов, включающая:

  • Номер ревизии. Это целое число (от 0 и более), показывающее порядок добавления в репозиторий. Система присваивает ревизии номер автоматически и с помощью него идентифицирует конкретный набор изменений. Для одного и того же набора ревизий, хранящихся в разных клонах репозитория, этот идентификатор может отличаться. Например, в обозначении 4:e1be1898f374 номер ревизии указан перед двоеточием.
  • Идентификатор набора изменений. Это SHA-1-хеш, состоящий из цифр и букв a, b, c, d, e, f. Система генерирует его для каждого набора изменений также автоматически, вычисляя на основе их содержимого. Поэтому данный идентификатор принадлежит одному и тому же набору изменений во всех хранилищах. Риск того, что один SHA-1-хеш будет обозначать два разных набора ревизий, крайне невелик.
  • Так как идентификатор представляет собой достаточно длинную последовательность цифр и букв, в Mercurial предусмотрена возможность не вводить полную строку при выполнении команд. Достаточно указать лишь первые несколько символов, однозначно идентифицирующих конкретный набор ревизий. Если введенных знаков будет недостаточно, система оповестит об этом пользователя. В примере обозначения 4:e1be1898f374 идентификатор указывается после двоеточия.
  • Метки (теги). Это символическое имя, которое присваивается каждому набору изменений в дополнение к номерам и идентификаторам. У одного набора ревизий может быть одна или несколько меток. Имя тега не может содержать некоторые символы — в частности, двоеточие, которое используется в обозначении ревизий для разделения между идентификатором и номером. Если пользователь применил в теге недопустимый символ, система сразу же оповестит об этом.
  • Название ветки. Оно идентифицирует не конкретный набор изменений, а их ветку, то есть побочную группу графов в структуре каталога. Название ветки присваивается ей при создании и никогда не изменяется.
programmers

Команды в Mercurial

Для работы с версиями программного кода и их изменениями в Mercurial используются следующие команды

  • Работа с репозиторием: hg init — создает новое хранилище в текущей директории; hg clone — клонирует его; hg pull — извлекает ревизии из репозитория; hg push — пересылает изменения на сервер.
  • Работа с ветками: hg branch — создает новую и дает ей название; hg branches — показывает все текущие; hg branch — отображает ту, в которой расположена рабочая копия; hg heads — демонстрирует головные изменения в существующих ветках; hg update — обновляет рабочую директорию до уровня, зафиксированного в головной ревизии, hg merge — объединяет текущую ревизию с головной в указанной ветке.
  • Работа с тегами: hg tag — присваивает метку текущей ветке изменений.
  • Работа с изменениями: hg commit — фиксирует текущее состояние программного кода, сохраняя ревизии в репозитории.

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

  • К примеру, вместо hg commit можно использовать сокращения hg commi, hg comm или hg com. Однако при введении hg c Mercurial откажет в выполнении и сообщит, что «команда c неоднозначна», так как это имя может обозначать несколько директив.
  • Другой пример: применять директиву hg co для сокращенного обозначения hg commit тоже нельзя, так как она является псевдонимом для hg update. В то же время для команды hg commit можно использовать сокращение hg ci.