NodeJS Back-end Инженер

NodeJS Back-end Инженер

Роадмап навыков для прокачки

Ветвление, теги, слияние изменений из веток

Software Development ProcessesСистема контроля версий (Git)Основное

Основная идея

Ветвление в Git позволяет создавать независимые линии разработки, теги фиксируют важные точки в истории (релизы), а слияние объединяет изменения из разных веток. Эти механизмы — основа эффективной командной работы.

Ключевые команды

  • git branch — создание и просмотр веток
  • git checkout / git switch — переключение между ветками
  • git merge — слияние веток
  • git rebase — перенос коммитов на другую ветку
  • git tag — создание и управление тегами

Типы веток

  • main/master — основная стабильная ветка
  • develop — ветка разработки
  • feature/ — ветки для новых функций
  • bugfix/ — ветки для исправления багов
  • release/ — ветки для подготовки релиза

Типы слияния

  • Fast-forward — простое перемещение указателя ветки
  • 3-way merge — создание merge-коммита
  • Rebase — перенос коммитов с переписыванием истории

Частые ошибки на собеседованиях

  • Путают merge и rebase — merge сохраняет историю, rebase переписывает
  • Не понимают fast-forward merge
  • Забывают про merge-конфликты и их разрешение
  • Не знают разницу между lightweight и annotated тегами
  • Путают git checkout и git switch (switch — современный вариант для веток)

Введение и проблематика

При работе над проектом часто требуется параллельно разрабатывать несколько функций, исправлять баги и поддерживать стабильную версию. Без механизма ветвления это приводит к хаосу и конфликтам в коде.

Ветка в Git — это лёгкий подвижный указатель на коммит. Создание ветки — мгновенная операция, не требующая копирования файлов.

Зачем нужны ветки?

  • Изоляция работы — разработка новой функции не влияет на стабильный код
  • Параллельная разработка — несколько разработчиков работают независимо
  • Безопасное экспериментирование — можно пробовать идеи без риска сломать проект
  • Code Review — изменения проверяются перед слиянием в основную ветку

Базовая теория

Структура веток

gitGraph commit id: "Initial" commit id: "Add base" branch feature/auth checkout feature/auth commit id: "Add login" commit id: "Add register" checkout main commit id: "Fix typo" merge feature/auth id: "Merge auth" commit id: "Release"

Команды для работы с ветками

КомандаОписание
git branchСписок локальных веток
git branch -aСписок всех веток (включая remote)
git branch featureСоздать ветку feature
git switch featureПереключиться на ветку
git switch -c featureСоздать и переключиться
git branch -d featureУдалить слитую ветку
git branch -D featureПринудительно удалить ветку

Практические примеры

Создание и слияние веток

Шаг 1: Создание ветки

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

Шаг 2: Работа в ветке

bash
# Внести изменения
git add .
git commit -m "Add user profile component"
git commit -m "Add profile settings page"

Шаг 3: Актуализация ветки

bash
# Получить изменения из main
git switch main
git pull
git switch feature/user-profile
git merge main

Шаг 4: Слияние в main

bash
git switch main
git merge feature/user-profile

Шаг 5: Удаление ветки

bash
# Удалить локальную ветку
git branch -d feature/user-profile
 
# Удалить удалённую ветку
git push origin --delete feature/user-profile

Типы слияния

bash
# Fast-forward происходит, когда main не изменился
# после создания ветки
 
git switch main
git merge feature/login
# Fast-forward merge - просто перемещение указателя
gitGraph commit id: "A" commit id: "B" branch feature commit id: "C" commit id: "D" checkout main merge feature

Указатель main просто перемещается на последний коммит feature.

⚠️

Золотое правило rebase: никогда не делайте rebase коммитов, которые уже были отправлены на сервер и могут использоваться другими.


Работа с тегами

Теги используются для маркировки важных точек в истории — обычно релизов.

Типы тегов

ТипОписаниеКоманда
LightweightПросто указатель на коммитgit tag v1.0
AnnotatedПолный объект с метаданнымиgit tag -a v1.0 -m "Release 1.0"

Для релизов рекомендуется использовать annotated теги — они содержат информацию о том, кто и когда создал тег.

Команды для работы с тегами

bash
# Создать annotated тег
git tag -a v1.0.0 -m "Release version 1.0.0"
 
# Создать тег на определённом коммите
git tag -a v1.0.0 9fceb02 -m "Release 1.0.0"
 
# Просмотр тегов
git tag
git tag -l "v1.*"
 
# Просмотр информации о теге
git show v1.0.0
 
# Отправить тег на сервер
git push origin v1.0.0
 
# Отправить все теги
git push origin --tags
 
# Удалить тег локально
git tag -d v1.0.0
 
# Удалить тег на сервере
git push origin --delete v1.0.0

Разрешение конфликтов

🚫

Конфликт возникает, когда один и тот же участок кода изменён в обеих ветках. Git не может автоматически решить, какую версию оставить.

Пример конфликта

bash
# При слиянии Git сообщит о конфликте
git merge feature/settings
# CONFLICT (content): Merge conflict in config.js

Файл с конфликтом

js
function getConfig() {
<<<<<<< HEAD
  return { theme: 'dark' };
=======
  return { theme: 'light', lang: 'ru' };
>>>>>>> feature/settings
}

Разрешение конфликта

Шаг 1: Найти конфликтующие файлы

bash
git status
# Файлы с конфликтами отмечены как "both modified"

Шаг 2: Отредактировать файлы

Удалить маркеры конфликта и оставить нужный код:

js
function getConfig() {
  return { theme: 'dark', lang: 'ru' };
}

Шаг 3: Отметить как разрешённый

bash
git add config.js
git commit -m "Resolve merge conflict in config"

Популярные стратегии ветвления

Git Flow

gitGraph commit id: "Init" branch develop commit id: "Dev 1" branch feature/auth commit id: "Auth 1" commit id: "Auth 2" checkout develop merge feature/auth branch release/1.0 commit id: "Bump version" checkout main merge release/1.0 tag: "v1.0" checkout develop merge release/1.0
  • main — стабильный production код
  • develop — интеграционная ветка
  • feature/ — ветки функций
  • release/ — подготовка релиза
  • hotfix/ — срочные исправления в production

GitHub Flow

Упрощённый подход:

  1. Создать ветку от main
  2. Сделать изменения
  3. Открыть Pull Request
  4. Code Review
  5. Merge в main
  6. Deploy

Плюсы и минусы

МеханизмПреимуществаНедостатки
MergeСохраняет историю, безопасенНелинейная история, merge-коммиты
RebaseЧистая линейная историяПереписывает историю, опасен для shared веток
ТегиФиксация релизов, простой откатТребуют дисциплины в именовании

Вопросы интервьюера

Q: Чем отличается merge от rebase?

Merge создаёт дополнительный коммит слияния и сохраняет историю. Rebase переносит коммиты на новую базу, создавая линейную историю, но переписывает хеши коммитов.

Q: Когда использовать rebase?

Для локальных веток перед отправкой на сервер. Никогда не делать rebase коммитов, которые уже опубликованы.

Q: Что такое fast-forward merge?

Когда целевая ветка не изменилась после создания feature-ветки, Git просто перемещает указатель без создания merge-коммита.

Q: Чем отличаются lightweight и annotated теги?

Lightweight — просто указатель на коммит. Annotated — полноценный объект с метаданными (автор, дата, сообщение).

Q: Как разрешить конфликт слияния?

Открыть файлы с конфликтами, вручную отредактировать (удалить маркеры, оставить нужный код), добавить в staging и закоммитить.


Источники