Zum Inhalt springen

Commits und Pull Requests

Eine saubere Git-Historie ist die Dokumentation der Dokumentation: Sie beantwortet in einem Jahr noch, warum etwas so ist, wie es ist. Dieser Briefdoc hält fest, wie Änderungen an Briefdocs committet und gemergt werden – vom ersten git add bis zum Aufräumen danach. Die Konvention stammt aus den SubmittingPatches-Richtlinien des Git-Projekts, die wiederum auf die Linux-Kernel-Richtlinien zurückgehen.

Pro logischer Änderung ein Commit. Die Betreffzeile lautet bereich: was sich ändert – im Imperativ, klein, ohne Punkt, unter 50 Zeichen. Der Rumpf erklärt das Warum. Auf master kommt alles über einen Branch und einen Pull Request, gemergt ohne Squash. Den Branch erst löschen, nachdem der PR gemergt ist.

bereich: was sich ändert
Rumpf: Welches Problem gab es ohne diese Änderung,
und warum ist die Lösung so gewählt?

Vorne steht, welcher Teil des Projekts betroffen ist:1

PräfixBereich
3d-druck:, ueber-briefdocs:Inhalte, benannt nach dem Themengebiet
viewer:Die 3D-Viewer-Komponente
models:3D-Modelle und ihre Pipeline
site:Starlight-Konfiguration, Layout, Styling
build:Abhängigkeiten, Skripte, Formatierung
ci:GitHub Actions
repo:README, Lizenz, Vorlagen

Kommt ein neues Themengebiet dazu, kommt ein neues Präfix dazu – benannt nach dem Ordner unter src/content/docs/.

  • Imperativ: so formuliert, als würdest du dem Code einen Befehl geben.2 fix landing page cards link, nicht fixed … oder fixes ….
  • Klein und ohne Punkt: Das erste Wort nach dem Präfix wird kleingeschrieben, am Ende steht kein Punkt.
  • Kurz: 50 Zeichen sind die weiche Grenze. Wird es länger, gehört der Rest in den Rumpf.
  • Englisch: Wie die bisherige Historie. Inhalte der Seite bleiben natürlich deutsch.

Der Rumpf ist optional, bei allem Nicht-Trivialen aber Pflicht. Er beantwortet, was ohne die Änderung falsch war und warum die Lösung besser ist – verworfene Alternativen dürfen auch rein.3 Das Wie muss nicht drinstehen, das zeigt der Diff.

3d-druck: fix landing page cards link
Starlight's Card has no href prop and silently drops it, so the
three cards on /3d-druck/ were never clickable. LinkCard is the
component meant for this.

Ein Commit ist eine logische Änderung, die für sich allein verständlich und begründbar ist.4 Formatierung, Fehlerbehebung und neue Funktion sind drei Commits, auch wenn sie in derselben Datei stecken.

Liegen mehrere Änderungen in einer Datei, lassen sie sich stückweise stagen:

Terminal-Fenster
git add -p datei.md # jeden Abschnitt einzeln: y = aufnehmen, n = auslassen, s = weiter aufteilen
git diff --cached # prüfen, was wirklich im Commit landet
git commit

git commit ohne -m öffnet den Editor – so schreibst du Betreff und Rumpf bequem getrennt.

Solange der Branch noch nicht gemergt ist, darfst du seine Historie umbauen:

SituationBefehl
Letzte Nachricht falschgit commit --amend
Etwas im letzten Commit vergessengit add … und git commit --amend
Ältere Nachricht falschgit rebase -i master, Zeile auf reword
Bereits gepushten Branch überschreibengit push --force-with-lease

--force-with-lease statt --force: Es bricht ab, wenn auf dem Remote inzwischen etwas liegt, das du lokal nicht kennst.

  1. Branch anlegen – ein Name, der das Vorhaben beschreibt:
    Terminal-Fenster
    git checkout master && git pull
    git checkout -b gewinde-ergaenzen
  2. Committen wie oben beschrieben.
  3. Lokal prüfen, dasselbe, was die CI prüft:
    Terminal-Fenster
    bun run format:check && bun run build
  4. Pushen:
    Terminal-Fenster
    git push -u origin gewinde-ergaenzen
  5. Pull Request öffnen. GitHub zeigt nach dem Push einen Link dazu an. Die Beschreibung füllt sich aus der PR-Vorlage; die Checkliste abhaken.
  6. CI abwarten. Der Check muss grün sein.
  7. Mergen mit „Create a merge commit” oder „Rebase and merge”.

Erst wenn der PR auf GitHub als „Merged” (lila) markiert ist:

Terminal-Fenster
git checkout master && git pull
git branch -d gewinde-ergaenzen
git push origin --delete gewinde-ergaenzen

Ist es doch passiert, sind die Commits nicht weg. Git merkt sich jede frühere Position im Reflog:

Terminal-Fenster
git reflog # den letzten Commit des Branches suchen
git branch gewinde-ergaenzen <hash> # Branch dort wiederherstellen
git push -u origin gewinde-ergaenzen # und einen neuen PR öffnen

Die Konvention kostet pro Commit wenige Sekunden: einen Bereich wählen, im Imperativ formulieren, das Warum aufschreiben. Dafür lässt sich mit git log --oneline jederzeit überblicken, was sich wo geändert hat, und git log -- src/components/ erzählt die Geschichte eines Bereichs. Die Kurzfassung der Präfixe steht zusätzlich in der README, damit sie auch beim Arbeiten im Repo griffbereit ist. Wer tiefer einsteigen will, findet in How to Write a Git Commit Message eine gut begründete Zusammenfassung der Regeln.

  1. Das Git-Projekt beschreibt das Präfix als „a filename or identifier for the general area of the code being modified”, siehe SubmittingPatches. Der Linux-Kernel nennt es das subsystem. ↩

  2. „as if you are giving orders to the codebase to change its behavior”, SubmittingPatches. ↩

  3. Die drei Punkte Problem, Begründung und verworfene Alternativen stammen direkt aus SubmittingPatches. ↩

  4. „Each patch should be justifiable on its own merits”, Linux-Kernel: Submitting patches. ↩

  5. GitHub Docs: About pull request merges. ↩