Ветвление в 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 — указатель на текущую позицию в истории. Обычно указывает на последний коммит текущей ветки.
# Посмотреть 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 — просто создайте ветку или переключитесь обратно
Практика
- Создайте репозиторий с несколькими коммитами в
main - Создайте ветку
feature/testи добавьте в неё 2 коммита - Переключитесь обратно в
main— убедитесь, что файлы из feature пропали - Посмотрите
git log --oneline --graph --all - Попробуйте
git checkout <хеш-коммита>для detached HEAD - Создайте ветку из detached HEAD
- Удалите ненужную ветку