Git-Workflow für PHP-Entwickler: Vom Chaos zur Ordnung (und zurück)
\n\nHaben Sie schon einmal am Freitagabend Code in den Master gepusht und gebetet, dass alles funktioniert? Oder sind Sie auf die Hürde mit composer.lock gestoßen, als nach einem Merge alles kaputtging? Willkommen im Club. Git ist nicht nur ein Versionskontrollsystem, es ist Ihr täglicher Begleiter. Aber ohne den richtigen Workflow wird selbst der coolste PHP-Code zur Kürbisfratze.
In diesem Artikel behandeln wir den Git-Workflow für PHP-Entwickler, der wirklich funktioniert: von der Wahl der Branching-Strategie bis zum Deployment. Kein Blabla, nur Code, Beispiele und Lifehacks. Los geht's!
\n\n1. Strategie wählen: Git Flow vs. Trunk-Based
\n\nDie Debatte zwischen Git Flow und Trunk-Based-Development ist länger als die Geschichte der PHP-Frameworks. Aber für die meisten PHP-Projekte (insbesondere Legacy-Projekte auf Symfony/Laravel) bleibt Git Flow der Goldstandard. Warum?
\n\n- \n
- Klare Isolierung von Features, Releases und Hotfixes. \n
- Kontrolle darüber, was in die Produktion geht. \n
- Arbeit mit Composer – kein ständiges Mergen des Dev-Branches nötig. \n
Aber wenn Sie Microservices und CI/CD auf Steroiden haben, ist Trunk-Based auch eine Option. Wir konzentrieren uns auf die Klassiker.
\n\n2. Feature-Branch: Ihr Sandkasten
\n\nJedes neue Feature bekommt einen eigenen Branch. Der Name sollte aussagekräftig sein: feature/PROJ-123-add-payment-gateway. Kein fix-bug oder new-stuff.
Beispiel für den Start:
\n\ngit checkout -b feature/PROJ-42-new-cache-system develop\ngit push origin feature/PROJ-42-new-cache-system\n\nVergessen Sie beim Schreiben des Codes nicht den Composer. Wenn Sie eine neue Abhängigkeit hinzufügen, committen Sie composer.json und composer.lock zusammen. Das erspart Kollegen die Frage "Warum funktioniert es bei mir nicht?"
composer require predis/predis\ngit add composer.json composer.lock\ngit commit -m "PROJ-42: Add predis for caching"\n\nWichtig: Committen Sie nicht vendor/! Fügen Sie es sofort zur .gitignore hinzu.
3. Pull Request: Code-Review ohne Schmerz
\n\nWenn das Feature fertig ist, erstellen Sie einen PR (oder MR in GitLab) in den develop-Branch. Hier ist eine Checkliste, die dem Reviewer Nerven spart:
- \n
- ✅ Code besteht
phpcsundphpstan(mindestens Stufe 6). \n - ✅ Tests wurden geschrieben (PHPUnit, Pest). \n
- ✅
composer.lockwurde aktualisiert. \n - ✅ Keine Konflikte mit
develop. \n
Beispiel für ein CI-Skript (GitHub Actions):
\n\nname: PHP CI\n\non:\n pull_request:\n branches: [ develop ]\n\njobs:\n php-tests:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3\n - name: Install dependencies\n run: composer install --no-interaction --prefer-dist\n - name: Run PHPStan\n run: vendor/bin/phpstan analyse src --level=6\n - name: Run tests\n run: vendor/bin/phpunit\n\nDieser Workflow für PHP-Entwickler automatisiert die Code-Überprüfung, noch bevor jemand den PR ansieht. Magie, oder?
\n\n4. Release-Branch: Vorbereitung für die Produktion
\n\nWenn genügend Features für ein Release zusammengekommen sind, erstellen Sie release/x.y.z aus develop. Hier beheben Sie Bugs, aktualisieren das Changelog und erhöhen die Version in composer.json.
git checkout -b release/1.2.0 develop\n# Bugs beheben, Version aktualisieren\nvim composer.json # "version": "1.2.0" ändern\ngit commit -am "Bump version to 1.2.0"\n# In master und develop mergen\ngit checkout master\ngit merge --no-ff release/1.2.0\ngit tag -a v1.2.0 -m "Release version 1.2.0"\ngit push origin master --tags\n\nBeachten Sie das --no-ff. Dies bewahrt die Branch-Historie, sodass Sie immer wissen, woher der Code kam.