Complexe mergescenario's

Geavanceerd Git

Amanda Crawford-Adamo

Software and Data Engineer

Repo voor flight travel data pipeline

Een grafiek van de map- en bestandsstructuur van de flight travel data pipeline-repo. De git-werkmap heeft 4 bestanden: etl.py, load.py, transform.py en ingest.py. De map data bevat de map flight_data.csv. Daarnaast is de map .git ook zichtbaar.

Geavanceerd Git

Git squash merging

$$

Functionaliteit

  • Maakt één nieuwe commit op de targetbranch
  • Bundelt alle wijzigingen van de sourcebranch
    • Voegt een normale commit met één ouder toe (anders dan de recursive-strategie)
  • Toegevoegd aan de targetbranch (niet de featurebranch)
    • Bewaart niet de gedetailleerde commithistorie van de sourcebranch

$$

Voordelen

  • Schone, lineaire geschiedenis
  • Maakt code review van grote features eenvoudiger
  • Gemakkelijk de hele feature terug te draaien
Geavanceerd Git

Voorbeeld van squash merge

De branch data-cleanup splitst van de main-branch na de tweede commit. De main-branch heeft één extra commit. Data-cleanup heeft twee extra commits.

Geavanceerd Git

Proces voor squash merge

  1. Checkout de main-branch

    $ git checkout main
    
  2. Maak een squash-commit van alle data-cleanup-wijzigingen

    $ git merge --squash data-cleanup
    
  3. Commit de squash-commit in de geschiedenis van main

    $ git commit -m "Implement and optimize data cleanup"
    
Geavanceerd Git

Resultaat van squash merge

Een grafiek met twee branches: main en data-cleanup. Main heeft vier commits. De featurebranch splitst na de laatste commit van main en heeft één extra commit. De laatste commit op main is een single-parent commitobject dat de gesquashte commits van data-cleanup bevat.

Geavanceerd Git

Git octopus merge

$$

Functionaliteit

  • Mergt drie of meer branches tegelijk
  • Maakt één merge-commit met meerdere ouders
  • Beste als branches geen conflicten hebben

$$

Voordelen

  • Handig om meerdere losse features tegelijk te integreren
  • Geschikt om meerdere release-branches voor verschillende versies te synchroniseren
Geavanceerd Git

Octopus-mergevoorbeeld

Een weergave van vier ontwikkelbranches: main, ingestion, transform en load. Ingestion, transform en load vertakken van main na de eerste commit en hebben elk een extra commit. Main heeft ook één extra commit.

Geavanceerd Git

Octopus-mergecommando's

Git Octopus Merge-commando

git merge -s octopus

Voorbeeld

$ git merge -s octopus ingest transform load
Trying simple merge with ingest
Trying simple merge with transform
Trying simple merge with load
Merge made by the 'octopus' strategy.
...
Geavanceerd Git

Octopus-merge resultaat

Een weergave van vier ontwikkelbranches: main, ingestion, transform en load. Ingestion, transform en load vertakken van main na de eerste commit en hebben elk een extra commit. Main heeft vijf commits die de commits van de andere branches bevatten. De laatste merge-commit heeft vier ouders: de vorige laatste commit van main en de laatste commits van ingest, transform en load.

Geavanceerd Git

Samenvatting

Squash merge

  • Vereenvoudigt geschiedenis, voegt meerdere commits samen tot één
  • Gebruik squash merges voor een schone, eenvoudige geschiedenis
    git merge --squash <source_branch>
    

Octopus merge

  • Behoudt branch-structuur
  • Mergt meerdere branches tegelijk
  • Efficiënt voor parallelle ontwikkelingen
    git merge -s octopus <branch 1> <branch 2> <branch 3>
    
Geavanceerd Git

Laten we oefenen!

Geavanceerd Git

Preparing Video For Download...