Git

Модуль 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. HEADsymref, указывающий на текущую ветку. Понимание структуры refs помогает лучше разбираться во внутренних механизмах Git.

3.10 Именование веток и политика

Используйте префиксы (feature/, fix/, docs/) и осмысленные имена. Избегайте двусмысленных названий. Учитывайте требования CI и защиту веток в вашем проекте.

Настройки

Цветовая схема

Тема