Avancerad grensintegrering: Git Rebase

Avancerad Git

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

  • Metod för att integrera ändringar
  • Skiljer sig från merge
  • Tar bort merge-commits för en renare historik
  • Behåller en linjär commit-graf för tydlighet

Git Rebase-kommando:

git rebase <branch_name>
Avancerad Git

Rebase-exempel – innan

En bild av feature-grenen data-cleanup och main-grenen. Feature-grenen divergerar efter den andra committen i main. Main-grenen har två ytterligare commits efter att data-cleanup-grenen skapades.

Avancerad Git

Rebase-processen

  1. Checka ut din data-cleanup-feature-gren.
git checkout data-cleanup
  1. Rebasea main-grenen onto data-cleanup-grenen.
git rebase main
  • data-cleanup-commits återskapas efter mains senaste commit
  • Rebaserade data-cleanup-commits får nya hashar

Observera: Eventuella konflikter måste lösas manuellt.

Avancerad Git

Rebase-exempel – efter

En bild av data-cleanup-grenen rebasead onto main-grenen. Data-cleanup-grenen innehåller nu alla commits från main, och data-cleanup-commits börjar efter alla main-commits. Main-grenen är oförändrad.

Avancerad Git

Interaktiv rebase

git rebase -i <commit_hash> 

Funktionalitet

  • Låter utvecklaren göra detaljerade ändringar i flera commits
  • Öppnar en editor

Varning!

  • Rebaseing av publika grenar kan störa arbetsflöden
    • Använd inte rebase på publika grenar, som main
  • Sätt upp teamregler för när rebase ska användas
Avancerad Git

Interaktiv rebase – innan

$$

Här är historiken för data-validation-grenen innan vi redigerar commit-historiken.

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

Interaktiv rebase-editor

Så här redigerar vi commit-historiken med kommandona pick och fixup i den öppna editorn.

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

Interaktiv rebase – efter

Innan

$ 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

Efter

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

Följande commits slås samman till en

  • abc1234
  • def5678
  • ghi9101
Avancerad Git

Merge jämfört med rebase

Bilden visar tre grafer: en divergerad grengraf, den resulterande merge-grafen och den resulterande rebase-grafen

Merge

  • Bevarar fullständig historik och grenstruktur
  • Bibehåller kontexten för parallell utveckling

Rebase

  • Spelar upp commits ovanpå målgrenen
  • Skapar en linjär historik
  • Förlorar viss kontextuell information
Avancerad Git

När ska du använda merge respektive rebase

Merge

För att integrera färdiga features och bevara utvecklingskontexten

Rebase

För att hålla feature-grenar uppdaterade med main, eller för att städa upp inför en merge

Kom ihåg

  • Rebase skriver om historiken – använd det varsamt
Avancerad Git

Nu kör vi en övning!

Avancerad Git

Preparing Video For Download...