Da jeg endelig stoppede med “random branches” i Git

Da jeg endelig stoppede med “random branches” i Git

Det korte svar er at en god branching strategi i Git for små teams er: én stabil main, korte feature branches, små pull requests og faste regler for rebase og tests. Men det længere svar er mere interessant.

For den dag vi droppede “alle gør bare noget med Git”, forsvandt 80% af vores konflikter. Ikke fordi vi blev bedre til Git, men fordi vi aftalte færre måder at gøre tingene på.

1. Målet: færre konflikter, kortere loops

Inden vi snakker navne, rebase og PR-tjeklister, er det værd at være helt skarp på målet:

  • Du vil have så få merge conflicts som muligt.
  • Du vil have små ændringer igennem hurtigt, så ingen sidder fast bag en stor PR.
  • Du vil kunne rulle tilbage uden panik.
  • Du vil kunne onboarde en ny person uden 45 minutters foredrag om “vores Git-ritualer”.

Hvis I sidder i et lille team eller en studiegruppe, er det her meget vigtigere end at kopiere et komplekst GitFlow-diagram fra en enterprise-blog. Især hvis du i forvejen kun lige føler du har styr på det helt basale Git (så er den her overlevelses-intro til Git i øvrigt et fint sted at starte).

2. Trunk-based vs GitFlow: hvad vælger et lille team?

Der er to klassiske modeller du støder på, når du søger efter “branching strategi Git”:

  • GitFlow: mange branches (develop, release, hotfix, feature branches osv.).
  • Trunk-basedmain eller master) og korte feature branches.

GitFlow er designet til større organisationer med tunge releases. Det kan virke imponerende, men i små teams ender det ofte som:

  • Folk er i tvivl om hvor de skal branchen fra (develop? main? sidste release?).
  • Der ligger gamle branches, ingen tør slette.
  • Fejl bliver rettet forskellige steder og glemt i andre branches.

Trunk-based er kedeligt på den gode måde:

  • Der er kun én sandhed: main.
  • Alt nyt arbejde sker i små feature branches der hurtigt bliver merged ind.
  • Du releaser ofte fra main (dagligt eller flere gange om ugen).

Min erfaring: Hvis I er færre end 8 udviklere og ikke har tunge versionskrav eller separate release-tog, så vælg en trunk-based variant. Du kan altid gøre det mere avanceret senere hvis det faktisk bliver nødvendigt.

3. Den simple model: main + korte feature branches

Her er den model jeg anbefaler små teams og studiegrupper at starte med.

3.1. Regler for main

main er hellig. Det betyder:

  • Ingen direkte commits til main. Alt går gennem pull requests.
  • main skal altid kunne deployes uden at smadre noget åbenlyst.
  • Tests skal køre grøntmain (hvis I overhovedet har tests endnu).

Teknisk kan I låse det med branch protection i GitHub/GitLab, men det vigtigste er faktisk aftalen i teamet, ikke knappen.

3.2. Regler for feature branches

Alt nyt arbejde sker i korte feature branches:

  • Branch ud fra main.
  • Arbejd på én nogenlunde afgrænset ting.
  • Lav PR når du er færdig med den ting (eller vil have feedback).

Eksempel på branch-navne:

  • feature/login-form
  • bugfix/navbar-overflow
  • chore/update-deps-2024-05

Navngivning er ikke magisk, men folk læser branches oftere end de læser dokumentation, så du kan lige så godt hjælpe dem lidt.

3.3. Tommelfingerregler for størrelse

Kort er godt. Nogle enkle regler:

  • PRs på under 300 linjer diff er til at overskue.
  • Hold dig til én ændring pr. branch: “ny login-form” eller “ret bug i pagination” men ikke begge.
  • Hvis PRen føles for stor, er den det nok. Del den op i 2 trin.

Og så commit-beskederne. Det her er ikke poetry slam, bare noget der kan læses om 3 måneder:

feat: tilføj validering til login-form
fix: ret mobil-navigation der overlapper logo
chore: bump react til 18.3

Hvis du gerne vil træne det der med at skrive tydelig dokumentation og små afgrænsede ændringer, så hænger det ret godt sammen med at skrive en README, der faktisk bliver læst.

4. Rebase vs merge: vælg én standard

Her bliver mange små teams uvenner med Git uden at forstå hvorfor.

Du har to typiske flows for at holde din feature branch up-to-date med main:

  • Merge: git merge main inde i din feature branch.
  • Rebase: git rebase main inde i din feature branch.

Begge kan fungere. Problemet opstår når nogle rebaser, andre merger, og I ikke har en regel om hvad der er ok efter at en branch er delt med andre.

4.1. Sikkert default for små teams

Jeg plejer at foreslå denne enkle kontrakt:

  • Inden PR: Du må gerne bruge rebase på din egen branch.
  • Efter PR er oprettet: Brug git merge main for at opdatere din branch.
  • main: Brug “Squash and merge” eller “Rebase and merge” i UIet. Ingen normale merge commits.

Begrundelsen er simpel: Rebase omskriver historikken. Det er fint, så længe det kun er din egen lokale historie. Men det bliver rodet, når andre har hentet din branch, eller når der allerede ligger en PR med kommentarer og referencer til specifikke commits.

4.2. Et konkret rebase-flow før PR

Et trygt flow kan se sådan her ud:

# du står på main
git pull origin main

git checkout feature/login-form
git rebase main
# løs eventuelle conflicts

git push --force-with-lease

--force-with-lease er en lidt mere sikker version af --force, fordi den tjekker at du ikke overskriver andres arbejde på fjern-branchen.

5. PR-tjekliste: hvad skal være på plads før review?

Nu til den del der reelt sparer jer tid: en lille pull request tjekliste alle kan følge.

5.1. Copy/paste tjekliste til dit repo

Lav en fil .github/pull_request_template.md i repoet og smid noget i stil med det her ind:

## Hvad ændrer denne PR?
-

## Tjek før du beder om review
- [ ] Branchen er opdateret med `main`
- [ ] Ingen debug logs / commented-out kode
- [ ] Tests kører lokalt (eller der er en note om hvorfor ikke)
- [ ] Eventuelle database migrations er kørt lokalt
- [ ] Konfig / env-vars er dokumenteret
- [ ] Screenshots er vedhæftet ved UI-ændringer

## Noter til reviewer
-

Det ser banalt ud, men tvinger lige hjernen til at stoppe op et halvt minut før du trykker “Create pull request”. Det er ofte nok til at fange “hov, jeg glemte at fjerne den console.log”.

5.2. Hvad skal revieweren kigge efter?

Som reviewer kan du bruge samme tjekliste, men kigge på den fra modtager-siden:

  • Forstår jeg hvad PRen gør ud fra beskrivelsen?
  • Er ændringen så afgrænset at jeg faktisk kan reviewe den ordentligt?
  • Er der åbenlyse “hvis det her fejler i produktion, gør det så rigtig ondt?” steder, der mangler tests eller logging?

Du kan godt være flink og grundig på samme tid. Det hjælper også din egen læring, især hvis du stadig føler dig lidt ny i test og kvalitet.

6. Release-rytme: små releases uden drama

Branching strategi hænger tæt sammen med hvordan I releaser.

Med trunk-based + korte feature branches vil jeg anbefale:

  • Små, hyppige releases: hellere 3 små om ugen end én stor hver tredje uge.
  • En enkel regel: “Hvis det ligger på main og tests er grønne, må det komme med i næste release”.
  • Hotfix branches: ved akutte fejl laver I hotfix/... direkte fra main, får den igennem review, deployer og er færdige.

Hvis I har CI/CD, kan I automatisk deploye main til staging og have en knap til produktion. Hvis ikke, så er release-ritualet bare et par manuelle kommandoer, men stadig med samme simple regel: alt sker fra main.

Det spiller i øvrigt fint sammen med at have en simpel deployment-struktur som dem vi tit snakker om i kategorien deployment og drift.

7. Onboarding: 30 minutters intro til jeres Git-setup

En god test af din branching strategi er: Kan en ny person forstå den på en halv time, uden whiteboard-diagrammer?

7.1. Lav en “team-kontrakt” i repoet

Jeg kan godt lide at have en docs/git-workflow.md med noget i den her stil:

# Git workflow for dette repo

## Branches
- main: altid deployable, ingen direkte commits
- feature/*: nye features
- bugfix/*: fejlrettelser
- hotfix/*: akutte fejl i produktion

## Sådan arbejder du på en opgave
1. `git checkout main` og `git pull`
2. `git checkout -b feature/kort-beskrivende-navn`
3. Lav dine ændringer, commit med små, meningsfulde beskeder
4. Opdater din branch med `main` ved behov
5. Opret PR når opgaven er afgrænset og klar til review

## Rebase vs merge
- Før PR: du må gerne rebase din egen branch
- Efter PR: brug merge fra main

## Pull requests
- Brug PR-templaten
- Små ændringer, tydelig beskrivelse

Pointen er ikke at have 100 regler, men at alt står et sted, så I slipper for “jeg troede vi gjorde sådan her” i Slack-tråde.

7.2. Gå workflowet igennem som en mini-øvelse

Når en ny person starter, kan du bruge 30 minutter på:

  1. At clone repoet.
  2. At lave en lille test-branch, fx feature/add-readme-note.
  3. At lave en bitte ændring (tilføje en linje i README).
  4. At lave en PR med jeres template.
  5. At lave et review sammen og merge den.

Så har personen prøvet den fulde cyklus: branch, commit, PR, review, merge. Det er meget mere værd end at høre om GitFlow på teori-plan. Især hvis de kommer fra mindre solo-projekter og begynderprojekter, hvor man ofte bare har commit’et direkte til main.

8. En lille huskeregel til jeres næste Git-diskussion

Jeg plejer at bruge den her sætning når Git-diskussioner løber lidt af sporet:

“Hvis vores branching strategi gør det svært at lave en lille ændring og få den i produktion hurtigt, så er strategien for tung.”

Den dag vi fjernede halvdelen af vores branches og gjorde main til det eneste “sande” udgangspunkt, faldt mit Git-stressniveau markant. Jeg savner ikke de lange aftener med mærkelige merge commits og forældede release-branches. Jeg savner til gengæld stadig ikke den gang jeg ødelagde hele historikken med et forkert rebase og lærte på den hårde måde hvorfor man skal have nogle fælles regler.

Så næste gang I overvejer en fancy branching model, kan I måske starte med det simple setup her, se hvad der faktisk sker i jeres hverdag, og kun justere derfra hvis I har et konkret problem at løse.

Rebase er fint på private, lokale branches for at holde en lineær historie før du åbner en PR (fx git rebase main). Undgå at rebase branches som allerede er public eller bruges af andre; så brug merge eller merge-commits for at bevare fælles historik. Brug rebase til at rydde op før review, og revert/merge til historiske ændringer efter publicering.
Hold en kort og konsekvent struktur, fx feature/1234-kort-beskrivelse, fix/567-bug, hotfix/versjon eller release/1.2. Brug små bogstaver, bindestreger til ord og gerne ticket-nummer i starten for sporbarhed. En ensartet navngivning gør reviews og CI-regler meget nemmere at automatisere.
Tag altid et tag før release, så du kan checkout en kendt god version. For public merges brug git revert på merge-commits frem for reset, da revert bevarer historikken og er sikkert for andre. Sørg også for at CI og feature-flags kan slå funktionalitet fra uden fuld rollback.
Begræns hver PR til en enkelt ændringshorizon - en feature, et bugfix eller en refaktorering. Brug draft PRs, del større arbejde i flere små PR'er, og brug feature-flags til at integrere ufærdig funktionalitet. Små, velafgrænsede commits med klare beskrivelser gør reviewarbejdet langt hurtigere.

Sara Vestergaard er selvlært kode-nørd, der stille og roligt er gået fra at rode med en enkelt HTML-side til at bygge små værktøjer, scripts og hjemmesider til sig selv og vennerne. Hun startede med at lave en simpel band-hjemmeside som teenager og opdagede, hvor tilfredsstillende det er, når noget, du har skrevet, pludselig lever på skærmen.

For Sara handler kodning ikke om store ord eller imponerende titler, men om meget konkrete problemer: den kedelige opgave, der tager for lang tid, den ven der mangler en lille porteføljeside, eller den liste, der burde sortere sig selv. Hun elsker at pille ting fra hinanden – også kode – for at se, hvad der egentlig foregår, og hun har brugt utallige aftener på at google fejlbeskeder, teste små eksempler og langsomt bygge sin forståelse op.

På Coding Class deler hun den tilgang videre. Hun skriver til dig, der gerne vil lære at kode ved at gøre det i praksis: små projekter, korte kodebidder og forklaringer, der hænger sammen med det, du faktisk sidder med på skærmen. Hun skærer ind til benet, viser typiske fejl og deres løsninger og giver altid et forslag til, hvordan du kan bygge en tand videre, når grundideen først virker.

Når hun ikke skriver til Coding Class eller nørkler med nye små projekter, hænger Sara på klatrevæggen, vander sine altanplanter eller spiller gamle Nintendo-spil. Men hun ender næsten altid tilbage ved tasterne – for der er altid endnu en lille ting, der kunne være smartere, hurtigere eller bare lidt sjovere at bruge.

Send kommentar

You May Have Missed