Git hilft in vielfältiger Art und Weise bei der Organisation von Code aber auch bei Automatisierung von Deployments.
Hier ein paar hilfreiche Grundlagen zur Arbeit mit Git, hier am beispiel Github.
1. Repository erstellen
Der einfachste Weg ein neues Repository zu erstellen ist dieses direkt auf Github anzulegen und erst danach lokal zu klonen.
Also einfach auf github.com unter dem eigenen Account ein neues Repository anlegen.
Achte beim anlegen darauf, dass der Hauptbranch „main“ und nicht „master“ benannt wird.
Das Repository kann anschließend lokal geklont werden:
git clone https://github.com/<dein-username>/git_workflow.git
cd git_workflow2. Python Projekt erstellen
Erstelle eine einfache Python Datei mit Namen „app.py“:
def add(a, b):
return a + b
if __name__ == "__main__":
print(add(2, 3))Erstelle eine einfachen PyTest Datei für diese App. Diese sollte „test_app.py“ heißen und im gleichen Verzeichnis sein wie die Datei „app.py“:
from app import add
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0Danach sollte alles auf Git committed werden:
git add .
git commit -m "created app.y and test.py"
git push -u origin mainFeature auf eigenem Branch entwickeln
Zunächst wird ein neues Feature auf einem neuen Branch entwickelt. Der Branch in Git kann so erstellt werden:
git checkout -b new_featureEs ist dabei sinnvoll folgende Konvention zu befolgen:
feature/für neue Featuresfix/für Bugfixeschore/für organisatorische Änderungen
Die anschließenden Commits zielen nun nicht mehr auf den main-Branch:
git add .
git commit -m "message"
git push -u origin feature/new_featureWenn das Feature fertig ist, kann man es in den Main-Branch mergen.
git checkout main
git merge -m "Nachricht" feature/new_feature
git push -u origin mainAnschließend sollte der Feature-Branch entfernt werden:
git branch -d feature/new_feature
git push origin --delete feature/new_feature3. Pull requests
Pull requests dienen dazu, das mergen eines Feature branches vorher überprüfen zu lassen.
Zunächst wird ein neues Feature auf einem neuen Branch entwickelt. Wenn die Entwicklung abgeschlossen ist:
git commit -m "new feature"
git push origin feature/new_featureIn GitHub startet man dann einen Pull Request. Hier kann der Code von Teammitgliedern überprüft, kommentiert und ggf. angepasst werden. Wenn alles passt, klickt man in GitHub auf „Merge pull request“.
Moderne Branching-Strategien in professionellen Projekten
In professionellen Softwareprojekten kommt es stark auf eine klare, standardisierte Branching-Strategie an, um Stabilität, Geschwindigkeit und Übersicht im Entwicklungsprozess zu gewährleisten. Im Folgenden ein Überblick über aktuelle state-of-the-art Ansätze, die heute am häufigsten genutzt werden:
GitHub Flow
Der GitHub Flow ist besonders in agilen Teams und bei Continuous Deployment beliebt.
Er ist einfach, schlank und eignet sich hervorragend für Webanwendungen mit häufigen Releases.
main
\
\--- feature/login
\
(commit)
\
--> Pull Request --> Merge --> main --> DeployAblauf:
- Alles basiert auf dem
main-Branch. - Für jedes Feature wird ein kurzer
feature/<name>-Branch erstellt. - Änderungen werden per Pull Request zurück in
maingemerged. - Nach dem Merge wird automatisch (z. B. via CI/CD) deployt.
Vorteil: Sehr geringe Komplexität, ideal für Continuous Deployment.
Nachteil: Weniger geeignet für Projekte mit parallelen Versionen oder Release-Zyklen.
GitLab Flow
Der GitLab Flow kombiniert das Beste aus GitHub Flow und GitFlow.
Er integriert Umgebungen (z. B. staging, production) in den Workflow.
main --------------------> staging ------------------> production
\ ^
\ |
\--- feature/new_api --/Typischer Ablauf:
- Branches wie
feature/*,fix/*,hotfix/*dienen der Entwicklung. - Merges erfolgen in
mainoderdevelop, je nach Stabilität. - Zusätzlich gibt es environment branches wie
stagingoderproduction, die mit bestimmten Deployments verknüpft sind.
Vorteil: Nahtlose Integration mit DevOps-Pipelines und Deployments.
Nachteil: Etwas mehr Struktur nötig als beim GitHub Flow.
Trunk-Based Development
Ein zunehmend populärer Ansatz bei CI/CD-First-Teams (z. B. bei Google, Meta, Spotify).
Hier wird auf kurzlebige Feature-Branches gesetzt, die innerhalb weniger Stunden oder Tage wieder gemerged werden.
main
|\
| \___ small_feature (1 day)
| /
|----/----> CI/CD deploys multiple times per dayPrinzipien:
- Entwickler arbeiten direkt auf dem
main(auch „trunk“) oder in sehr kurzlebigen Branches. - Jeder Commit wird durch automatisierte Tests und Code Reviews geprüft.
- Deployment erfolgt mehrmals täglich.
Vorteil: Extrem schnelle Integration, ideal für Microservices und Continuous Delivery.
Nachteil: Erfordert disziplinierte Teams und ausgereifte Testautomatisierung.
Weitere nützliche Git-Kommandos
Git Stash
Wenn du an etwas arbeitest, aber kurzfristig auf einen anderen Branch wechseln musst, kannst du uncommittete Änderungen temporär speichern:
git stashÄnderungen verschwinden aus dem Arbeitsverzeichnis, sind aber sicher zwischengespeichert. Anschließend kannst du z. B. den Branch wechseln.
Wenn du später weitermachen willst:
git stash popGit Log
Zeigt die Historie aller Commits an:
git log --oneline --graph --decorateIdeal, um Branch-Verläufe visuell zu überblicken.
Git Diff
Zeigt, was sich seit dem letzten Commit geändert hat:
git diffOder vergleiche zwei Branches:
git diff main..feature/loginGit Rebase
Der Befehl git rebase wird oft verwendet, um die Commit-Historie linear und lesbar zu halten, insbesondere vor dem Mergen in den main-Branch.
Im Gegensatz zu git merge, das eine neue Merge-Verzweigung erzeugt, „setzt“ git rebase deine Commits auf eine neue Basis – so, als hättest du deine Arbeit auf einem aktuelleren Stand begonnen.
Beispiel: Man arbeitet auf einem Feature-Branch, während der main-Branch weiterentwickelt wurde. Wenn man git merge main ausführt, dann sieht die Historie so aus:
A --- B --- C --- F --- M
\ /
D --- E -----
Bit Git Rebase setzt man dagegen die Commits D und E auf F auf:
git checkout feature
git fetch origin
git rebase origin/mainIm Ergebnis entstehen D‘ und E‘, eigentlich Kopien der ursprünglichen Commits, aber auf die neue Basis gesetzt:
A --- B --- C --- F --- D' --- E'Wichtig: Rebase sollte nicht auf Branches verwendet werden, die bereits geteilt oder gemerged wurden. Es macht nur auf lokalen Branches Sinn.
Git Squash
„Squashen“ bedeutet, mehrere Commits in einen einzigen Commit zusammenzufassen. Das ist nützlich, um kleine, unwichtige Zwischen-Commits zu reduzieren, bevor man in main merged. Wenn man in GitHub einen Pull Request mergt, kannst man statt „Merge commit“ den Modus „Squash and merge“ wählen. Dadurch wird automatisch ein einziger Commit auf main erstellt – selbst wenn dein Feature-Branch aus vielen kleinen Commits bestand. Das ist heute Best Practice in vielen Teams, um eine saubere Main-Historie zu behalten.
Mit interactive rebase geht es so kann man so vorgehen, dass man zunächst die letzten bspw. die 3 Commits auswählt:
git rebase -i HEAD~3Im Editor sieht es dann ungefähr so aus:
pick a1b2c3 initial API implementation
pick d4e5f6 add more tests
pick g7h8i9 fix typoDie Zeilen die man zusammenführen möchte, setzt man auf squash:
pick a1b2c3 initial API implementation
squash d4e5f6 add more tests
squash g7h8i9 fix typo