git merge: слияние веток

Команда для объединения истории двух веток: изменения из одной ветки переносятся в другую, создавая merge-commit или fast-forward.

Зачем нужно

После того как фича разработана в отдельной ветке, её нужно объединить с основной. git merge берёт все коммиты из feature-ветки и объединяет их с целевой веткой. Git автоматически разрешает большинство конфликтов; при невозможности сделать это автоматически — останавливается и просит разработчика разрешить конфликт вручную. Merge сохраняет полную историю обеих веток.

Где используется

  • Завершение Pull Request: GitHub/GitLab делает merge под капотом
  • Перенос фичи из feature/* в develop или main
  • Gitflow: слияние hotfix в main и develop
  • Синхронизация ветки с main после обновления (git merge main)

Основной контент

Типы merge

Fast-forward merge — когда feature-ветка прямолинейна относительно main (нет новых коммитов в main с момента ответвления):

До:   main: A---B
                 \
            feat:  C---D

После fast-forward:
      main: A---B---C---D

3-way merge — когда в обеих ветках есть новые коммиты:

До:   main: A---B---E
                 \
            feat:  C---D

После merge:
      main: A---B---E---M   (M = merge-commit)
                 \       /
                  C---D

Команды

# Перейти в ветку-получатель
git switch main

# Слить feature-ветку в main
git merge feature/auth

# Merge с явным созданием merge-commit (отключить fast-forward)
git merge --no-ff feature/auth

# Merge с squash: все коммиты feature-ветки → один коммит
git merge --squash feature/auth
git commit -m "feat: добавить авторизацию"

# Прервать merge при конфликте
git merge --abort

# Продолжить merge после разрешения конфликтов
git add src/auth.js
git commit   # или git merge --continue

Стратегии при Pull Request

Стратегия Флаг История
Merge commit --no-ff Сохраняет всю историю ветки
Squash merge --squash Один коммит от всей ветки
Rebase & merge Линейная история без merge-commit

Просмотр merge

# Посмотреть ветки, которые уже слиты в текущую
git branch --merged

# Ветки, которые ещё не слиты
git branch --no-merged

# Граф после merge
git log --oneline --graph --all

Частые ошибки

  • Merge в не ту ветку — всегда проверяй git branch перед merge; откатить можно через git reset --hard ORIG_HEAD
  • Не разрешить все маркеры конфликта — строки <<<<, ====, >>>> должны быть удалены; git status покажет unresolved-файлы
  • Fast-forward в командном проекте — теряется информация о том, что фича разрабатывалась отдельно; используй --no-ff
  • Merge без обновления main — слияние устаревшей ветки создаёт лишние конфликты; делай git pull перед merge

Связанные темы

Ресурсы