Git Rebase vs Merge
Последнее обновление
И git merge, и git rebase объединяют работу из одной ветки в другую. git merge связывает две истории коммитом слияния, сохраняя в точности то, что произошло. git rebase переигрывает ваши коммиты один за другим поверх другой ветки, создавая чистую, линейную историю, но переписывая ваши коммиты в процессе.
Золотое правило: никогда не делайте rebase коммитов, которые другие уже получили. Попробуйте оба в терминальном playground — настоящая оболочка в вашем браузере.
Бок о бок
| Behavior | git merge | git rebase |
|---|---|---|
| Форма истории | Ветвящаяся, с коммитом слияния | Линейная |
| Переписывает коммиты | Нет | Да |
| Безопасно на общих ветках | Да | Нет |
| Сохраняет точную историю | Да | Нет |
| Легко отследить, когда что слилось | Да | Сложнее |
Синтаксис
| Command | What it does |
|---|---|
git merge feature | Слить feature в текущую ветку |
git merge --no-ff feature | Всегда создавать коммит слияния |
git rebase main | Переиграть коммиты текущей ветки поверх main |
git rebase -i HEAD~3 | Интерактивно отредактировать последние 3 коммита |
git rebase --abort | Отменить выполняемый rebase |
Git rebase vs merge: вопросы и ответы
В чём разница между git rebase и git merge?
git merge объединяет две ветки, создавая новый коммит слияния, который соединяет их истории, сохраняя точную запись того, что произошло. git rebase, напротив, перемещает ваши коммиты так, что они переигрываются поверх другой ветки, создавая прямолинейную историю, но переписывая эти коммиты с новыми хешами. Merge сохраняет историю; rebase переписывает её ради чистоты.Когда использовать merge, а когда rebase?
Используйте merge для интеграции завершённой ветки (особенно общей) — это безопасно и неразрушающе. Используйте rebase, чтобы привести в порядок собственные локальные коммиты перед тем, как ими делиться, или чтобы обновить ветку функциональности поверх свежего
main ради чистой истории. Многие команды делают rebase локально, а затем merge в main.В чём золотое правило rebase?
Никогда не делайте rebase коммитов, на которых другие уже основали свою работу, — как правило, всего, что вы запушили в общую ветку. Поскольку rebase переписывает коммиты, это вынуждает всех остальных примирять разошедшуюся историю. Свободно делайте rebase на локальных, незапушенных коммитах; используйте merge (или revert) для всего, что уже стало общедоступным.
Что вызывает меньше конфликтов — rebase или merge?
Ни то, ни другое не избегает конфликтов, но они всплывают по-разному. Merge разрешает все конфликты сразу, в коммите слияния. Rebase может попросить вас разрешать конфликты коммит за коммитом по мере того, как каждый переигрывается. Общий объём работы схож; rebase просто растягивает его.
Могу ли я попрактиковаться в этом онлайн?
Да. Откройте терминальный playground, чтобы выполнить
git merge и git rebase в настоящей оболочке в вашем браузере — ничего устанавливать не нужно. Бесплатный интерактивный курс по Git от Coddy также пошагово охватывает слияние и rebase.