Git Commits sind die Grundbausteine für das Version Control. Doch wie strukturiert man Commits, um die Historie übersichtlich zu halten?
Conventional Commits definieren einen Standard für lesbare, maschinenlesbare Git Commit Messages. Wir schauen uns an, wie sich das in die Praxis umsetzen lässt.
Das Problem unstrukturierter Commit Messages
Ohne Konventionen kommen häufig Kommits wie diese zustande:
Fixed bug with login
Changes to API and docs
Bei hunderten von Commits wird das unmöglich zu durchsuchen und nachzuvollziehen.
Weiterhin lassen sich so Commits schwer automatisch verarbeiten, zum Beispiel für Changelogs oder Versionierungs-Workflows.
Die Spezifikation von Conventional Commits
Conventional Commits legen fest, dass Commit Messages folgendes Format haben sollten:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Der Commit Type ist dabei einer von:
- fix: Bugfixes
- feat: Neue Features
- docs: Änderungen an der Dokumentation
- style: Formatierungsänderungen
- refactor: Refaktorierungen
- test: Teständerungen
- chore: Maintanence Änderungen
Beispiele:
fix: correct minor typos in code
feat(parser): add ability to parse arrays
docs(readme): improve usage section
Vorteile von Conventional Commits
- Lesbarkeit: Der Commit Type gibt sofort Aufschluss über die Änderung.
- Konsistenz: Alle Entwickler nutzen die gleiche Systematik.
- Suche: Nach Commits bestimmter Typen lässt sich gut filtern.
- Changelogs: Changelogs können automatisiert generiert werden.
- Semantische Versionierung: Versionsnummern können abgeleitet werden.
- Tooling: Viele Tools unterstützen Conventional Commits.
Conventional Commits in der Praxis
Folgende Schritte helfen Conventional Commits im Projekt zu etablieren:
- Richtlinie im Team einführen und kommunizieren
- Template erstellen (z.B. git commit template)
- Linting mit Commitlint oder husky
- Changelog Generation einrichten
- CI: Pull Requests automatisch prüfen
- Semantische Releases nutzen
Mit der Zeit werden Conventional Commits zur Gewohnheit im Entwicklungsprozess.
Commit Template
Ein Template sorgt für standardisierte Commit Messages:
# Datei unter .git/COMMIT_EDIT_MSG
<type>(scope): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
Linting mit Commitlint
Commitlint prüft eingehende Commit Messages:
// commitlint.config.js
module.exports = {
extends: ['@commitlint/config-conventional']
};
Damit lassen sich fehlerhafte Commits früh abfangen.
Automatische Changelog Generierung
Mit Conventional Commits können Changelogs automatisch generiert werden:
// package.json
{
"release": {
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s"
}
}
Der Type und Scope werden für eine strukturierte Übersicht genutzt.
Commit Checks in CI Commit Messages können auch in der CI automatisch validiert werden. So wird sichergestellt, das nur valide Commits gemerged werden.
Semantische Versionierung
Bei semantischer Versionierung folgen Versionsnummern schematisch MAJOR.MINOR.PATCH.
- MAJOR: Breaking Changes
- MINOR: Neue Features, rückwärtskompatibel
- PATCH: Bugfixes, rückwärtskompatibel
1.0.0 -> 1.1.0 -> 1.1.1 -> 2.0.0
Semantische Versionierung hat mehrere Vorteile:
- Kompatibilität: Aus der Versionsnummer ist ersichtlich, ob sich die API geändert hat.
- Changelogs: Aus dem Versionsverlauf lassen sich Changes ableiten.
- Automatisierung: Versionen können anhand von Commits automatisch vergeben werden.
Durch dieses Schema können Abhängigkeiten besser verwaltet werden. Packages können Abhängigkeiten mit Versionsbereichen angeben:
"dependencies": {
"my-lib": "^1.1.0"
}
Hier würden nur nicht-breaking Updates eingespielt werden.
Automatisierte Releases
Mit semantic-release können Versionsnummern und Changelogs automatisiert aus Git Commits generiert werden:
"release": {
"branches": [
"main"
]
}
Der Release Prozess kann auch in CI integriert werden, um Analyse- und Veröffentlichungsschritte zu automatisieren.
Fazit
Semantische Versionierung und Releases tragen zu sauberen, nachvollziehbaren Package-Updates bei. Sie vereinfachen Abhängigkeitsmanagement und Automatisierung. Conventional Commits ermöglichen es, Versionen und Changelogs automatisiert abzuleiten.