Розширена інтеграція гілок: Git rebase

Просунуте Git

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

  • Метод інтеграції змін
  • Відрізняється від merge
  • Прибирає merge-коміти для чистішої історії
  • Підтримує лінійний граф комітів для ясності

Команда Git rebase:

git rebase <branch_name>
Просунуте Git

Приклад rebase — до

Зображення: функціональна гілка data cleanup і гілка main. Фічегілка відгалужується після другого коміту в main. Після створення гілки data cleanup у main з'явилися ще два коміти.

Просунуте 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 перебазовано на main. Гілка data cleanup тепер має всі коміти 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

Зображено три графи: розгалужена гілка, результат merge та результат rebase

Merge

  • Зберігає повну історію та структуру гілок
  • Підтримує контекст паралельної розробки

Rebase

  • Відтворює коміти поверх цільової гілки
  • Створює лінійну історію
  • Втрачає частину контексту
Просунуте Git

Коли використовувати merge, а коли rebase

Merge

Для інтеграції завершених фіч із збереженням контексту розробки

Rebase

Щоб тримати фічегілки в актуальному стані з main або прибрати зайве перед злиттям

Пам'ятайте

  • Rebase переписує історію — застосовуйте обережно
Просунуте Git

Давайте потренуємось!

Просунуте Git

Preparing Video For Download...