Использование стека веток

Что такое ветка в стеке?

Ветка в стеке - это ветка которая знает как найти ревизии в другой ветке. Ветка в стеке хранит только уникальные ревизии, которые при этом быстрее создавать и они более эффективны по занимаемому месту. По этим показателям стек веток похож на разделяемые репозитории. Конечно стек веток имеет дополнительные преимущества:

  • Новая ветка может быть в абсолютно другом месте по сравнению с веткой на которой она основана как стек.
  • Удаление ветки в стеке на самом деле удаляет ревизии (а не оставляет их в разделяемом репозитории).
  • Стек веток более безопасен чем разделяемые репозитории, т.к. репозиторий на котором основан стек может иметь доступ только для чтения для разработчиков которые фиксируют изменения на ветке в стеке.

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

Создание ветки в стеке

Что бы создать ветку в стеке нужно использовать опцию stacked для команды branch. Например:

bzr branch --stacked source-url my-dir

Здесь мы создадим my-dir как ветку в стеке без локальных ревизий. Если определено открытая ветка связанная с source-url будет использована как основа стека. Иначе source-url будет основой стека.

Создание рабочего каталога в стеке

Поддержка прямого создания рабочего каталога в стеке скоро ожидается. Пока для этого требуется два шага:

  1. Создать ветку в стеке, как описано выше.
  2. Конвертировать ветку в рабочий каталог используя либо команду reconfigure, либо команду bind.

Публикация ветки в стеке

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

bzr push --stacked-on reference-url my-url

Эта команда создаст новую ветку my-url, которая будет основана на reference-url и содержать только ревизии из текущей ветки, которых еще нет на ветке reference-url.

Если локальная ветка была создана как ветка в стеке то мы можем использовать опцию --stacked для команды push и тогда ветка на которой будет основан стек будет задана неявно. Например:

bzr branch --stacked source-url my-dir
cd my-dir
(меняем, меняем, меняем)
bzr commit -m "исправление ошибки"
bzr push --stacked

Ограничения веток в стеке

Важная вещь которую надо запомнить в отношении веток в стеке - ветка на которой основан стек должна быть доступна практически для всех операций. Конечно это не проблема если обе ветки локальные, или находятся на одном сервере.