Ветвление в Git — мощный инструмент для управления разработкой проекта.
Что такое ветка?
Ветка — это текстовая ссылка на определённый коммит. По умолчанию существует ветка master. В одном репозитории может существовать множество веток. Все указатели веток хранятся в папке .git/refs/heads. В этой папке находятся файлы, имена которых соответствуют именам веток. Текущая ветка отслеживает новые коммиты, и указатель ветки автоматически перемещается после каждого нового коммита. Для переключения на конкретную ветку используется команда git checkout <имя_ветки>, например, master, experimental, temporal, new_branch или dev_1512. При создании новых веток не следует использовать пробелы в именах; вместо них лучше использовать тире.
Зачем нужны ветки?
Предположим, вы работаете над веткой master. В какой-то момент вы решаете работать над новой функцией, но не хотите внедрять её напрямую в master, так как не уверены в её необходимости для основного проекта. В этот момент вы создаёте новую ветку, например, br_102, и начинаете работу в ней. Все коммиты выполняются в текущей ветке. Если текущая ветка — br_102, коммиты будут создаваться только в ней, а ветка master останется неизменной. Параллельно с работой над br_102, вы или кто-то другой можете продолжать работу в ветке master. Ветки br_102 и master независимы, и коммиты в них могут выполняться в любое время.
Аналогично можно создать другую ветку, например, exp (experimental). Эта ветка создаётся после определённого коммита в ветке master, и коммиты в ветке exp никак не связаны по времени с коммитами в других ветках. Каждая ветка — это просто текстовая ссылка на определённый коммит, поэтому ветки полностью независимы друг от друга.
Ветку можно создать на основе другой ветки. Например, после коммита в br_102 можно создать ветку temp для проведения тестов. По окончании тестов эту временную ветку можно удалить, и все её коммиты будут удалены.
Каждая ветка — это отдельная история проекта. Разработчики могут параллельно работать над разными функциями в отдельных ветках. Когда функция готова и протестирована, соответствующая ветка может быть слита (мерж) в ветку master. Процесс слияния веток будет рассмотрен позже.
Имена веток и Git HEAD
Рекомендуется придерживаться согласованного стиля именования веток. Имена веток должны быть понятными и информативными, например, refactor_main_menu.
Указатель HEAD может указывать только на одну ветку. HEAD — это ссылка на коммит, под которым находится дерево с блобами и, возможно, другими деревьями. Рабочая директория содержит файлы и папки на основе дерева объектов под этим коммитом.
Легко переключаться между версиями проекта и ветками, используя команду git checkout. При переключении на другую ветку, указатель HEAD перемещается, и в рабочую директорию и область индексирования загружается версия проекта, на которую указывает коммит этой ветки.
Ветки позволяют избежать запоминания SHA-1 хешей коммитов. Вместо этого используются понятные имена веток для переключения между версиями проекта. Переключение на конкретный коммит (detached HEAD state) не рекомендуется, так как при создании новых коммитов в таком состоянии и последующем возвращении к ветке эти коммиты будут потеряны.
Краткое резюме
Каждая ветка — это отдельная история проекта. Ветки позволяют параллельно создавать коммиты в разных ветках и упрощают совместную работу над проектом. Использование имен веток вместо SHA-1 хешей значительно упрощает работу.
В этом уроке мы рассмотрели основные принципы работы с ветками в Git. В следующем уроке мы перейдём к практическим упражнениям по созданию веток. На данный момент у нас есть только одна ветка master с тремя коммитами.