Git flow
git-flow are a set of git extensions to provide high-level repository operations for Vincent Driessen's branching model.
Installatie
Keuze tussen het gebruik van commando's of software met interface.
Merge (fast-forward) nooit de remote branch in je eigen lokale branch. REBASE ALTIJD EERST VOOR JE PUSHED
Manueel (commands)
OSX
Homebrew: brew install git-flow-avh
Macports: port install git-flow-avh
Linux
apt-get install git-flow
Windows (Cygwin)
wget -q -O - --no-check-certificate https://raw.github.com/petervanderdoes/gitflow-avh/develop/contrib/gitflow-installer.sh install stable | bash
Zie wiki
Software
Start Git Flow per project: menu: Repository->Git flow
Om een nieuwe branch te starten: rechtsklikken op een branch (master of develop) -> git flow -> start ..
Init
Command
git flow init
Het eerste wat je moet doen is git-flow initialiseren. Hierna zal je enkele vragen moeten beantwoorden over naming conventions voor je branches. De standaard is normaal goed genoeg:
- Production Branch: master
- Development Branch: develop (of development wanneer je project deze al gebruikt)
- Feature Prefix: feature/
- Release Prefix: release/
- Hotfix Prefix: hotfix/
- Version Tag Prefix: leeg
Feature
Feature branches starten van de develop branch en worden ook naar de develop branch gemerged. Deze branches worden gebruikt als een 'verzameling van code' voor een specifieke feature. Dit kan gelijk zijn aan een Forecast Ticket (of 'Sprint') maar dat hoeft niet.
Start
Command
git flow feature start MYFEATURE
Bij het starten van een feature wordt een feature/MYFEATURE branch aangemaakt, gebaseerd op develop. Deze nieuwe branch wordt ook meteen actief.
Finish
Command
git flow feature finish MYFEATURE
Hierbij zal de feature/MYFEATURE merged worden naar develop. Na de merge zal de feature branch ook worden verwijderd en zal develop actief worden.
Hotfix
Hotfix branches starten op master en worden naar master én develop gemerged.
Start
Command
git flow hotfix start MYHOTFIX
Hierbij zal een hotfix/MYHOTFIX branch worden aangemaakt op basis van master. Deze branch zal ook meteen actief worden.
Finish
Command
git flow hotfix finish MYHOTFIX
Wanneer de hotfix afgewerkt is zal deze worden gemerged in master én develop.
Release
Een Release branch start op develop en wordt gemerged naar master. Deze branches worden gebruikt om nieuwe productie-releases voor te bereiden, m.b.v. minor bug fixes etc.
Start
Command
git flow release start v1
Dit zal een nieuwe release/v1 branch maken en actief zetten. Deze branch kan gebruikt worden om een release voor te bereiden:
- Minor bug fixes
- Documentatie updaten
- Migrations schrijven (indien nog nodig)
- Controleren van release
- Changelog bijhouden
- ...
Finish
Command
git flow release finish v1
Wanneer een release klaar is zal deze worden gemerged in master en zal de merge tagged worden met de naam van de release (v1 in dit geval). De release zal ook back-merged worden in develop. Hierna zal de release branch ook worden verwijderd.
Tags
Vergeet niet om je tags te pushen.
Merge vs Rebase
Beide commando's zijn ontworpen om veranderingen van de ene branch in een andere branch te integreren - ze doen het gewoon op heel verschillende manieren.
Wanneer je aanpassingen van de ene branch naar de andere wil overzetten, doe je dit via een merge. De historiek van beide branches worden samengevoegd:
- feature/MYFEATURE -> merge -> develop
- release/v1 -> merge -> master
Een rebase naar bv master zorgt ervoor dat de hele feature branch begint op de laaste commit van de master branch, waardoor alle nieuwe commits effectief in master worden opgenomen. Maar in plaats van een merge commit te gebruiken, herschrijft rebasen de projectgeschiedenis door gloednieuwe commits te creëren voor elke commit in de originele branch.:
- origin/develop -> rebase -> develop
- origin/feature/MYFEATURE -> rebase -> feature/MYFEATURE
Dit doen we omdat er dan geen vervuiling is van de git historiek door Merge Commits, aangezien een rebase geen commit nodig heeft. Je baseert (based) je eigen branch als het ware op een andere (remote) branch.
Versioning
Het aanhouden van een duidelijke versioning kan het opvolgen en onderhouden van een project heel wat makkelijker maken.
Een goeie structuur bij deze versioning zal dus van groot belang zijn. Een voorbeeld:
21.10.2.3
In bovenstaand voorbeeld hebben de waarden volgende betekenis:
- 21 - jaartal
- 10 - maand (major version)
- 2 - feature (grote releases - grote aanpassingen en nieuwe features)
- 3 - update (kleine releases - aanpassingen aan bestaande logica)
Voor een hotfix kan het handig zijn een duidelijk onderscheid te maken, daar kunnen we nog een waarde gaan toevoegen alsook een korte beschrijving.
21.10.2.3.1_hotfix_name
We voegden hier het volgende toe:
- 1 - patch (hotfix)
- _hotfix_name - korte beschrijving
Deze versioning kan je telkens meegeven bij het maken van een release- of een hotfix branch.