Меню

Главная
Случайная статья
Настройки
Mercurial
Материал из https://ru.wikipedia.org

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

Mercurial появился в результате того же конфликта, что привёл к созданию Git. Автором новой системы стала Оливия Мэкол (англ. Olivia Mackall), в то время известный, как Мэтт Мэкол (англ. Matt Mackall).

Содержание

Описание

Система Mercurial написана на Python, хотя чувствительные к производительности части (например, своя реализация diff) выполнены в качестве модулей-расширений на C[6]. Для повышения производительности также используется Rust.[7] Mercurial первоначально была написана для Linux, позже портирована под Windows, macOS и большинство Unix-систем. Репозитории Mercurial управляются при помощи утилиты командной строки hg, но есть и GUI-интерфейсы.

Наряду с традиционными возможностями систем контроля версий, Mercurial поддерживает полностью децентрализованную работу (отсутствует понятие основного хранилища кода), ветвление (возможно вести несколько веток одного проекта и копировать изменения между ветками), слияние репозиториев (чем и достигается «распределённость» работы). Поддерживается обмен данными между репозиториями через HTTP/HTTPS, SSH и вручную при помощи упакованных наборов изменений.

Утилита hg обладает компактным интерфейсом, и Mercurial считается более простой в освоении системой, чем, например, git[8].

Концепции

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

Mercurial является распределённой (децентрализованной) системой контроля версий. Это означает, что рабочий процесс, как правило, выглядит следующим образом:
  1. На личном компьютере создаётся новый репозиторий (путём клонирования существующего репозитория, создания нового и т. п.);
  2. В рабочем каталоге данного репозитория изменяются/добавляются/удаляются файлы;
  3. Выполняется фиксация (commit) изменений в данный репозиторий (то есть в локальный репозиторий на личном компьютере);
  4. Шаги 2 и 3 повторяются столько раз, сколько необходимо;
  5. Забираются (pull) чужие наборы изменений;
  6. Производится слияние изменений (merge);
  7. Отдаются (push) собственные.


То есть вся повседневная работа происходит в локальном репозитории, а когда возникает необходимость, производится отправка результатов своей работы в один или несколько других репозиториев. Количество шагов при работе с отдалёнными репозиториями можно сократить, если настроить Mercurial на автоматическую отправку изменений в другие репозитории при выполнении фиксации[9].

Консольная программа

Консольная программа реализована таким образом, что название любой команды можно сокращать до тех пор, пока её имя остаётся однозначным. Плюс некоторые команды имеют псевдонимы. Например, вместо hg commit можно написать hg commi, hg comm или hg com, но если написать hg c, то Mercurial откажется выполнять эту команду, сообщив, что «команда 'c' неоднозначна» и приведя список команд, которые попадают под это сокращение. Использовать hg co в качестве сокращения для hg commit нельзя, так как это псевдоним для команды hg update, однако доступно сокращение hg ci.

Логическая структура наборов изменений

При вызове команды hg commit выполняется фиксация изменений. При этом программа сохраняет в репозиторий набор изменений (англ. changeset или ревизия). Физически происходят те же изменения, что и у вас, но сохраняются они в служебные файлы, а не в копии (подробнее в За кулисами).

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

Узнать идентификаторы родительских наборов изменений, с которыми связаны зафиксированные наборы изменений, можно с помощью команды hg log --debug. У каждого набора изменений будет два родителя (благодаря чему возможно ветвление внутри репозитория, см. hg -v help branch). Значение «-1:0000000000000000000000000000000000000000» означает отсутствие родителя. Например, у самого первого набора изменений в репозитории данное значение будет проставлено для обоих родителей, а у последующих данное значение будет проставлено для второго родителя (если для них в репозитории не использовалось ветвление), а для первого родителя будет проставлен идентификатор от предыдущего набора изменений.

Рабочий каталог также полезно представлять в виде такого же набора изменений (который пока не зафиксирован, но, возможно, вскоре также будет зафиксирован). Рабочий каталог также связан с одним или двумя родительскими наборами изменений, узнать о которых можно с помощью команды hg parents. После фиксации изменений данные родители станут родителями для нового (уже зафиксированного) набора изменений.

Идентификация наборов изменений

Ревизии распознают по следующим признакам[10]:
  • номеру ревизии;
  • идентификатору набора изменений;
  • меткам (тег);
  • имени ветки.


Номер ревизии представляет собой целое число, отражающее порядок, в котором наборы изменений были добавлены в хранилище. Номер ревизии начинается с нуля, присваивается набору изменений автоматически и может использоваться для идентификации наборов изменений. Номер ревизии для одного и того же набора изменений может различаться в каждом из клонов хранилища. В выводе команды hg log номер ревизии можно увидеть перед двоеточием (например, «4:e1be1898f374»).

Идентификатор набора изменений представляет собой SHA-1-хеш в виде шестнадцатеричного числа. Идентификатор набора изменений присваивается каждому набору изменений автоматически, вычисляется на основе содержимого этого набора изменений, поэтому соответствует одному и тому же набору изменений во всех репозиториях. Вероятность коллизии, когда для двух разных наборов изменений будет сгенерирован один и тот же SHA-1-хеш, крайне мала.

Mercurial не требует ввода полной строки идентификатора при использовании его в командах, ему достаточно лишь той его начальной части, которая однозначно идентифицирует требуемый набор изменений (в противном случае, Mercurial сообщит о неоднозначности). В выводе команды hg log идентификатор набора изменений можно увидеть после двоеточия (например, «4:e1be1898f374»). Без параметра --debug команда hg log выводит не полный, а сокращённый (из 12 символов) идентификатор набора изменений.

В дополнение к номеру ревизии и идентификатору набора изменений, Mercurial предоставляет возможность присваивать каждому набору изменений одно или более произвольных символических имён, называемых метками (или тегами). Присваиваются метки с помощью команды hg tag, а посмотреть все добавленные метки можно с помощью команды hg tags. Имя метки не может содержать некоторые символы (например ": "), о чём, в случае необходимости, Mercurial сообщит при выполнении команды hg tag.

Везде, где в командах можно указать идентификатор набора изменений, можно подставить имя метки.

Каждая ветка имеет собственное название. Оно указывается при создании ветки и больше никогда не изменяется.

Неочевидные моменты
Downgrade Counter