Продвинутая интеграция веток: Git Rebasing

Продвинутый Git

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

  • Метод интеграции изменений
  • Отличается от слияния
  • Устраняет коммиты слияния для чистой истории
  • Сохраняет линейный граф коммитов

Команда Git Rebase:

git rebase <branch_name>
Продвинутый Git

Пример rebase — до

Изображение ветки data-cleanup и ветки main. Ветка feature ответвляется после второго коммита в main. В ветке main есть два дополнительных коммита, созданных после ветки data-cleanup.

Продвинутый Git

Процесс rebase

  1. Переключитесь на ветку data-cleanup.
git checkout data-cleanup
  1. Примените rebase ветки main на ветку data-cleanup.
git rebase main
  • Коммиты data-cleanup воссоздаются после последнего коммита main
  • Перебазированные коммиты data-cleanup получают новые хеши

Примечание: При наличии конфликтов их потребуется разрешить вручную.

Продвинутый Git

Пример rebase — после

Изображение ветки data-cleanup после rebase на ветку main. Ветка data-cleanup теперь содержит все коммиты main, а её собственные коммиты идут после всех коммитов main. Ветка main не изменилась.

Продвинутый Git

Интерактивный rebase

git rebase -i <commit_hash> 

Возможности

  • Позволяет вносить детальные изменения в несколько коммитов
  • Открывает редактор

Внимание!

  • Rebase на публичных ветках может нарушить рабочий процесс
    • Не используйте rebase на публичных ветках, таких как main
  • Договоритесь с командой о правилах применения rebase
Продвинутый Git

Интерактивный rebase — до

$$

Вот история ветки data-validation до редактирования истории коммитов.

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit
Продвинутый Git

Редактор интерактивного rebase

Вот как редактируется история коммитов с помощью команд pick и fixup в открытом редакторе.

$ git rebase -i HEAD~3 
pick ghi9101 Add data validation function
fixup def5678 Fix validation bug
fixup abc1234 Optimize validation performance

# Rebase xyz1234..abc1234 onto HEAD~3(xyz1234) (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# f, fixup <commit> = like "squash", but discard this commit's log message
...
Продвинутый Git

Интерактивный rebase — после

До

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

После

$ git log --oneline data-validatoin
mno6789 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

Следующие коммиты объединены в один:

  • abc1234
  • def5678
  • ghi9101
Продвинутый Git

Merge и rebase: сравнение

На изображении показаны три графа: расходящиеся ветки, результат слияния и результат rebase.

Merge

  • Сохраняет полную историю и структуру веток
  • Поддерживает контекст параллельной разработки

Rebase

  • Воспроизводит коммиты поверх целевой ветки
  • Создаёт линейную историю
  • Теряет часть контекстной информации
Продвинутый Git

Когда использовать merge, а когда rebase

Merge

Для интеграции готовых функций с сохранением контекста разработки

Rebase

Для актуализации feature-веток относительно main или очистки истории перед слиянием

Помните

  • Rebase переписывает историю — используйте его осторожно
Продвинутый Git

Давайте потренируемся!

Продвинутый Git

Preparing Video For Download...