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