Урок 05

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 от mainRebase
Влить feature в mainMerge (или squash)
Чистая история перед PRRebase
Публичная ветка (main)Merge (никогда не rebase)
Своя ветка до PRRebase

Золотое правило: не делай 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.