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

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

{

printf("hello, world!\");

+printf("hello again!\n"); return 0;

}

Мы называем последнюю ревизию конечной (или верхней) ревизией или просто главной.

Кстати, команда hg tip принимает многие из опций команды hg log. Так, например, -v означает «более подробно», -p — «показать патч». Использование -p для показа патча является еще одним примером последовательного подхода к именованию опций.

2.8. Распространение изменений

Ранее мы упоминали, что репозитории в Mercurial самодостаточны. Это значит, что только что созданный набор изменений существует лишь в нашем репозитории my-hello. Давайте рассмотрим несколько способов, которыми мы можем распространить это изменение в другие репозитории.

2.8.1. Получение (вытягивание) изменений из другого репозитория

Для начала клонируем наш исходный репозиторий hello, в котором нет последнего изменения, только что нами опубликованного. Назовём наш временный репозиторий hello-pull.

$ cd ..

$ hg clone hello hello-pull updating to branch default

2 files updated, 0 files merged, 0 files removed, 0 files unresolved

Мы будем использовать команду hg pull, для получения изменений из my-hello в hello-pull. Однако вытягивание вслепую неизвестных изменений в репозиторий может быть пугающей перспективой. Mercurial позволяет узнать с помощью команды hg incoming, какие изменения команда hg pull вытянет в репозиторий без реального применения изменений.

$ cd hello-pull

$ hg incoming ../my-hello comparing with ../my-hello searching for changes

changeset:

5:c3e3be994861

tag:

tip

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Thu Feb 02 14:10:17 2012 +0000

summary:

Added an extra line of output

Получение изменений в репозиторий означает выполнение команды hg pull и указание ей, из какого репозитория следует вытягивать.

$ hg tip

 

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 pull ../my-hello pulling from ../my-hello searching for changes adding changesets

adding manifests adding file changes

added 1 changesets with 1 changes to 1 files (run 'hg update' to get a working copy)

$ hg tip

20

 

 

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

 

 

 

 

 

 

changeset:

5:c3e3be994861

 

 

 

 

tag:

tip

 

 

user:

Bryan O'Sullivan <bos@serpentine.com>

 

 

date:

Thu Feb 02 14:10:17 2012 +0000

 

 

summary:

Added an extra line of output

 

 

 

 

 

Как видно из вывода команды hg tip до и после, мы успешно вытянули изменения в наш репозиторий. Тем не менее, вытягивание изменений в Mercurial отделено от обновления рабочей директории. Остается один шаг до того, как мы увидим изменения в рабочем каталоге.

Вытягивание конкретных изменений

Вполне возможно, что из-за задержки между выполнением команд hg incoming и hg pull, вы можете увидеть не все ревизии, которые будут добавлены из другого репозитория. Предположим, вы тянете изменения из репозитория где-то в сети. Пока вы смотрите вывод hg incoming, перед тем как вытащить изменения, кто-то может что-то совершить в удаленном репозитории. То есть можно вытянуть больше изменений, чем вы видели при использовании hg incoming.

Если вы хотите получить именно те изменения, которые были указаны в hg incoming, или вам требуется некоторое подмножество изменений, просто укажите id ревизии, которую хотите получить,

например hg pull -r7e95bb.

2.8.2. Обновление рабочего каталога

До сих пор мы говорили о связи между репозиторием и его рабочим каталогом. Команда hg pull, которую мы выполнили в Раздел 2.8.1, «Получение (вытягивание) изменений из другого репозитория», вытянула изменения в наш репозиторий. Но если проверить, в рабочем каталоге нет ни следа этих изменений. Это потому, что hg pull не трогает (по умолчанию) рабочий каталог. Для применения изменений мы используем команду hg update.

$ grep printf hello.c printf("hello, world!\");

$ hg update tip

1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ grep printf hello.c

printf("hello, world!\"); printf("hello again!\n");

Может показаться странным то, что hg pull не обновляет рабочий каталог автоматически. На самом деле этому есть веская причина: вы можете использовать hg update, для обновления рабочего каталога до состояния, в котором он был в любой ревизии в истории репозитория. Если бы вы обновили рабочий каталог до старой версии — например, чтобы отыскать причину ошибки, — а затем выполнили бы hg pull, которая обновляет рабочий каталог автоматически до новой версии, вы были бы ужасно недовольны этим.

Однако, так как вытягивание с последующим обновлением является распространенным явлением, Mercurial позволяет вам совместить их передачей команде hg pull ключа -u.

Если вы снова посмотрите на вывод команды hg pull в Раздел 2.8.1, «Получение (вытягивание) изменений из другого репозитория», когда мы выполнили её без -u, вы увидите, что в конце вывода было полезное напоминание о необходимости явного действия для обновления рабочего каталога.

Чтобы узнать, какая ревизия у рабочего каталога, используйте команду hg parents.

$ hg parents

 

changeset:

5:c3e3be994861

tag:

tip

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Thu Feb 02 14:10:17 2012 +0000

summary:

Added an extra line of output

 

 

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

21

5:c3e3be994861 tip
Bryan O'Sullivan <bos@serpentine.com> Thu Feb 02 14:10:17 2012 +0000
Added an extra line of output
2:fef857204a0c
Bryan O'Sullivan <bos@serpentine.com> Sat Aug 16 22:05:04 2008 +0200 Introduce a typo into hello.c.

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

стрелка, — родитель, а та вершина, куда стрелка ведёт, — потомок. Аналогично, у рабочего каталога есть родитель

— это набор изменений, который содержится в данный момент в рабочем каталоге.

Чтобы обновить рабочий каталог до конкретной ревизии, передайте номер или идентификатор ревизии команде hg update.

$ hg update 2

2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg parents

changeset:

user:

date:

summary:

$ hg update

2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg parents

changeset:

tag:

user:

date:

summary:

Если вы опустите явное указание ревизии, hg update обновит до верхней ревизии, как видно в примере выше при втором вызове hg update.

2.8.3. Передача (проталкивание) изменений в другой репозиторий

Mercurial позволяет передать изменения в другой репозиторий из репозитория, в котором мы в данный момент находимся. Как с примером hg pull выше, создадим временный репозиторий для передачи в него наших изменений.

$ cd ..

$ hg clone hello hello-push updating to branch default

2 files updated, 0 files merged, 0 files removed, 0 files unresolved

Команда hg outgoing сообщает нам об изменениях, которые будут переданы в другой репозиторий.

$ cd my-hello

$ hg outgoing ../hello-push comparing with ../hello-push searching for changes

changeset:

5:c3e3be994861

tag:

tip

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Thu Feb 02 14:10:17 2012 +0000

summary:

Added an extra line of output

И команда hg push вызывает настоящую передачу.

$ hg push ../hello-push pushing to ../hello-push searching for changes adding changesets

adding manifests adding file changes

added 1 changesets with 1 changes to 1 files

Как и hg pull, команда hg push не обновляет рабочую директорию репозитория, в который передаются изменения. (В отличие от hg pull, у hg push нет ключа -u, который обновлял бы рабочую директорию другого репозитория). Эта асимметрия является преднамеренной: репозиторий в который мы передаём изменения может находиться на удаленном сервере и распределяться между несколькими людьми. Если бы нам пришлось обновить свой рабочий каталог в то время как кто-то работал в нём, его работа была бы нарушена.

22

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