[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-git-v-chyom-raznitsa-mezhdu-merge-i-rebase":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},1330,"v-chyom-raznitsa-mezhdu-merge-i-rebase",44,"git","Git","📦","В чём разница между merge и rebase?","merge и rebase — два способа интегрировать изменения из одной ветки в другую. Они дают одинаковый результат (объединённый код), но различаются тем, как выглядит история коммитов.\n\n> Аналогия из жизни: merge — это вклеить вставку с правками между страницами книги (видно, что была вставка). rebase — это переписать страницы набело, будто правки были изначально (чистая линейная история, но оригинал утрачен).\n\n### Merge (слияние)\n\nСоздаёт новый merge-коммит, объединяющий две ветки. Сохраняет полную историю ветвления.\n\n```\nДо merge:\nmain:    C1 -- C2 -- C3\n                \\\nfeature:         C4 -- C5\n\nПосле git merge feature:\nmain:    C1 -- C2 -- C3 -- M (merge commit)\n                \\         \u002F\nfeature:         C4 -- C5\n```\n\n```bash\ngit switch main\ngit merge feature\u002Fauth\n# Создаётся merge-коммит M\n\n# Merge без fast-forward (всегда создаёт merge-коммит)\ngit merge --no-ff feature\u002Fauth\n\n# Squash merge — объединить все коммиты ветки в один\ngit merge --squash feature\u002Fauth\ngit commit -m \"feat: добавлена авторизация\"\n```\n\n### Rebase (перебазирование)\n\nПереносит коммиты ветки на вершину другой ветки, создавая линейную историю. Фактически заново применяет каждый коммит.\n\n```\nДо rebase:\nmain:    C1 -- C2 -- C3\n                \\\nfeature:         C4 -- C5\n\nПосле git rebase main (находясь в feature):\nmain:    C1 -- C2 -- C3\n                       \\\nfeature:                C4' -- C5'\n```\n\n```bash\n# Перебазировать feature на main\ngit switch feature\u002Fauth\ngit rebase main\n\n# После rebase — обычный fast-forward merge\ngit switch main\ngit merge feature\u002Fauth\n```\n\n### Interactive Rebase\n\nПозволяет изменять коммиты перед перебазированием:\n\n```bash\n# Интерактивный rebase последних 3 коммитов\ngit rebase -i HEAD~3\n```\n\nВ редакторе доступны действия:\n- `pick` — оставить коммит как есть\n- `reword` — изменить сообщение коммита\n- `squash` — объединить с предыдущим коммитом (сохранить сообщение)\n- `fixup` — объединить с предыдущим (отбросить сообщение)\n- `drop` — удалить коммит\n\n### Сравнение\n\n| Аспект | merge | rebase |\n|---|---|---|\n| История | Нелинейная, с merge-коммитами | Линейная, чистая |\n| Безопасность | Безопасен для shared-веток | Опасен для shared-веток |\n| Конфликты | Решаются один раз | Могут возникать на каждом коммите |\n| Отслеживаемость | Видно, когда и что было слито | Теряется информация о ветвлении |\n\n### Золотое правило rebase\n\n> Никогда не перебазируйте коммиты, которые уже были отправлены в публичный (shared) репозиторий.\n\nRebase изменяет SHA-1 хеши коммитов, что приводит к проблемам у других разработчиков, работающих с теми же ветками.\n\n```bash\n# ОПАСНО: rebase ветки, которая уже запушена и с которой работают другие\ngit rebase main   # коммиты получат новые хеши\ngit push --force  # перезаписывает историю на сервере — сломает работу коллегам!\n\n# БЕЗОПАСНО: rebase локальной ветки, которую ещё не пушили\ngit switch feature\u002Flocal-work\ngit rebase main\n```\n\n### Ключевые моменты\n\n- `merge` безопасен всегда. `rebase` безопасен только для локальных (не опубликованных) коммитов\n- `merge --squash` — хороший компромисс: один чистый коммит без merge-коммита и без переписывания истории\n- Interactive rebase — мощный инструмент для приведения локальной истории в порядок перед push\n- Команды часто используют `rebase` для обновления feature-ветки и `merge` для интеграции в main\n\n### Частые ошибки\n\n- Использовать `rebase` на ветках, с которыми работают другие разработчики\n- Использовать `git push --force` после rebase на shared-ветке — потеря чужих коммитов\n- Путать `merge --squash` и `rebase --squash` (squash — это опция interactive rebase, не отдельная команда)\n- Не делать `git pull --rebase` при обновлении — получать лишние merge-коммиты\n\n### Как используется в 2026\n\n- Многие команды используют `rebase` для feature-веток и `merge --squash` или `merge --no-ff` для интеграции в main\n- GitHub и GitLab предлагают выбор стратегии merge при закрытии PR: merge commit, squash and merge, rebase and merge\n- `git pull --rebase` часто устанавливают по умолчанию через `git config --global pull.rebase true`\n- `git push --force-with-lease` вместо `--force` — более безопасный вариант, проверяющий, что remote не изменился\n\n> **На собеседовании:** это один из самых частых вопросов. Покажите понимание золотого правила: rebase — только для локальных коммитов. Хороший ответ включает сравнительную таблицу и упоминание `merge --squash` как компромисса. Интервьюер может попросить нарисовать графы до и после merge\u002Frebase.","","middle",[7,15,16,17],"best-practices","branching","commands",[],null,{"title":21,"description":22,"ogTitle":23,"ogDescription":24,"keywords":25,"schemaAnswer":34,"featuredSnippetReady":35},"В чём разница между merge и rebase — Gymterview","Разница merge и rebase в Git: merge создаёт merge-коммит, rebase — линейную историю. Сравнение, золотое правило rebase, interactive rebase, squash merge.","Merge vs Rebase в Git: разница, золотое правило, когда использовать — Gymterview","Merge сохраняет историю ветвления, rebase создаёт линейную историю. Золотое правило: rebase только для локальных коммитов.",[26,27,28,29,30,31,32,33],"merge vs rebase","git merge","git rebase","interactive rebase","squash merge","fast-forward","золотое правило","собеседование","merge создаёт merge-коммит, сохраняя полную историю ветвления (безопасен для shared-веток). rebase переносит коммиты на вершину другой ветки, создавая линейную историю (изменяет SHA-1 хеши, опасен для shared-веток). Золотое правило: никогда не перебазируйте запушенные коммиты. Компромисс: merge --squash (один чистый коммит). Interactive rebase позволяет объединять, удалять и переименовывать коммиты.",true]