Rebase vs Merge
В чём разница
Merge сохраняет историю как есть — с ветвлениями и merge-коммитами.
Rebase переписывает историю — коммиты твоей ветки как будто сделаны поверх актуального main.
Визуально
Исходно:
main: A---B---E
feature: C---D
После git merge main (из feature):
main: A---B---E
feature: C---D---M
↑ merge-коммит
После git rebase main (из feature):
main: A---B---E
feature: C'---D'
↑ новые коммиты
Разница: при rebase история линейная, без merge-коммитов.
Как делать rebase
git switch feature/user-profile
git rebase main
Если конфликты:
# Решаешь конфликт
git add file.txt
git rebase --continue
# Или отменить
git rebase --abort
Интерактивный rebase
Самое мощное. Позволяет:
- Объединить коммиты (squash)
- Изменить сообщения (reword)
- Удалить коммиты (drop)
- Переставить порядок
git rebase -i HEAD~5
Откроется редактор:
pick abc123 feat: добавить поле name
pick def456 fix: поправить опечатку
pick ghi789 feat: добавить валидацию
pick jkl012 fix: опечатка в тесте
Команды:
pick— оставить как естьreword— изменить сообщениеsquash— объединить с предыдущимfixup— объединить, отбросив сообщениеdrop— удалитьedit— остановиться для правки
Пример — сжать всё в один коммит:
pick abc123 feat: добавить авторизацию
squash def456 fix: опечатка
squash ghi789 fix: ещё опечатка
Rebase vs Merge: когда что
| Ситуация | Что использовать |
|---|---|
| Обновить feature от main | Rebase |
| Влить feature в main | Merge (или squash) |
| Чистая история перед PR | Rebase |
| Публичная ветка (main) | Merge (никогда не rebase) |
| Своя ветка до PR | Rebase |
Золотое правило: не делай rebase публичных веток. Если кто-то уже стянул твою ветку — rebase сломает им историю.
Rebase feature перед PR
Стандартный workflow:
# 1. Обновляем main
git switch main
git pull
# 2. Возвращаемся в фичу
git switch feature/user-profile
# 3. Rebase на main
git rebase main
# 4. Если были конфликты — решаем, потом:
git rebase --continue
# 5. Force push (своя ветка!)
git push --force-with-lease
--force-with-lease безопаснее чем --force: не сработает, если кто-то успел запушить.
Force push
git push --force # перезаписать удалённую ветку (опасно)
git push --force-with-lease # только если никто не запушил после тебя
Никогда не делай --force в main или develop.
Squash при merge в GitHub
В GitHub при merge PR есть 3 опции:
- Create a merge commit — обычный merge
- Squash and merge — все коммиты в один
- Rebase and merge — перенос коммитов в
main
Для чистоты — используй Squash and merge. В main попадает один коммит с понятным сообщением.
Итог
Правила:
- Rebase — для своей ветки перед PR
- Merge — для вливания в main
- Squash — для чистоты истории
- Никогда не rebase публичных веток
Дальше — Pull Request и Code Review.