.. _using-stacked-branches:

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

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

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

* Новая ветка может быть в абсолютно другом месте по сравнению с веткой на
  которой она основана как стек.

* Удаление ветки в стеке на самом деле удаляет ревизии (а не оставляет их в
  разделяемом репозитории).

* Стек веток более безопасен чем разделяемые репозитории, т.к. репозиторий на
  котором основан стек может иметь доступ только для чтения для разработчиков
  которые фиксируют изменения на ветке в стеке.

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


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

Что бы создать ветку в стеке нужно использовать опцию ``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


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

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