Ранее мы рассмотрели базовую работу с ветками. В дополнение к branch и merge, сегодня мы рассмотрим еще несколько дополнительных команд. В первой части рассмотрим как они работают. Во второй части рассмотрим пример их использования.
Команды
branch | Ветка | Создать новую ветку |
merge | Объединить | Объединить изменения из разных веток |
pull | Тянуть, втягивать (направление движения: на себя) | Получить (загрузить) изменения из другой ветки в рабочую ветку |
push | Толкать, выталкивать (направление движения: от себя) | Передать (отправить) изменения из рабочей ветки в другую ветку |
missing | Недостающий, отсутствующий | Просмотр набора ревизий, различающихся между двумя ветками |
Графы ревизий
Рассматриваемые команды в первую очередь работают с историей изменений. История хранится в bzr в виде DAG, поэтому в описании работы будем использовать соответствующие графы, помечая знаком "O" отдельные (ключевые) ревизии. Считаем что ревизии растут снизу вверх, т.е. вверху более новые. Рассматривая две родственные ветки, мы можем иметь 4 возможных типа графов:
Команда branchРассматриваемые команды в первую очередь работают с историей изменений. История хранится в bzr в виде DAG, поэтому в описании работы будем использовать соответствующие графы, помечая знаком "O" отдельные (ключевые) ревизии. Считаем что ревизии растут снизу вверх, т.е. вверху более новые. Рассматривая две родственные ветки, мы можем иметь 4 возможных типа графов:
O Рабочая ветка, другая ветка | O | Ветки содержат одинаковый набор ревизий |
O Рабочая ветка | O Другая ветка | / O | O | Ветки содержат различный набор ревизий, история "разошлась" |
O Рабочая ветка | O Другая ветка | O | Рабочая ветка является продолжением другой ветки; рабочая ветка имеет новые ревизии (относительно истории другой ветки) |
O Другая ветка | O Рабочая ветка | O | Другая ветка является продолжением рабочей ветки; в рабочей ветке отсутствуют новые ревизии (относительно истории другой ветки) |
Команда branch создает копию существующей ветки. После выполнения этой команды обе ветки содержат одинаковый набор ревизий, что соответствует графу 1.
Команда merge
O Рабочая ветка
|\
O \
| O Другая ветка
| /
O
|
O
Команда push
Команда merge
Команда merge используется в случаях, когда две ветки "разошлись", т.е. имеют различный набор ревизий, что соответствует графу 2. Эта команда объединяет ревизии рабочей ветки с другой веткой. После фиксации объединения граф ревизий будет содержать все ревизии из другой ветки. Другая ветка при этом не изменяется.
Граф ревизий после объединения:O Рабочая ветка
|\
O \
| O Другая ветка
| /
O
|
O
Такой граф уже ближе к графу номер 3, когда рабочая ветка является продолжением другой ветки.
В случаях, когда история еще не разошлась, имеется возможность использовать команды push и pull для синхронизации веток.
В случаях, когда история еще не разошлась, имеется возможность использовать команды 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".
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.
Команда 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
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.
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 покажет только новые/недостающие ревизии:
Если история веток еще не разошлась (см. графы 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. В второй части этой статьи рассмотрим сценарий работы с использованием этих команд.
На примере четырёх типов веток
ОтветитьУдалитья наконец понял смысл
коммандам push и pull.
Спасибо за такое наглядное обьяснение !
Коля
да блин!!! хорошая объяснялка
ОтветитьУдалить