Software Development Processes → Система контроля версий (Git) → Основное
Основная идея
Ветвление в Git позволяет создавать независимые линии разработки, теги фиксируют важные точки в истории (релизы), а слияние объединяет изменения из разных веток. Эти механизмы — основа эффективной командной работы.
Ключевые команды
git branch — создание и просмотр веток
git checkout / git switch — переключение между ветками
Rebase — перенос коммитов с переписыванием истории
Частые ошибки на собеседованиях
Путают merge и rebase — merge сохраняет историю, rebase переписывает
Не понимают fast-forward merge
Забывают про merge-конфликты и их разрешение
Не знают разницу между lightweight и annotated тегами
Путают git checkout и git switch (switch — современный вариант для веток)
Введение и проблематика
При работе над проектом часто требуется параллельно разрабатывать несколько функций, исправлять баги и поддерживать стабильную версию. Без механизма ветвления это приводит к хаосу и конфликтам в коде.
Ветка в Git — это лёгкий подвижный указатель на коммит. Создание ветки — мгновенная операция, не требующая копирования файлов.
Зачем нужны ветки?
Изоляция работы — разработка новой функции не влияет на стабильный код
Параллельная разработка — несколько разработчиков работают независимо
Безопасное экспериментирование — можно пробовать идеи без риска сломать проект
Code Review — изменения проверяются перед слиянием в основную ветку
# Создать новую веткуgitbranchfeature/user-profile# Создать и сразу переключитьсяgitswitch-cfeature/user-profile# Старый синтаксис (тоже работает)gitcheckout-bfeature/user-profile
Шаг 2: Работа в ветке
bash
# Внести измененияgitadd.gitcommit-m"Add user profile component"gitcommit-m"Add profile settings page"
Шаг 3: Актуализация ветки
bash
# Получить изменения из maingitswitchmaingitpullgitswitchfeature/user-profilegitmergemain
# Fast-forward происходит, когда main не изменился# после создания веткиgitswitchmaingitmergefeature/login# Fast-forward merge - просто перемещение указателя
Указатель main просто перемещается на последний коммит feature.
⚠️
Золотое правило rebase: никогда не делайте rebase коммитов, которые уже были отправлены на сервер и могут использоваться другими.
Работа с тегами
Теги используются для маркировки важных точек в истории — обычно релизов.
Типы тегов
Тип
Описание
Команда
Lightweight
Просто указатель на коммит
git tag v1.0
Annotated
Полный объект с метаданными
git tag -a v1.0 -m "Release 1.0"
Для релизов рекомендуется использовать annotated теги — они содержат информацию о том, кто и когда создал тег.
Команды для работы с тегами
bash
# Создать annotated тегgittag-av1.0.0-m"Release version 1.0.0"# Создать тег на определённом коммитеgittag-av1.0.09fceb02-m"Release 1.0.0"# Просмотр теговgittaggittag-l"v1.*"# Просмотр информации о тегеgitshowv1.0.0# Отправить тег на серверgitpushoriginv1.0.0# Отправить все тегиgitpushorigin--tags# Удалить тег локальноgittag-dv1.0.0# Удалить тег на сервереgitpushorigin--deletev1.0.0
Разрешение конфликтов
🚫
Конфликт возникает, когда один и тот же участок кода изменён в обеих ветках. Git не может автоматически решить, какую версию оставить.
Пример конфликта
bash
# При слиянии Git сообщит о конфликтеgitmergefeature/settings# CONFLICT (content): Merge conflict in config.js
Merge создаёт дополнительный коммит слияния и сохраняет историю. Rebase переносит коммиты на новую базу, создавая линейную историю, но переписывает хеши коммитов.
Q: Когда использовать rebase?
Для локальных веток перед отправкой на сервер. Никогда не делать rebase коммитов, которые уже опубликованы.
Q: Что такое fast-forward merge?
Когда целевая ветка не изменилась после создания feature-ветки, Git просто перемещает указатель без создания merge-коммита.
Q: Чем отличаются lightweight и annotated теги?
Lightweight — просто указатель на коммит. Annotated — полноценный объект с метаданными (автор, дата, сообщение).
Q: Как разрешить конфликт слияния?
Открыть файлы с конфликтами, вручную отредактировать (удалить маркеры, оставить нужный код), добавить в staging и закоммитить.