Commit
Ein Commit ist die kleinste Einheit der Historie, die jemand in einem Jahr, unter Druck, während eines Vorfalls lesen wird. Optimiere für diesen Leser.
Workflow
- Vor dem Commit prüfen:
git status,git diff --staged,git diff. Niemals blind committen. - Prüfen, ob etwas nicht eingecheckt werden darf: Zugangsdaten,
.env-Dateien, private Schlüssel, große Binärdateien, Debug-Ausgaben, auskommentierter Code. Falls gefunden, stoppen und den Benutzer informieren. Siehe den Skillsecrets-hygiene. - Gezielt stagen. Bevorzuge
git add <pfade>gegenübergit add -A. Eine logische Änderung pro Commit; wenn der Diff eine Refaktorisierung und ein Feature vermischt, teile ihn auf. - Schreibe die Nachricht im folgenden Format.
- Committe mit einem Heredoc, damit mehrzeilige Bodies die Shell überleben:
git commit -m "$(cat <<'MSG'
feat(auth): OIDC-Login für die Admin-Konsole hinzugefügt
Ersetzt das gemeinsame Basic-Auth-Passwort durch ein Cognito-gestütztes OIDC,
sodass der Zugriff pro Benutzer entzogen werden kann. Sitzungen laufen nach 8h ab.
Refs: PLAT-412
MSG
)"
- Bestätigen mit
git log -1 --stat. Niemals amen oder force-pushen, es sei denn, der Benutzer bittet explizit darum.
Nachrichtenformat
<typ>(<scope>): <imperative Zusammenfassung, ≤72 Zeichen, kein Punkt am Ende>
<warum diese Änderung existiert, nicht was der Diff zeigt – der Diff zeigt das bereits>
<Fußzeile: Refs/Closes Ticket, BREAKING CHANGE: ..., Co-Authored-By>
Typen: feat, fix, refactor, perf, test, docs, build, ci, chore, revert.
Scope ist das Modul, der Service oder der Stack, der betroffen ist (api, terraform/vpc, ci). Weglassen, wenn die Änderung global ist.
Der Body ist wichtiger als die Zusammenfassung. Beantworte „warum jetzt?“ und „was haben wir in Betracht gezogen?“ in zwei bis vier Sätzen. Ein einzeiliger Commit ist in Ordnung für triviale Änderungen.
Beispiele
Eingabe: Nullzeiger behoben, wenn der S3-Bucket keine Tags hat
Ausgabe: fix(s3-inventory): buckets ohne Tag-Set behandeln
Eingabe: Terraform-AWS-Provider von 5.40 auf 5.60 aktualisiert, erforderlich für das neue Lambda-Runtime-Attribut Ausgabe:
build(terraform): AWS-Provider auf 5.60 aktualisiert
Erforderlich für `aws_lambda_function.runtime = "python3.13"`. Keine Ressourcen-
Diffs bei `terraform plan` über alle Stacks hinweg.
Wenn $ARGUMENTS angegeben ist
Behandle es als Scope- oder Zusammenfassungshinweis des Benutzers, überprüfe aber dennoch den Diff und korrigiere ihn, wenn er nicht mit dem übereinstimmt, was sich tatsächlich geändert hat.