Branching-Strategien im Vergleich: Git Flow, GitHub Flow und Trunk-Based Development
Die Wahl der richtigen Branching-Strategie ist eine der wichtigsten architektonischen Entscheidungen fĂŒr dein Projekt. Sie beeinflusst, wie dein Team zusammenarbeitet, wie schnell ihr Features ausliefern könnt und wie stabil eure Releases sind. Lass mich dir die drei populĂ€rsten Strategien im Detail vorstellen.
đł Git Flow â der strukturierte Klassiker
Git Flow wurde 2010 von Vincent Driessen vorgestellt und war lange Zeit der Standard fĂŒr professionelle Softwareentwicklung. Es ist eine ausgeklĂŒgelte, aber komplexe Strategie mit klar definierten Branch-Typen und strengen Regeln.
Die Branch-Struktur
gitGraph
commit id: "Initial"
branch develop
checkout develop
commit id: "Setup"
branch feature/login
checkout feature/login
commit id: "Login UI"
commit id: "Login Logic"
checkout develop
merge feature/login id: "Merge Login"
branch release/1.0
checkout release/1.0
commit id: "Bugfix"
commit id: "Version bump"
checkout main
merge release/1.0 id: "Release 1.0" tag: "v1.0"
checkout develop
merge release/1.0 id: "Back-merge"
Git Flow definiert fĂŒnf Branch-Typen mit jeweils spezifischen Aufgaben:
-
main(frĂŒhermaster)Der heilige Gral deines Repositories. Dieser Branch enthĂ€lt ausschlieĂlich produktionsreifen Code. Jeder Commit auf
mainreprĂ€sentiert eine Release-Version und wird typischerweise mit einem Tag versehen (z.B.v1.0.0,v1.1.0). Direktes Committen aufmainist streng verboten â Ănderungen kommen nur durch Merges von Release- oder Hotfix-Branches. -
developDer Integrations-Branch fĂŒr alle neuen Entwicklungen. Hier flieĂen alle abgeschlossenen Features zusammen.
developreprĂ€sentiert den aktuellen Entwicklungsstand und ist die Basis fĂŒr neue Feature-Branches. Man könnte sagen:mainist âwas der Kunde sieht",developist âwas als nĂ€chstes kommt". -
feature/*(z.B.feature/user-authentication,feature/shopping-cart)FĂŒr jedes neue Feature wird ein eigener Branch von
developabgezweigt. Hier findet die eigentliche Entwicklungsarbeit statt. Feature-Branches können beliebig viele Commits enthalten und existieren so lange, bis das Feature fertig ist. Nach Abschluss wird der Branch zurĂŒck indevelopgemergt und gelöscht. -
release/*(z.B.release/1.2.0)Wenn
developgenĂŒgend Features fĂŒr eine neue Version angesammelt hat, wird ein Release-Branch abgezweigt. Ab diesem Zeitpunkt kommen keine neuen Features mehr hinzu â nur noch Bugfixes, Dokumentation und Release-Vorbereitungen (Versionsnummern aktualisieren, Changelog schreiben). Nach Fertigstellung wird der Release-Branch sowohl inmainals auch zurĂŒck indevelopgemergt. -
hotfix/*(z.B.hotfix/1.0.1-security-patch)FĂŒr kritische Bugs in der Produktion, die nicht auf den nĂ€chsten regulĂ€ren Release warten können. Hotfix-Branches werden direkt von
mainabgezweigt, enthalten nur die minimale Ănderung zur Fehlerbehebung und werden nach Fertigstellung sowohl inmain(mit neuem Tag) als auch indevelopgemergt.
Der typische Workflow in Git Flow
Ein neues Feature durchlÀuft folgenden Weg:
develop â feature/xyz â develop â release/1.0 â main + develop
â
(Bugfixes)
Und ein Hotfix:
main â hotfix/1.0.1 â main + develop
Vor- und Nachteile von Git Flow
| â Vorteile | â Nachteile |
|---|---|
| Klare Trennung zwischen Entwicklung und Produktion | Hohe KomplexitÀt durch viele Branch-Typen |
| Parallele Arbeit an Release und neuen Features möglich | Lange Feature-Branches fĂŒhren zu schwierigen Merges |
| Gut geeignet fĂŒr versionierte Software mit Releases | Langsamerer Entwicklungszyklus |
Stabile main-Branch garantiert |
Erfordert Disziplin und Tooling |
| Hotfixes können unabhĂ€ngig eingespielt werden | Overkill fĂŒr kleine Teams oder Web-Apps |
Wann Git Flow verwenden?
Git Flow eignet sich besonders fĂŒr:
- Versionierte Software mit klaren Release-Zyklen (z.B. Desktop-Apps, Mobile Apps, Libraries)
- Projekte mit Support fĂŒr mehrere Versionen gleichzeitig
- GröĂere Teams (5+ Entwickler) mit spezialisierten Rollen
- Regulierte Umgebungen, die Nachvollziehbarkeit und Audits erfordern
- Software mit lÀngeren Release-Zyklen (Wochen bis Monate)
đ GitHub Flow â schlank und kontinuierlich
GitHub Flow wurde von GitHub selbst als Reaktion auf die KomplexitĂ€t von Git Flow entwickelt. Es ist radikal einfacher: Es gibt nur main und Feature-Branches. Die Philosophie ist âship early, ship often" â kontinuierliche Auslieferung kleiner Ănderungen.
Die Branch-Struktur
gitGraph
commit id: "Initial"
branch feature/login
checkout feature/login
commit id: "Login UI"
commit id: "Login Tests"
checkout main
merge feature/login id: "PR #1" tag: "deployed"
branch feature/dashboard
checkout feature/dashboard
commit id: "Dashboard"
checkout main
merge feature/dashboard id: "PR #2" tag: "deployed"
branch bugfix/header
checkout bugfix/header
commit id: "Fix Header"
checkout main
merge bugfix/header id: "PR #3" tag: "deployed"
Die sechs Regeln von GitHub Flow
-
mainist immer deploybarDer
main-Branch muss zu jedem Zeitpunkt in Produktion deployt werden können. Das bedeutet: Nur getesteter, funktionierender Code kommt hinein. -
FĂŒr jede Ănderung einen Branch erstellen
Egal ob Feature, Bugfix oder Experiment â erstelle einen beschreibend benannten Branch von
main(z.B.add-user-profile,fix-login-timeout,experiment/new-checkout). -
RegelmĂ€Ăig committen und pushen
Kleine, hĂ€ufige Commits mit klaren Nachrichten. Push regelmĂ€Ăig zu GitHub, damit andere den Fortschritt sehen und du ein Backup hast.
-
Pull Request erstellen, wenn bereit fĂŒr Review
Sobald deine Ănderung bereit fĂŒr Feedback ist (oder du Diskussion brauchst), öffne einen Pull Request. Dies ist der zentrale Ort fĂŒr Code Review und Diskussion.
-
Nach Review und Approval: Merge in
mainSobald der PR approved ist und alle Tests grĂŒn sind, wird er in
maingemergt. Bei GitHub Flow gibt es keine Zwischenstationen. -
Sofort nach dem Merge deployen
Der Merge in
maintriggert (idealerweise automatisch) ein Deployment. Das bedeutet, dass jeder Merge innerhalb von Minuten in Produktion ist.
Der typische Workflow in GitHub Flow
main â feature-branch â Pull Request â Code Review â main â Deploy
â â
(entwickeln) (automatische Tests)
Vor- und Nachteile von GitHub Flow
| â Vorteile | â Nachteile |
|---|---|
| Extrem einfach zu verstehen und umzusetzen | Keine native UnterstĂŒtzung fĂŒr versionierte Releases |
| Fördert kontinuierliche Integration | Erfordert sehr gute Testabdeckung und CI/CD |
| Schnelle Iteration und Feedback-Zyklen | Hotfixes sind ânormal" â keine spezielle Behandlung |
| Pull Requests als zentrale Review-Plattform | Weniger geeignet, wenn mehrere Versionen unterstĂŒtzt werden mĂŒssen |
| Ideal fĂŒr Web-Applikationen und SaaS | Kann bei groĂen Features unĂŒbersichtlich werden |
Wann GitHub Flow verwenden?
GitHub Flow eignet sich besonders fĂŒr:
- Web-Applikationen und SaaS, die kontinuierlich deployt werden
- Kleine bis mittlere Teams (1â10 Entwickler)
- Projekte mit guter CI/CD-Pipeline und automatisierten Tests
- Agile Teams mit kurzen Sprints und hÀufigen Releases
- Startups und schnell iterierende Produkte
đŻ Trunk-Based Development â der radikale Ansatz
Trunk-Based Development (TBD) geht noch einen Schritt weiter als GitHub Flow. Die Idee: Alle Entwickler committen direkt in einen einzigen Branch (den âTrunk", typischerweise main). Feature-Branches existieren entweder gar nicht oder sind extrem kurzlebig (maximal 1â2 Tage).
Die Branch-Struktur
gitGraph
commit id: "Feature A - Part 1"
commit id: "Feature A - Part 2"
commit id: "Bugfix"
commit id: "Feature B" tag: "deployed"
commit id: "Refactoring"
commit id: "Feature A - Part 3"
commit id: "Feature A complete" tag: "deployed"
Die Kernprinzipien
-
Ein einziger Branch fĂŒr alle
Es gibt nur
main(den âTrunk"). Alle Entwickler integrieren ihre Ănderungen hier. Lange lebende Feature-Branches sind verboten. -
Sehr kleine, sehr hÀufige Commits
Statt eines groĂen Commits am Ende eines Features gibt es viele kleine Commits wĂ€hrend der Entwicklung. Jeder Commit muss den Build grĂŒn halten.
-
Feature Flags fĂŒr unfertige Features
Wie bringt man Code fĂŒr ein halbfertiges Feature in
main, ohne dass Nutzer es sehen? Durch Feature Flags (auch Feature Toggles genannt):if ($featureFlags->isEnabled('new-checkout-process')) { return $this->newCheckoutProcess($cart); } else { return $this->legacyCheckout($cart); }Das Feature wird erst âeingeschaltet", wenn es fertig ist â obwohl der Code schon lange in Produktion ist.
-
Kurzlebige Feature-Branches (optional)
Manche Teams erlauben Feature-Branches, aber mit strikter Regel: Sie dĂŒrfen maximal 1â2 Tage existieren und mĂŒssen dann gemergt werden. Das erzwingt kleine, inkrementelle Ănderungen.
-
Exzellente CI/CD ist Pflicht
Da jeder Commit potenziell in Produktion geht, muss die Test-Pipeline schnell und zuverlĂ€ssig sein. Typischerweise < 10 Minuten fĂŒr den kompletten Build.
Branch by Abstraction
FĂŒr gröĂere Refactorings, die nicht in 1â2 Tagen erledigt sind, nutzt TBD das Pattern âBranch by Abstraction":
- Erstelle eine Abstraktionsschicht (Interface) vor dem zu Àndernden Code
- Implementiere die neue Version hinter dem Interface
- Schalte schrittweise um (Feature Flag oder schrittweise Migration)
- Entferne die alte Implementierung, sobald die neue stabil ist
So bleibt der Code immer lauffÀhig, obwohl du parallel zwei Implementierungen hast.
Vor- und Nachteile von Trunk-Based Development
| â Vorteile | â Nachteile |
|---|---|
| Keine Merge-Hölle durch lang lebende Branches | Erfordert erfahrene, disziplinierte Entwickler |
| Maximale Kontinuierliche Integration | Feature Flags erhöhen Code-KomplexitÀt |
| Sehr schnelles Feedback | Sehr gute Testabdeckung ist Voraussetzung |
| Fördert kleine, fokussierte Ănderungen | Kann fĂŒr Junior-Entwickler ĂŒberfordernd sein |
| Von Google, Facebook und anderen Tech-Giganten verwendet | Weniger Review-Möglichkeiten vor dem Merge |
Wann Trunk-Based Development verwenden?
Trunk-Based Development eignet sich besonders fĂŒr:
- Erfahrene, hochperformante Teams mit starker Ingenieurskultur
- Unternehmen mit exzellenter CI/CD-Infrastruktur
- Projekte, die mehrmals tÀglich deployen wollen
- Teams, die Pair Programming praktizieren (ersetzt Code Review)
- Microservices-Architekturen mit kleinen, fokussierten Repositories
đ Der groĂe Vergleich
| Aspekt | Git Flow | GitHub Flow | Trunk-Based |
|---|---|---|---|
| KomplexitÀt | Hoch | Niedrig | Mittel* |
| Branch-Typen | 5 (main, develop, feature, release, hotfix) | 2 (main, feature) | 1 (main) |
| Lebensdauer Feature-Branch | Tage bis Wochen | Stunden bis Tage | Keine oder < 2 Tage |
| Release-Modell | Geplante Versionen | Kontinuierlich | Kontinuierlich |
| Merge-Frequenz | Selten, dafĂŒr gröĂer | HĂ€ufig | Sehr hĂ€ufig (mehrmals tĂ€glich) |
| CI/CD-Anforderung | Optional | Empfohlen | Pflicht |
| Feature Flags nötig? | Nein | Selten | Ja |
| Parallele Versionen | Ja | Nein | Nein |
| Team-GröĂe | Mittel bis groĂ | Klein bis mittel | Klein bis mittel (erfahren) |
| Lernkurve | Steil | Flach | Mittel |
*Die KomplexitÀt bei TBD liegt nicht im Branching, sondern in den Praktiken (Feature Flags, kleine Commits, CI/CD).
đĄ Meine Empfehlung fĂŒr dein PHP-Webprojekt
Du beschreibst ein mittelgroĂes PHP-Webprojekt mit regelmĂ€Ăigen Releases. Lass mich die Faktoren analysieren:
Analyse deiner Situation
- âMittelgroĂ" deutet auf ein Team von 2â8 Entwicklern hin
- âPHP-Webprojekt" ist typischerweise eine Web-Applikation, die deployt wird (nicht installierte Software)
- âRegelmĂ€Ăige Releases" können unterschiedlich interpretiert werden:
- Wöchentlich/zweiwöchentlich â GitHub Flow geeignet
- Monatlich mit festen Versionen â Git Flow könnte passen
- Kontinuierlich â Trunk-Based möglich
Meine Empfehlung: GitHub Flow mit Release-Tags đ
FĂŒr dein Szenario empfehle ich GitHub Flow, aber mit einer kleinen Erweiterung fĂŒr die Versionierung:
flowchart LR
subgraph Entwicklung
A["Feature-Branch\nerstellen"] --> B["Entwickeln\nund testen"]
B --> C["Pull Request\nerstellen"]
C --> D["Code Review"]
D --> E["Merge in main"]
end
subgraph Release
E --> F{"Release\nfÀllig?"}
F -->|Ja| G["Tag erstellen\nv1.2.0"]
F -->|Nein| H["Weiter entwickeln"]
G --> I["Deployment"]
end
style G fill:#90EE90,color:#000000
style I fill:#87CEEB,color:#000000
Warum GitHub Flow fĂŒr dich?
-
Einfachheit: Du und dein Team mĂŒsst nicht fĂŒnf verschiedene Branch-Typen jonglieren. Die Regeln passen auf einen Bierdeckel.
-
Web-Applikation: PHP-Webprojekte werden deployt, nicht installiert. Du brauchst keine parallelen Versionen zu unterstĂŒtzen â es gibt nur âwas gerade live ist".
-
Pull Requests als QualitĂ€tssicherung: Jede Ănderung durchlĂ€uft einen Review-Prozess. Das ist Gold wert fĂŒr die Code-QualitĂ€t.
-
FlexibilitÀt bei Releases: Du kannst so oft oder selten releasen, wie du möchtest. Ein Release ist einfach ein Tag auf
main. -
Einfacher Einstieg: Falls Teammitglieder noch nicht so Git-erfahren sind, ist GitHub Flow viel leichter zu erlernen als Git Flow.
Wie du âregelmĂ€Ăige Releases" mit GitHub Flow umsetzt
Anstatt Release-Branches zu nutzen, arbeitest du mit Tags und einem Release-Rhythmus:
# Nach dem Merge aller Features fĂŒr Version 1.2.0
git tag -a v1.2.0 -m "Release 1.2.0: User Dashboard, Performance Improvements"
git push origin v1.2.0
In GitHub kannst du dann einen formalen Release erstellen, der auf diesen Tag verweist â mit Changelog, Release Notes und ggf. Assets.
Dein angepasster Workflow
-
FĂŒr jede Aufgabe: Erstelle einen Branch von
maingit checkout main git pull git checkout -b feature/user-dashboard -
Entwickle und committe regelmĂ€Ăig mit aussagekrĂ€ftigen Nachrichten
-
Erstelle einen Pull Request auf GitHub, wenn bereit fĂŒr Review
-
Nach Approval: Merge in
main(ich empfehle âSquash and Merge" fĂŒr eine saubere Historie) -
FĂŒr Releases: Wenn genĂŒgend Features gemergt sind, erstelle einen Tag und deploye:
git checkout main git pull git tag -a v1.2.0 -m "Release 1.2.0" git push origin v1.2.0 # Deployment triggern (manuell oder automatisch via GitHub Actions) -
FĂŒr Hotfixes: Behandle sie wie normale Features â Branch erstellen, fixen, PR, mergen. Danach ggf. Patch-Version taggen (
v1.2.1).
Wann du doch Git Flow in Betracht ziehen solltest
Ăberdenke meine Empfehlung, wenn einer dieser Punkte zutrifft:
- Du musst mehrere Versionen parallel unterstĂŒtzen (z.B. v1.x und v2.x gleichzeitig pflegen)
- Du hast sehr lange Release-Zyklen (> 1 Monat) mit umfangreichen QA-Phasen
- Du arbeitest in einer regulierten Branche (Medizin, Finanzen) mit strengen Audit-Anforderungen
- Dein Team ist sehr groĂ (> 10 Entwickler) und braucht klare Abgrenzungen
Wann Trunk-Based Development interessant wÀre
- Du möchtest mehrmals tÀglich deployen
- Dein Team ist sehr erfahren und praktiziert Pair Programming
- Du hast eine exzellente CI/CD-Pipeline mit < 10 Minuten Build-Zeit
- Du bist bereit, in Feature Flags zu investieren
đ Zusammenfassung
| Strategie | Motto | Ideal fĂŒr |
|---|---|---|
| Git Flow | âStruktur und Kontrolle" | Versionierte Software, groĂe Teams, lange Zyklen |
| GitHub Flow | âShip early, ship often" | Web-Apps, kleine-mittlere Teams, kontinuierliche Delivery |
| Trunk-Based | âImmer integriert" | Hochperformante Teams, mehrfach tĂ€gliches Deployment |
FĂŒr dein mittelgroĂes PHP-Webprojekt ist GitHub Flow der Sweet Spot: Einfach genug, um schnell produktiv zu sein, aber strukturiert genug fĂŒr professionelle Zusammenarbeit. Mit Tags und GitHub Releases bekommst du die Versionierung, die du fĂŒr âregelmĂ€Ăige Releases" brauchst â ohne die KomplexitĂ€t von Git Flow.
Starte mit GitHub Flow, und wenn du merkst, dass du mehr Struktur brauchst, kannst du immer noch zu Git Flow wechseln. Der umgekehrte Weg (von komplex zu einfach) ist erfahrungsgemÀà schwieriger! đ