Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
hgbook.pdf
Скачиваний:
52
Добавлен:
17.03.2015
Размер:
3.15 Mб
Скачать

Экскурсия по Mercurial: основы

Если клонирование прошло успешно, то у вас должен появится каталог под названием hello. В нем должны быть какие-то файлы.

$ ls -l total 0

drwxr-x--- 3 slava slava 100 Feb 2 14:10 hello $ ls hello

Makefile hello.c

У файлов в нашем репозитории то же самое содержимое и история, как и в исходном.

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

Это означает, что вы можете свободно экспериментировать с вашим репозиторием. Это безопасно, потому что ваш репозиторий — «закрытая песочница», изменения в котором не повлияют ни на что, кроме него самого.

2.3.2. Что есть в репозитории?

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

.hg. Это место, где Mercurial хранит все метаданные репозитория.

$ cd hello $ ls -a

. .. .hg Makefile hello.c

Содержание каталога .hg и его подкаталогов является собственностью Mercurial. Со всеми остальными файлами и каталогами в репозитории мы можем делать что угодно.

Строго говоря, каталог .hg — это и есть «настоящий» репозиторий, а все остальные файлы и каталоги рядом с ним называются рабочим каталогом. Разницу запомнить довольно просто — репозиторий содержит всю историю вашего проекта, в то время как рабочий каталог содержит слепок вашего проекта в определенной точке истории.

2.4. Путешествие по истории

Самое первое, что вы захотите сделать с новым, неизвестным репозиторием — изучить его историю. Команда hg log предназначена как раз для этого.

$ hg log

 

changeset:

4:2278160e78d4

tag:

tip

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:16:53 2008 +0200

summary:

Trim comments.

changeset:

3:0272e0d5a517

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:08:02 2008 +0200

summary:

Get make to generate the final binary from a .o file.

changeset:

2:fef857204a0c

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:05:04 2008 +0200

summary:

Introduce a typo into hello.c.

changeset:

1:82e55d328c8c

user:

mpm@selenic.com

date:

Fri Aug 26 01:21:28 2005 -0700

summary:

Create a makefile

changeset:

0:0a04b987be5a

user:

mpm@selenic.com

date:

Fri Aug 26 01:20:50 2005 -0700

summary:

Create a standard "hello, world" program

 

 

12

Экскурсия по Mercurial: основы

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

hg log выводит записи со следующими полями:

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

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

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

summary. Первая строка комментария к ревизии, который оставил её автор.

Некоторые наборы изменений, таких, как первая, имеют поле tag (тэг). Теги это еще один способ идентифицировать набор изменений, придав ему легкое для запоминания имя. (Тег с названием tip специальный: он всегда относится к новейшему изменению в репозитарии.)

По умолчанию hg log выводит очень общие сведения, с отсутствием множества деталей.

Рисунок 2.1, «Графическое представление истории репозитория hello» содержит графическое представление истории репозитория hello, что слегка облегчает понимание того, в каком направлении «развивается» его история. Мы будем возвращаться к этому рисунку в этой и следующей главах.

Рисунок 2.1. Графическое представление истории репозитория hello

2.4.1. Изменения, ревизии и общение с другими людьми

Английский язык печально известен своей небрежностью, а компьютерная наука имеет обширную историю неразберихи в терминах (зачем один термин, если можно использовать четыре). В контроле версий есть множество слов и фраз, означающих одно и то же. Если речь идет об истории в Mercurial, вы увидите, что слово «changeset» (набор изменений), обычно сокращается до «change», или (при письме), до «cset», а иногда «changeset» называют

«revision» (ревизия) или «rev».

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

13

Экскурсия по Mercurial: основы

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

Шестнадцатеричная строка — постоянный, неизменный параметр, который всегда идентифицирует одну и ту же ревизию в каждой копии репозитория.

Это различие очень важно. Если вы отправите кому-нибудь письмо с упоминанием «ревизии 33», существует большая вероятность, что их ревизия 33 будет совсем другой. Причиной этого является то, что номер ревизии зависит от порядка, в котором ревизии попадают в репозиторий, и нет никакой гарантии, что одни и те же изменения произойдут в одинаковом порядке в различных репозиториях. Три изменения А, Б и В запросто могут появится в одном репозитории в порядке 0,1,2, а в другом — 0,2,1.

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

2.4.2. Просмотр определенных ревизий

Чтобы ограничить вывод команды hg log до одной ревизии, используйте опцию -r (или --rev). Вы можете использовать или номер ревизии или ее идентификатор, а также запросить ревизий столько, сколько вам захочется.

$ hg log -r 3

 

changeset:

3:0272e0d5a517

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:08:02 2008 +0200

summary:

Get make to generate the final binary from a .o file.

$ hg log -r 0272e0d5a517

changeset:

3:0272e0d5a517

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:08:02 2008 +0200

summary:

Get make to generate the final binary from a .o file.

$ hg log -r 1 -r 4

changeset:

1:82e55d328c8c

user:

mpm@selenic.com

date:

Fri Aug 26 01:21:28 2005 -0700

summary:

Create a makefile

changeset:

4:2278160e78d4

tag:

tip

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:16:53 2008 +0200

summary:

Trim comments.

 

 

Если вы хотите увидеть историю нескольких ревизий, но не хотите просматривать их все, можете указать диапазон, как бы выражая мысль: «Мне нужны все ревизии от А до Б включительно».

$ hg log -r 2:4

changeset:

2:fef857204a0c

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:05:04 2008 +0200

summary:

Introduce a typo into hello.c.

changeset:

3:0272e0d5a517

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:08:02 2008 +0200

summary:

Get make to generate the final binary from a .o file.

changeset:

4:2278160e78d4

tag:

tip

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Sat Aug 16 22:16:53 2008 +0200

summary:

Trim comments.

Mercurial учитывает порядок, в котором ревизии были указаны, так что hg log -r 2:4 выводит ревизии 2,3 и 4. Тогда как hg log -r 4:2 — 4,3 и 2.

14

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]