Модуль 3: Ветвление (Branching) — сердце Git
Ветки — лёгкие указатели на коммиты. Быстро создаются и объединяются, позволяя параллельную разработку и безопасные эксперименты.
Зачем нужны ветки
- Изоляция разработки фич без риска для
main - Параллельная работа нескольких людей над разными задачами
- Чистая история и упрощение код‑ревью
Полезные практики
- Одна ветка — одна задача; называйте ветки по шаблону:
feature/...,fix/... - Регулярно синхронизируйтесь с базовой веткой (fetch + rebase/merge)
- Удаляйте слитые ветки, чтобы поддерживать чистоту
Мыслите веткой как именованной «меткой» на графе истории. Перемещая метки и сопоставляя их, вы управляете потоком изменений, не копируя файлы и не создавая директории для каждой версии проекта.
3.1 Что такое ветка
Ветка в Git — это просто указатель (имя) на коммит. Это невероятно дёшевая операция — создание ветки не копирует файлы, а лишь создаёт новый указатель.
Как устроены ветки
main: A --- B --- C ← main указывает на коммит C
\
feature: D --- E ← feature указывает на коммит E
HEAD → feature ← HEAD показывает текущую ветку
- main — основная ветка (по умолчанию)
- feature — ветка для новой фичи
- HEAD — специальный указатель: «где я сейчас нахожусь»
Когда вы делаете коммит, текущая ветка автоматически перемещается на новый коммит. HEAD следует за веткой.
3.2 Создание и переключение веток
# Создать ветку (но НЕ переключаться на неё)
git branch feature/login
# Создать и сразу переключиться (рекомендуется)
git switch -c feature/login
# Старый способ (работает, но менее понятен)
git checkout -b feature/login
# Переключиться на существующую ветку
git switch main
# Создать ветку от конкретного коммита
git switch -c hotfix/bug-123 abc1234
# Создать ветку от удалённой ветки
git switch -c feature/api origin/feature/api
Рекомендация: используйте git switch для веток и git restore для файлов. Старый git checkout делал и то, и другое, что приводило к путанице.
3.3 Список, переименование и удаление веток
# Список локальных веток (текущая помечена *)
git branch
# * main
# feature/login
# hotfix/bug-123
# С информацией о последнем коммите
git branch -v
# Все ветки (включая remote-tracking)
git branch -a
# Только слитые ветки (можно безопасно удалить)
git branch --merged main
# Не слитые ветки
git branch --no-merged main
# Переименовать ветку
git branch -m old-name new-name
# Безопасное удаление (только если ветка слита)
git branch -d feature/login
# Принудительное удаление (даже если не слита — будьте осторожны!)
git branch -D feature/old
# Удалить удалённую ветку
git push origin --delete feature/old
3.4 Сравнение веток
# Diff между ветками (все изменения)
git diff main..feature/login
# Только имена изменённых файлов
git diff --name-only main..feature/login
# Коммиты, которые есть в feature, но нет в main
git log --oneline main..feature/login
# Коммиты, которые есть в одной ветке, но нет в другой (обе стороны)
git log --oneline --left-right main...feature/login
# Визуальный граф всех веток
git log --oneline --graph --all --decorate
Разница между .. и ...: две точки — «что есть в правой, но нет в левой»; три точки — «симметричная разность» (что уникально в каждой).
3.5 Практика: полный цикл feature-ветки
# 1. Обновить main
git switch main
git pull origin main
# 2. Создать feature-ветку
git switch -c feature/user-profile
# 3. Работаем: редактируем файлы, коммитим по частям
git add -p # интерактивно выбираем изменения
git commit -m "feat: модель профиля"
git add src/api/profile.py
git commit -m "feat: API эндпоинт профиля"
# 4. Проверяем, что отличается от main
git log --oneline main..HEAD # наши коммиты
git diff --stat main # статистика изменений
# 5. Пушим
git push -u origin feature/user-profile
# 6. После merge — удаляем ветку
git switch main
git pull
git branch -d feature/user-profile
3.6 Detached HEAD
Когда HEAD указывает напрямую на коммит (а не на ветку), это «отсоединённый HEAD». Коммиты в этом состоянии будут потеряны, если не создать ветку.
# Переключиться на конкретный коммит → detached HEAD
git checkout abc1234
# You are in 'detached HEAD' state...
# Сделали эксперимент — хотите сохранить? Создайте ветку:
git switch -c experiment/my-test
# Или вернуться к обычному состоянию:
git switch main
3.7 Upstream и tracking
Ветка может отслеживать upstream (обычно удалённую ветку). Это включает краткие команды (git pull, git push) и влияет на стратегии слияния/ребейза по умолчанию.
3.8 Remote‑tracking ветки
Это локальные ссылки вида origin/main, отражающие состояние удалённых веток. Они обновляются при git fetch, но не меняют вашу рабочую директорию.
3.9 Refs и символьные ссылки
Ветки/теги — имена ссылок (refs) в .git/refs. HEAD — symref, указывающий на текущую ветку. Понимание структуры refs помогает лучше разбираться во внутренних механизмах Git.
3.10 Именование веток и политика
Используйте префиксы (feature/, fix/, docs/) и осмысленные имена. Избегайте двусмысленных названий. Учитывайте требования CI и защиту веток в вашем проекте.