1. Основы ветвления: архитектура Git, создание и переключение между ветками
Основы ветвления: архитектура Git, создание и переключение между ветками
Добро пожаловать в курс «Git и GitLab: Мастерство ветвления, слияния и Rebase». Мы начинаем наше погружение в мир контроля версий с фундаментальной темы, без которой невозможно представить современную разработку — с ветвления. В этой статье мы разберем, как Git работает изнутри, что такое ветки на физическом уровне и как ими управлять.
Архитектура Git: Снимки, а не дельты
Чтобы понять ветвление, нужно сначала осознать, как Git хранит данные. Многие системы контроля версий (например, старый SVN) хранят информацию как список изменений для каждого файла. Это похоже на то, как если бы вы хранили только список правок: «в строке 10 добавлено слово». Это называется дельта-хранением.
Git работает иначе. Он мыслит снимками (snapshots).
Каждый раз, когда вы делаете коммит (сохраняете состояние проекта), Git словно делает фотографию всех ваших файлов в данный момент и сохраняет ссылку на этот снимок. Если файл не изменился, Git не сохраняет его копию снова, а просто делает ссылку на предыдущий идентичный файл.
!Сравнение дельта-хранения и хранения снимков (Snapshots) в Git
Три состояния Git
Понимание архитектуры невозможно без знания трех состояний, в которых могут находиться ваши файлы:
git add).git commit).Эти состояния соответствуют трем секциям проекта Git:
* Рабочая директория (Working Directory): то, что вы видите в редакторе кода. * Область подготовленных файлов (Staging Area / Index): файл, содержащий информацию о том, что войдет в следующий коммит. * Директория .git (Repository): место, где Git хранит метаданные и базу объектов.
Что такое ветка на самом деле?
Теперь, когда мы знаем о снимках, давайте разберем ветки. Для новичков ветвление часто кажется чем-то сложным, вроде создания полной копии папки с проектом. Но в Git ветка — это невероятно легковесная сущность.
Ветка в Git — это просто подвижный указатель на один из коммитов.
Когда вы создаете коммиты, они выстраиваются в цепочку, где каждый коммит знает, кто был его родителем. Ветка — это просто ярлык (название), приклеенный к последнему коммиту в этой цепочке.
По умолчанию основная ветка во многих репозиториях называется master или main. Когда вы делаете новые коммиты, находясь в этой ветке, указатель main автоматически сдвигается вперед.
Роль HEAD
Как Git узнает, на какой ветке вы сейчас находитесь? Для этого существует специальный указатель под названием HEAD.
Представьте HEAD как курсор или отметку «Вы находитесь здесь» на карте. Обычно HEAD указывает на имя текущей ветки, а ветка, в свою очередь, указывает на последний коммит.
Создание новой ветки
Создание ветки происходит мгновенно, независимо от размера вашего проекта. Почему? Потому что Git не копирует файлы. Он просто создает новый файл размером 41 байт, в который записывает хеш-сумму (идентификатор) того коммита, на котором вы сейчас находитесь.
Команда для создания ветки:
Например, создадим ветку для разработки новой функции:
Важно: Эта команда только создает ветку, но не переключает вас на нее. Ваш HEAD все еще указывает на старую ветку (например, на main).
Переключение между ветками
Чтобы начать работать в новой ветке, нужно переместить указатель HEAD. Для этого используется команда:
Или более современная и интуитивная команда (добавленная в Git версии 2.23):
Пример:
Что происходит при переключении?
Это один из самых важных моментов в понимании Git. Когда вы переключаетесь на другую ветку, Git физически меняет файлы в вашей рабочей директории.
Если вы переключитесь на старую ветку, файлы, которых там не было, исчезнут из папки (но останутся в базе Git в другой ветке), а измененные файлы вернутся к состоянию того момента.
> Внимание: Перед переключением веток всегда старайтесь иметь «чистую» рабочую директорию (закоммитить или спрятать текущие изменения), иначе Git может запретить переключение, чтобы вы не потеряли несохраненные данные.
Создание и переключение одной командой
Разработчики редко создают ветку, чтобы не переключиться на нее сразу. Поэтому существует сокращение.
Используя checkout:
Используя switch:
Флаг -b означает branch (ветка), а -c — create (создать).
Ветвление и GitLab
Хотя Git — это инструмент, работающий локально на вашем компьютере, GitLab выступает в роли удаленного хранилища (Remote). Ваши локальные ветки не появляются в GitLab автоматически.
Чтобы ваша ветка feature-login стала доступна коллегам в GitLab, её нужно «запушить» (отправить):
Флаг -u (или --set-upstream) связывает вашу локальную ветку с удаленной веткой. В будущем, находясь в этой ветке, вы сможете писать просто git push без дополнительных аргументов.
В интерфейсе GitLab вы увидите список всех веток в разделе Repository -> Branches. Это позволяет проводить Code Review и использовать Merge Requests, о чем мы поговорим в следующих статьях.
Итоги
В этой статье мы заложили фундамент для работы с Git:
git branch, а для переключения — git checkout или git switch.В следующей статье мы разберем, как соединять истории разработки воедино, изучив операции Merge (слияние) и разрешение конфликтов.