Geavanceerde branch-integratie: Git rebase

Geavanceerd Git

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

  • Methode om wijzigingen te integreren
  • Anders dan merge
  • Verwijdert merge-commits voor een schonere geschiedenis
  • Houdt een lineaire commit-grafiek voor duidelijkheid

Git rebase-opdracht:

git rebase <branch_name>
Geavanceerd Git

Rebase-voorbeeld - vóór

Een afbeelding van de feature-branch data cleanup en de main-branch. De feature-branch vertakt na de tweede commit in main. Main heeft twee extra commits nadat data cleanup is gemaakt.

Geavanceerd Git

Rebase-proces

  1. Check out je data-cleanup-feature-branch.
git checkout data-cleanup
  1. Rebase main op de branch data-cleanup.
git rebase main
  • data-cleanup-commits worden opnieuw gemaakt na de laatste commit van main
  • Gerebase data-cleanup-commits krijgen nieuwe hashes

Let op: Als er conflicten zijn, moet je die handmatig oplossen.

Geavanceerd Git

Rebase-voorbeeld - na

Een afbeelding van de data cleanup-branch die is gerebased op de main-branch. De data cleanup-branch bevat nu alle commits van main en begint daarna met de eigen commits. Main is ongewijzigd.

Geavanceerd Git

Interactieve rebase

git rebase -i <commit_hash> 

Functionaliteit

  • Laat je gerichte wijzigingen in meerdere commits maken
  • Opent een editor

Waarschuwing!

  • Rebasen van publieke branches kan workflows verstoren
    • Gebruik geen rebase op publieke branches, zoals main
  • Maak teamafspraken over wanneer je rebase gebruikt
Geavanceerd Git

Interactieve rebase - vóór

$$

Dit is de geschiedenis van de branch data-validation vóór we de commits bewerken.

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

Interactieve rebase-editor

Zo bewerk je de geschiedenis met pick en fixup in de editor.

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

Interactieve rebase - na

Voor

$ 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

Na

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

De volgende commits zijn samengevoegd tot één:

  • abc1234
  • def5678
  • ghi9101
Geavanceerd Git

Merge versus rebase

De afbeelding toont drie grafieken: een vertakte branch, het resultaat na mergen, en het resultaat na rebasen

Merge

  • Bewaart volledige geschiedenis en branch-structuur
  • Behoudt context van parallelle ontwikkeling

Rebase

  • Speelt commits opnieuw af bovenop de doelbranch
  • Maakt een lineaire geschiedenis
  • Verliest wat context
Geavanceerd Git

Wanneer merge of rebase gebruiken

Merge

Voor het integreren van afgeronde features, met behoud van context

Rebase

Om feature-branches bij te werken met main, of op te ruimen vóór mergen

Onthoud

  • Rebase herschrijft geschiedenis—gebruik het voorzichtig
Geavanceerd Git

Laten we oefenen!

Geavanceerd Git

Preparing Video For Download...