Акты Становления

109: Концепция/Версионирование

Это способ нумерации версий, где номер похож на адрес с точками (например, 1.2.feature-x.3). Он объединяет в себе обычные обновления, экспериментальные «ветки» и черновики в единую, древовидную систему.

У любой системы, которая постоянно меняется, есть две главные задачи: как-то отслеживать эти изменения (версионирование) и позволять нескольким людям работать над разными вещами одновременно (ветвление). Этот документ описывает, как мы объединили эти две идеи в одну, чтобы создавать и экспериментировать было просто и безопасно.

Из чего состоит адрес: иерархические версии

Уникальный адрес Идеи в нашей системе состоит из её пути (текстового имени, например articles/common/button) и версии. Версия — это не просто число, а целая история эволюции Идеи, записанная через точки. Для полной ясности к адресу добавляется домен (например, my-project.com), который создаёт уникальное пространство, где этот путь существует.

Например, версия 1.2.feature-x.3 рассказывает нам, что это третья попытка в рамках экспериментальной ветки feature-x, которая, в свою очередь, отделилась от основной версии 1.2. Такая структура изящно совмещает в себе и обычные версии, и ветки для экспериментов.

Версия — это как адрес в виде дерева (1.2.feature-x.3), который хранит всю историю и состояние Идеи.

Кто что видит: ветки и путь поиска

Версия показывает историю и состояние Идеи, а модель ветвления определяет, кто и где может её увидеть. Это работает с помощью двух понятий: веток и пути поиска.

Ветки: «Где» находится идея

Каждая версия Идеи в базе данных связана с одной или несколькими ветками (например, ["main", "feature/new-billing"]). Ветки — это как каналы, которые определяют, кому видна идея. Идея будет видна пользователю или программе, только если она опубликована хотя бы в одной из веток, указанных в их пути поиска.

Путь поиска: «Как» её найти

Настоящая сила системы — в пути поиска. Это список названий веток, упорядоченный по важности. Он говорит системе, где и в каком порядке искать Идею. Например, во время разработки путь поиска может быть таким: ['feature/my-new-idea', 'staging', 'main']

Такая настройка создаёт систему слоёв, как в фотошопе:

  1. Сначала система ищет Идею, опубликованную в ветке feature/my-new-idea.
  2. Если не находит, ищет в ветке staging.
  3. И только если там её нет, берёт версию из главной, стабильной ветки main.

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

Видимость контролируется ветками, которые определяют, где видна Идея. Путь Поиска (['feature-x', 'main']) — это список с приоритетами, который говорит системе, где и в каком порядке искать. Это создаёт удобные «слои», показывая экспериментальную работу поверх стабильной системы.

Как меняются версии

Версии состоят из ревизий. Они бывают числовые для последовательных, публичных версий (например, 1.2) или именованные для веток разработки (например, feature-x). Версии могут меняться двумя способами:

  • Совместимые изменения: Если правка ничего не ломает, создаётся новая маленькая ревизия (например, 1.2 становится 1.2.1).
  • Несовместимые изменения: Если правка что-то ломает, номер версии должен измениться на более высоком уровне. Изменение, несовместимое с версией 1.2, создаст новую версию 1.3. Система сама находит такие несовместимости, анализируя изменения в структуре данных. Это гарантирует, что номера версий всегда отражают реальную совместимость, и никому не нужно угадывать.