Ветвление в Git

Создание независимых линий разработки для параллельной работы над фичами, исправлениями и экспериментами

Зачем нужно

  • Работать над фичей, не ломая стабильный код
  • Параллельная работа нескольких разработчиков
  • Изолировать экспериментальный код
  • Организовать процесс релизов

Где используется

  • В каждом проекте — feature branches
  • В CI/CD — автоматические проверки на ветках
  • В code review — PR создаётся из ветки

Предпосылки

Что такое ветка

Ветка в Git — это просто указатель на коммит. Создание ветки — мгновенная операция (создаётся файл на 41 байт).

main:       A ── B ── C     ← main указывает на C
                      \
feature:               D ── E   ← feature указывает на E
                                ← HEAD указывает на feature

Основные команды

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

# Создать ветку (без переключения)
git branch feature-login

# Создать ветку и сразу переключиться
git checkout -b feature-login
# или (современный способ)
git switch -c feature-login

# Создать ветку от конкретного коммита
git branch hotfix-123 a1b2c3d

# Создать ветку от другой ветки
git checkout -b feature-login develop

Переключение между ветками

# Классический способ
git checkout main

# Современный способ (Git 2.23+)
git switch main

# Вернуться к предыдущей ветке
git switch -
# или
git checkout -

Просмотр веток

# Локальные ветки
git branch

# Все ветки (включая remote)
git branch -a

# Ветки с последним коммитом
git branch -v

# Ветки, слитые в текущую
git branch --merged

# Ветки, НЕ слитые в текущую
git branch --no-merged

Удаление веток

# Удалить слитую ветку
git branch -d feature-login

# Удалить ветку принудительно (даже если не слита)
git branch -D feature-login

# Удалить remote-ветку
git push origin --delete feature-login

Переименование веток

# Переименовать текущую ветку
git branch -m new-name

# Переименовать другую ветку
git branch -m old-name new-name

HEAD — указатель на текущую позицию в истории. Обычно указывает на последний коммит текущей ветки.

# Посмотреть HEAD
cat .git/HEAD
# ref: refs/heads/main

# HEAD в логе
git log --oneline
# a1b2c3d (HEAD -> main) Последний коммит

Detached HEAD

Если переключиться на конкретный коммит (а не ветку), HEAD "отсоединяется":

git checkout a1b2c3d
# You are in 'detached HEAD' state...

# Что делать:
# 1. Только посмотреть — потом git switch main
# 2. Сохранить работу — создать ветку:
git switch -c save-my-work
Обычное состояние:     HEAD → main → коммит C
Detached HEAD:         HEAD → коммит B (main всё ещё на C)

Именование веток

Конвенции именования

feature/login-form      ← новая функциональность
fix/header-overflow     ← исправление бага
hotfix/security-patch   ← срочное исправление
refactor/auth-module    ← рефакторинг
docs/api-reference      ← документация
test/unit-coverage      ← тесты
chore/update-deps       ← техническое обслуживание

Правила

  • Использовать строчные буквы
  • Разделять слова дефисом: feature/user-auth
  • Включать номер задачи: feature/PROJ-123-user-auth
  • Не использовать пробелы и спецсимволы
  • Описывать суть работы

Типичный рабочий процесс

# 1. Обновить main
git switch main
git pull origin main

# 2. Создать ветку для задачи
git switch -c feature/search-bar

# 3. Работать — коммитить изменения
git add .
git commit -m "Добавить компонент SearchBar"
git add .
git commit -m "Подключить API поиска"

# 4. Отправить ветку на remote
git push -u origin feature/search-bar

# 5. Создать Pull Request на GitHub

# 6. После merge — удалить локальную ветку
git switch main
git pull origin main
git branch -d feature/search-bar

Частые ошибки

  • Работать прямо в main — всегда создавайте ветку для новой задачи
  • Долго не обновлять ветку — чем дольше ветка живёт, тем больше конфликтов при merge
  • Бессмысленные имена: test, branch1, asdf — невозможно понять назначение
  • Не удалять слитые ветки — накапливаются десятки ненужных веток
  • Паниковать при detached HEAD — просто создайте ветку или переключитесь обратно

Практика

  1. Создайте репозиторий с несколькими коммитами в main
  2. Создайте ветку feature/test и добавьте в неё 2 коммита
  3. Переключитесь обратно в main — убедитесь, что файлы из feature пропали
  4. Посмотрите git log --oneline --graph --all
  5. Попробуйте git checkout <хеш-коммита> для detached HEAD
  6. Создайте ветку из detached HEAD
  7. Удалите ненужную ветку

Связанные темы

Ресурсы