понедельник, 23 марта 2009 г.

Работа с ветками: push, pull, merge (Часть 1)

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

Команды

branch
Ветка
Создать новую ветку
merge
Объединить
Объединить изменения из разных веток
pull
Тянуть, втягивать (направление движения: на себя)
Получить (загрузить) изменения из другой ветки в рабочую ветку
push
Толкать, выталкивать (направление движения: от себя)
Передать (отправить) изменения из рабочей ветки в другую ветку
missing
Недостающий, отсутствующий
Просмотр набора ревизий, различающихся между двумя ветками

Графы ревизий

Рассматриваемые команды в первую очередь работают с историей изменений. История хранится в bzr в виде DAG, поэтому в описании работы будем использовать соответствующие графы, помечая знаком "O" отдельные (ключевые) ревизии. Считаем что ревизии растут снизу вверх, т.е. вверху более новые. Рассматривая две родственные ветки, мы можем иметь 4 возможных типа графов:

O Рабочая ветка, другая ветка
|
O
Ветки содержат одинаковый набор ревизий
O Рабочая ветка
|  O Другая ветка
| /
O
|
O
Ветки содержат различный набор ревизий, история "разошлась"
O Рабочая ветка
|
O
Другая ветка
|
O
Рабочая ветка является продолжением другой ветки; рабочая ветка имеет новые ревизии (относительно истории другой ветки)
O Другая ветка
|
O
Рабочая ветка
|
O
Другая ветка является продолжением рабочей ветки; в рабочей ветке отсутствуют новые ревизии (относительно истории другой ветки)

   
Команда branch

Команда branch создает копию существующей ветки. После выполнения этой команды обе ветки содержат одинаковый набор ревизий, что соответствует графу 1.

Команда merge

Команда merge используется в случаях, когда две ветки "разошлись", т.е. имеют различный набор ревизий, что соответствует графу 2. Эта команда объединяет ревизии рабочей ветки с другой веткой. После фиксации объединения граф ревизий будет содержать все ревизии из другой ветки. Другая ветка при этом не изменяется.

Граф ревизий после объединения:

O Рабочая ветка
|\
O \
|  O
Другая ветка
| /
O
|
O

Такой граф уже ближе к графу номер 3, когда рабочая ветка является продолжением другой ветки.

В случаях, когда история еще не разошлась, имеется возможность использовать команды push и pull для синхронизации веток.

Команда push

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

C:\work\bzr-day\a>bzr push ../other
All changes applied successfully.
Pushed up to revision 3.

Если обе ветки уже синхронизированы, то команда push сообщит об этом::

C:\work\bzr-day\a>bzr push ../other
No new revisions to push.

В случае, когда история двух веток разошлась, команда выдаст ошибку и предложит сделать merge:

C:\work\bzr-day\b>bzr push ../a
bzr: ERROR: These branches have diverged.  Try using "merge" and then "push".

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

Команда pull является полной противоположностью команде push: она предназначена для синхронизации рабочей ветки с другой веткой. В случае, когда другая ветка содержит новые ревизии, которые отсутствуют в рабочей ветке (как показано на графе 4), пользователь может загрузить новые ревизии из другой ветки командой pull. После выполнения команды pull обе ветки будут синхронизированы (см. граф 1).

C:\work\bzr-day\other>bzr pull ../a
All changes applied successfully.
Now on revision 3.

Если обе ветки уже синхронизированы, то команда pull сообщит об этом::

C:\work\bzr-day\other>bzr pull ../a
No revisions to pull.

В случае, когда история двух веток разошлась, команда выдаст ошибку и предложит сделать merge:

C:\work\bzr-day\b>bzr pull ../a
bzr: ERROR: These branches have diverged. Use the merge command to reconcile them.

Команда pull часто используется для обновления локальной копии ветки, которая находится на общем сервере.
Команда missing

Команда missing — это информационная команда. Она позволяет сравнить наборы ревизий в двух ветках и увидеть какие ревизии содержатся в одной ветке и отсутствуют в другой. Команду missing удобно использовать перед запуском команд push, pull или merge, чтобы яснее представлять себе общий граф ревизий двух веток.

Вывод команды missing разделен на 2 части: сначала выводится список ревизий в рабочей ветке, которые отсутствуют в другой ветке; затем список ревизий из другой ветки, которые отсутствуют в рабочей ветке. Вывод списка ревизий аналогичен выводу команды log.

C:\work\bzr-day\b>bzr missing ../a
You have 1 extra revision(s):
------------------------------------------------------------
revno: 3
committer: Базарный день <ru_bzr@googlegroups.com>
branch nick: b
timestamp: Mon 2009-03-23 08:47:47 +0200
message:
  Новая ревизия в ветке b



You are missing 1 revision(s):
------------------------------------------------------------
revno: 3
committer: Базарный день <ru_bzr@googlegroups.com>
branch nick: a
timestamp: Mon 2009-03-23 08:47:39 +0200
message:
  Новая ревизия в ветке a

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

Если история веток еще не разошлась (см. графы 3 и 4), то команда missing покажет только новые/недостающие ревизии:

C:\work\bzr-day\a>bzr missing ../other
You have 1 extra revision(s):
------------------------------------------------------------
revno: 3
committer: Базарный день <ru_bzr@googlegroups.com>
branch nick: a
timestamp: Mon 2009-03-23 08:47:39 +0200
message:
  Новая ревизия в ветке a


C:\work\bzr-day\other>bzr missing ../a
You are missing 1 revision(s):
------------------------------------------------------------
revno: 3
committer: Базарный день <ru_bzr@googlegroups.com>
branch nick: a
timestamp: Mon 2009-03-23 08:47:39 +0200
message:
  Новая ревизия в ветке a

Обе ветки синхронизированы:

C:\work\bzr-day\a>bzr missing ../a
Branches are up to date.

Итак, в первой части статьи было показано как работают команды push, pull, missing. В второй части этой статьи рассмотрим сценарий работы с использованием этих команд.

3 комментария:

  1. На примере четырёх типов веток
    я наконец понял смысл
    коммандам push и pull.

    Спасибо за такое наглядное обьяснение !

    Коля

    ОтветитьУдалить
  2. да блин!!! хорошая объяснялка

    ОтветитьУдалить