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

Экскурсия по Mercurial: слияние результатов работы

Рисунок 3.3. Рабочий каталог и репозиторий во время и после совершения слияния

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

3.2. Слияние конфликтующих изменений

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

Рисунок 3.4. Конфликт изменений в документе

Рисунок 3.4, «Конфликт изменений в документе» показывает пример конфликта двух изменений в документе. Мы начали с одной версии файла, затем сделали несколько изменений, в то время, как кто-то другой также изменял этот текст. Наша задача в разрешении конфликта изменений — решить, как должен выглядеть окончательный вариант файла.

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

29

Экскурсия по Mercurial: слияние результатов работы

Можно указать Mercurial использовать определённую программу, установив переменную окружения HGMERGE со значением имени необходимой программы.

3.2.1. Использование графического инструмента слияния

Мой любимый графический инструмент слияния это kdiff3, и его я буду использовать для описания возможностей, которые являются общими для графических инструментов слияния. На Рисунок 3.5, «Использование kdiff3 для слияния версий файлов» показан снимок экрана kdiff3 в работе. Выполняемое таким образом слияние называется тройственным (three-way), потому что есть три различные версии файла, интересующие нас. В инструменте сравнения верхняя часть окна поделена на три панели:

Слева базовая версия файла, т.е. самая последняя версия, после которой произошло разделение на те две версии, которые мы пытаемся объединить.

Посередине «наша» версия файла, содержащая наши изменения.

Справа «их» версия файла, то есть версия из ревизии, с которой мы производим слияние.

На панели снизу располагается текущий результат слияния. Наша задача — заменить весь красный текст, означающий неразрешенные конфликты, на осмысленный результат слияния «нашей» и «их» версий файла.

Все четыре панели связаны друг с другом. Если мы начнем прокручивать любую из них по вертикали или по горизонтали, остальные панели последуют за нами и будут показывать соответствующие части файлов.

Рисунок 3.5. Использование kdiff3 для слияния версий файлов

Для каждого конфликтующего участка файла можно выбрать для разрешения конфликта любое сочетание текстов из базовой, нашей и их версий. Мы также можем вручную отредактировать результирующий файл в любое время, если требуются дополнительные изменения.

Существует множество инструментов слияния файлов, слишком много, чтобы их здесь описать. Они различаются доступностью для разных платформ и имеют свои слабые и сильные стороны. Большинство предназначены для слияния файлов, содержащих простой текст, но некоторые — для специализированных форматов (обычно XML).

30

Экскурсия по Mercurial: слияние результатов работы

3.2.2. Рабочий пример

В этом примере мы воспроизведем историю модификации файла с Рисунок 3.4, «Конфликт изменений в документе». Давайте начнем с создания пустого репозитория с базовой версией нашего документа.

$ cat > letter.txt <<EOF

>Greetings!

>I am Mariam Abacha, the wife of former

>Nigerian dictator Sani Abacha.

>EOF

$ hg add letter.txt

$ hg commit -m '419 scam, first draft'

Мы клонируем репозиторий и изменим файл.

$ cd ..

$ hg clone scam scam-cousin updating to branch default

1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd scam-cousin

$ cat > letter.txt <<EOF

>Greetings!

>I am Shehu Musa Abacha, cousin to the former

>Nigerian dictator Sani Abacha.

>EOF

$ hg commit -m '419 scam, with cousin'

Добавим еще одну копию и сымитируем, будто кто-то еще сделал изменение этого файла. Это намёк, что объединять свои же изменения — обычное дело, особенно когда вы разносите задачи по отдельным хранилищам, и вам нужно находить и разрешать конфликты между ними.

$ cd ..

$ hg clone scam scam-son updating to branch default

1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd scam-son

$ cat > letter.txt <<EOF

>Greetings!

>I am Alhaji Abba Abacha, son of the former

>Nigerian dictator Sani Abacha.

>EOF

$ hg commit -m '419 scam, with son'

Создав две разных версии файла, создадим окружение, в котором можно будет произвести наше объединение.

$ cd ..

$ hg clone scam-cousin scam-merge updating to branch default

1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd scam-merge

$ hg pull -u ../scam-son pulling from ../scam-son searching for changes adding changesets

adding manifests adding file changes

added 1 changesets with 1 changes to 1 files (+1 heads)

not updating: crosses branches (merge branches or update --check to force update)

В данном случае, я установил такое значение HGMERGE, чтобы Mercurial использовал консольную команду merge. Она встроена во многие Unix-подобные системы. Если вы выполняете этот пример на своём компьютере, то можете себя этим не утруждать. Вы просто передадите файл графическому инструменту для слияний, что гораздо предпочтительнее.

$ export HGMERGE=merge $ hg merge

merging letter.txt

/bin/sh: merge: command not found merging letter.txt failed!

0 files updated, 0 files merged, 0 files removed, 1 files unresolved

31

Хорошо было бы, по возможности, сократить количество шагов. расширением fetch, которое делает именно это.
Экскурсия по Mercurial: слияние результатов работы
use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon $ cat letter.txt
Greetings!
I am Shehu Musa Abacha, cousin to the former Nigerian dictator Sani Abacha.
Так как merge не может самостоятельно выбрать правильное из противоречащих изменений, она оставляет маркеры слияния в файле с конфликтами, обозначая наши и их строки, содержащие противоречие.
Mercurial может определить, как завершилась merge, и если слияние не удалось, то он говорит, какие команды надо запустить, чтобы выполнить слияние по новой. Это может быть полезно, если мы запустили графическую утилиту объединения и вышли из нее, если что-то оказалось непонятно, или мы сделали ошибку.
Если автоматическое или ручное объединение не удалось, то ничто не мешает нам самим «поправить» пострадавшие файлы и закоммитить результаты слияния:
$ cat > letter.txt <<EOF > Greetings!
> I am Bryan O'Sullivan, no relation of the former > Nigerian dictator Sani Abacha.
> EOF
$ hg resolve -m letter.txt
$ hg commit -m 'Send me your money' $ hg tip
changeset: 3:a31b9a7b1e74 tag: tip
parent: 1:1504df74de25 parent: 2:203073c5900c
user: Bryan O'Sullivan <bos@serpentine.com> date: Thu Feb 02 14:10:25 2012 +0000 summary: Send me your money
Где команда hg resolve?
Команда hg resolve была добавлена в Mercurial 1.1, выпущенный в декабре 2008 года. Если вы используете старую версию Mercurial (запустите hg version, чтобы узнать номер версии), эта команда вам недоступна. Если вы используете Mercurial версии ниже 1.1, вам следует подумать об обновлении прежде, чем пытаться решать сложные слияния.
3.3. Упрощение последовательности pull-merge- commit
Процесс слияния изменений, как говорилось выше, прост, но требует выполнения последовательности из трёх команд.
hg pull -u hg merge
hg commit -m 'Merged remote changes'
В случае финального коммита вам также необходимо ввести комментарий, который в большинстве случаев — кусок неинтересного «стереотипного» текста.

И действительно, Mercurial поставляется с

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

Расширение fetch добавляет новую команду hg fetch. По сути, это комбинация команд hg pull -u, hg merge и hg commit. Выполнение команды начинается с получения изменении из необходимого репозитория в текущий.

32

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