Zaawansowana integracja gałęzi: Git Rebase

Zaawansowany Git

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

  • Metoda integrowania zmian
  • Różni się od merge
  • Usuwa commit scalenia dla czystszej historii
  • Utrzymuje liniowy graf commitów dla przejrzystości

Polecenie Git Rebase:

git rebase <branch_name>
Zaawansowany Git

Przykład rebase – przed

Obraz przedstawia gałąź funkcji data-cleanup oraz gałąź main. Gałąź funkcji odgałęzia się po drugim commicie w main. Gałąź main zawiera dwa dodatkowe commity po utworzeniu gałęzi data-cleanup.

Zaawansowany Git

Proces rebase

  1. Przejdź do gałęzi funkcji data-cleanup.
git checkout data-cleanup
  1. Wykonaj rebase gałęzi main na gałąź data-cleanup.
git rebase main
  • Commity z data-cleanup są odtworzone po ostatnim commicie main
  • Commity data-cleanup po rebase otrzymują nowe skróty

Uwaga: Ewentualne konflikty należy rozwiązać ręcznie.

Zaawansowany Git

Przykład rebase – po

Obraz przedstawia gałąź data-cleanup po wykonaniu rebase na gałąź main. Gałąź data-cleanup zawiera teraz wszystkie commity z main, a jej własne commity zaczynają się po wszystkich commitach main. Gałąź main pozostała bez zmian.

Zaawansowany Git

Interaktywny rebase

git rebase -i <commit_hash> 

Funkcjonalność

  • Umożliwia szczegółowe modyfikacje wielu commitów
  • Otwiera edytor

Ostrzeżenie!

  • Rebase na publicznych gałęziach może zakłócić pracę zespołu
    • Nie należy używać rebase na publicznych gałęziach, np. main
  • Ustalić zasady zespołowe dotyczące stosowania rebase
Zaawansowany Git

Interaktywny rebase – przed

$$

Poniżej przedstawiono historię gałęzi data-validation przed edycją historii commitów.

$ 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
Zaawansowany Git

Edytor interaktywnego rebase

Poniżej pokazano, jak edytować historię commitów za pomocą poleceń pick i fixup w otwartym edytorze.

$ 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
...
Zaawansowany Git

Interaktywny rebase – po

Przed

$ 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

Po

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

Następujące commity zostały połączone w jeden

  • abc1234
  • def5678
  • ghi9101
Zaawansowany Git

Merge a rebase

Obraz przedstawia trzy wykresy: wykres rozwidlonych gałęzi, wykres po scaleniu oraz wykres po wykonaniu rebase

Merge

  • Zachowuje pełną historię i strukturę gałęzi
  • Utrzymuje kontekst równoległego rozwoju

Rebase

  • Odtwarza commity na szczycie gałęzi docelowej
  • Tworzy liniową historię
  • Traci część informacji kontekstowych
Zaawansowany Git

Kiedy używać merge, a kiedy rebase

Merge

Do integrowania ukończonych funkcji z zachowaniem kontekstu rozwoju

Rebase

Do aktualizowania gałęzi funkcji względem main lub porządkowania historii przed scaleniem

Pamiętaj

  • Rebase przepisuje historię – stosuj ostrożnie
Zaawansowany Git

Czas na ćwiczenia!

Zaawansowany Git

Preparing Video For Download...