Перейти к содержанию

Ветки разработки

История каталога пока развивается по одной линии: исходники, редакционная правка, правила исключения. Следующее изменение — пояснение о начале обучения — хочется подготовить отдельно. Основная линия должна оставаться в известном состоянии, пока мы обсуждаем текст и состав нового результата.

Ветка позволяет назвать такую линию изменений и перемещаться между сохранёнными состояниями. Рассмотрим её на одном Markdown-файле, не создавая второй проект и не подключая GitLab. Оглавление курса и архив дают исходники lesson-04/start. В этой локальной партии учебные команды не выполнялись; граф и статус ниже являются ожидаемыми.

Ссылка на коммит

В конце прошлого урока ветка main указывает на коммит с .gitignore. Обозначим его C. Для независимого чтения подготовьте новый лабораторный репозиторий по сценарию архива: в нём можно объединить прежние исходники в начальный снимок. Имена A, B, C нужны для объяснения зависимостей, а не для повторения конкретных хешей.

Ветка — ссылка на коммит, а не отдельная физическая копия всех файлов. Две ветки могут первоначально указывать на один и тот же снимок. Рабочая папка показывает содержимое выбранной линии, а Git хранит необходимые объекты в своей служебной базе. Это делает создание ветки быстрым даже для большого набора исходников.

A — B — C
        ↑ main

Дополнительно Git использует HEAD для обозначения текущего положения. При обычной работе с веткой HEAD связан с её именем. Когда мы создаём коммит, текущая ветка передвигается вперёд. Ссылка другой ветки сама по себе не меняется, даже если прежде обе смотрели на одинаковый коммит.

На схеме сейчас важна зависимость: B опирается на A, C на B. Коммит не «лежит в папке ветки» и может быть достижим по нескольким именам. Поэтому после слияния историю общей работы можно продолжать без копирования статьи из одного каталога в другой.

Создание линии изменения

Начните с чистого статуса и убедитесь, что выбрана main:

git status --short
git branch --show-current
git switch -c feature/course-summary
git branch --show-current

Параметр -c создаёт новую ветку и переключает рабочее положение на неё. В этом сценарии новая ветка начинается от текущей вершины main. Имя feature/course-summary описывает задачу; слеш является частью имени, а не указанием создать вложенную папку проекта.

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

В content/courses.md после строки «Уроки сгруппированы по темам.» добавьте отдельный абзац:

Выберите тему и начните с первого урока.

Не меняйте названия курсов и URL. Одно изменение должно отвечать одному результату: посетителю яснее, как начать чтение. Теперь подготовьте и сохраните правку:

git diff -- content/courses.md
git add content/courses.md
git diff --cached
git commit -m "Пояснить начало обучения в каталоге"

Ожидается новый коммит D, родитель которого — C. Он становится вершиной текущей ветки. Ветка main продолжает указывать на C, поскольку во время записи была выбрана другая линия. Сохранение результата в feature не делает его частью основной линии автоматически.

Рабочая папка при переключении

Убедитесь, что статус пуст, затем перейдите обратно:

git switch main
git branch --show-current
git log --oneline --graph --all

В рабочем courses.md ожидается исчезновение нового поясняющего абзаца. Это не потеря текста: он сохранён в D, на который указывает feature. Переключение показывает снимок, выбранный через main. Вернувшись командой git switch feature/course-summary, вы снова увидите абзац.

A — B — C — D
        ↑   ↑ feature/course-summary
       main

Схема подчёркивает, что пока основная линия не содержит новых коммитов после C. Слияние такой ветки может быть простым передвижением ссылки. В следующем уроке специально добавим другое изменение на main, чтобы разобрать объединение двух развившихся линий через общего предка.

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

Незавершённая правка и ветка

Чистое дерево перед переключением — договор этого курса. Сам Git не всегда требует полной чистоты: он может перенести незакоммиченные изменения, если переключение не приводит к их потере. Поэтому утверждение «любая правка блокирует switch» было бы неверным. Условия команды описаны в документации git-switch.

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

Если переключение остановилось из-за возможной потери ваших изменений, прочитайте статус и diff. Не добавляйте принудительный параметр, чтобы просто добиться переключения. В лаборатории можно закончить осмысленный коммит или вручную вернуть точный исходник перед продолжением. В рабочем проекте выбор зависит от того, нужно ли сохранять черновую работу.

Название ветки также не подтверждает, что изменение готово. Готовность определяется содержимым коммитов и принятым результатом. Ветка «готово» может указывать на незавершённый код, а аккуратно названная feature — содержать несколько согласованных шагов. Имена помогают ориентироваться, но не заменяют чтение истории.

Отдельно рассмотрим связь ветки с постоянным адресом страницы. Имя feature/course-summary не является частью URL каталога и не попадает в Markdown-ссылки. Когда готовое изменение позже объединят с основной линией, посетитель продолжит пользоваться теми же адресами. Ветки организуют разработку исходников; адреса страниц задаются содержимым проекта и правилами сборки. Это различие особенно полезно при обновлении старого сайта, где внешние ссылки должны оставаться стабильными независимо от названий задач.

Ветка также не служит резервной копией всей рабочей папки. В её коммитах сохраняются отслеживаемые файлы, а исключённые локальные настройки остаются отдельными данными на диске. Переключение может оставить такие настройки рядом с исходниками другой версии. Поэтому лабораторные файлы .env.local не должны задавать скрытое поведение примера: здесь изучаем только сохранённые Markdown и CSS. У более сложного проекта совместимость локального окружения с выбранной версией обсуждают отдельно.

В результате у нас есть неизменившаяся main и отдельный коммит с пояснением каталога. Для следующего шага оставьте выбранной main и чистое дерево. В уроке «Объединение веток» добавим изменение оформления на основной линии и объединим оба результата.