В чём разница между merge и rebase?
merge и rebase — два способа интегрировать изменения из одной ветки в другую. Они дают одинаковый результат (объединённый код), но различаются тем, как выглядит история коммитов.
Аналогия из жизни: merge — это вклеить вставку с правками между страницами книги (видно, что была вставка). rebase — это переписать страницы набело, будто правки были изначально (чистая линейная история, но оригинал утрачен).
Merge (слияние)
Создаёт новый merge-коммит, объединяющий две ветки. Сохраняет полную историю ветвления.
Пример
До merge:
main: C1 -- C2 -- C3
\
feature: C4 -- C5
После git merge feature:
main: C1 -- C2 -- C3 -- M (merge commit)
\ /
feature: C4 -- C5
Пример
git switch main
git merge feature/auth
# Создаётся merge-коммит M
# Merge без fast-forward (всегда создаёт merge-коммит)
git merge --no-ff feature/auth
# Squash merge — объединить все коммиты ветки в один
git merge --squash feature/auth
git commit -m "feat: добавлена авторизация"
Rebase (перебазирование)
Переносит коммиты ветки на вершину другой ветки, создавая линейную историю. Фактически заново применяет каждый коммит.
Пример
До rebase:
main: C1 -- C2 -- C3
\
feature: C4 -- C5
После git rebase main (находясь в feature):
main: C1 -- C2 -- C3
\
feature: C4' -- C5'
Пример
# Перебазировать feature на main
git switch feature/auth
git rebase main
# После rebase — обычный fast-forward merge
git switch main
git merge feature/auth
Interactive Rebase
Позволяет изменять коммиты перед перебазированием:
Пример
# Интерактивный rebase последних 3 коммитов
git rebase -i HEAD~3
В редакторе доступны действия:
pick— оставить коммит как естьreword— изменить сообщение коммитаsquash— объединить с предыдущим коммитом (сохранить сообщение)fixup— объединить с предыдущим (отбросить сообщение)drop— удалить коммит
Сравнение
| Аспект | merge | rebase |
|---|---|---|
| История | Нелинейная, с merge-коммитами | Линейная, чистая |
| Безопасность | Безопасен для shared-веток | Опасен для shared-веток |
| Конфликты | Решаются один раз | Могут возникать на каждом коммите |
| Отслеживаемость | Видно, когда и что было слито | Теряется информация о ветвлении |
Золотое правило rebase
Никогда не перебазируйте коммиты, которые уже были отправлены в публичный (shared) репозиторий.
Rebase изменяет SHA-1 хеши коммитов, что приводит к проблемам у других разработчиков, работающих с теми же ветками.
Пример
# ОПАСНО: rebase ветки, которая уже запушена и с которой работают другие
git rebase main # коммиты получат новые хеши
git push --force # перезаписывает историю на сервере — сломает работу коллегам!
# БЕЗОПАСНО: rebase локальной ветки, которую ещё не пушили
git switch feature/local-work
git rebase main
Ключевые моменты
mergeбезопасен всегда.rebaseбезопасен только для локальных (не опубликованных) коммитовmerge --squash— хороший компромисс: один чистый коммит без merge-коммита и без переписывания истории- Interactive rebase — мощный инструмент для приведения локальной истории в порядок перед push
- Команды часто используют
rebaseдля обновления feature-ветки иmergeдля интеграции в main
Частые ошибки
- Использовать
rebaseна ветках, с которыми работают другие разработчики - Использовать
git push --forceпосле rebase на shared-ветке — потеря чужих коммитов - Путать
merge --squashиrebase --squash(squash — это опция interactive rebase, не отдельная команда) - Не делать
git pull --rebaseпри обновлении — получать лишние merge-коммиты
Как используется в 2026
- Многие команды используют
rebaseдля feature-веток иmerge --squashилиmerge --no-ffдля интеграции в main - GitHub и GitLab предлагают выбор стратегии merge при закрытии PR: merge commit, squash and merge, rebase and merge
git pull --rebaseчасто устанавливают по умолчанию черезgit config --global pull.rebase truegit push --force-with-leaseвместо--force— более безопасный вариант, проверяющий, что remote не изменился
На собеседовании: это один из самых частых вопросов. Покажите понимание золотого правила: rebase — только для локальных коммитов. Хороший ответ включает сравнительную таблицу и упоминание
merge --squashкак компромисса. Интервьюер может попросить нарисовать графы до и после merge/rebase.