# Commit-Historie mit git log lesen

## Commit-Historie mit git log lesen

Ein Repository ist nur so wertvoll wie die Geschichte, die es erzählt. Mit jedem Commit wächst ein Protokoll, das dokumentiert, *wer* *wann* *welche* Änderung vorgenommen hat und *warum*. Der Befehl `git log` ist das zentrale Werkzeug, um dieses Protokoll zu lesen – und wer ihn beherrscht, kann sich in jedem Projekt schnell orientieren, unabhängig davon, wie alt oder komplex es ist.

### Die Grundform verstehen

Ohne weitere Optionen zeigt `git log` die Historie in umgekehrter chronologischer Reihenfolge an – der neueste Commit steht oben:

```bash
git log
```

Die Ausgabe sieht typischerweise so aus:

```
commit 8f3c1a9b2e4d5f6a7b8c9d0e1f2a3b4c5d6e7f8a
Author: Anna Beispiel <anna@beispiel.de>
Date:   Mon Mar 4 14:22:07 2024 +0100

    Formular-Validierung hinzugefügt

commit 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
Author: Anna Beispiel <anna@beispiel.de>
Date:   Mon Mar 4 13:05:41 2024 +0100

    Erste Projektstruktur angelegt
```

Jeder Eintrag besteht aus vier festen Bestandteilen:

- **Commit-Hash** – die eindeutige, vierzig Zeichen lange SHA-1-Kennung des Commits.
- **Author** – Name und E-Mail-Adresse der Person, die den Inhalt erstellt hat.
- **Date** – Zeitstempel inklusive Zeitzone.
- **Commit-Nachricht** – der erklärende Text, den du beim Commit vergeben hast.

Da lange Hashes unhandlich sind, genügt fast immer ein *eindeutiges Präfix* von sechs bis acht Zeichen, um einen Commit später zu referenzieren.

### Kompakte Ansichten mit --oneline

Bei größeren Historien wird die ausführliche Ansicht schnell unübersichtlich. Die Option `--oneline` reduziert jeden Commit auf eine einzige Zeile:

```bash
git log --oneline
```

```
8f3c1a9 Formular-Validierung hinzugefügt
1a2b3c4 Erste Projektstruktur angelegt
```

Diese verkürzte Form ist der Standard für einen schnellen Überblick und wird häufig mit weiteren Optionen kombiniert.

### Den Verlauf begrenzen

Nicht immer wird die gesamte Historie benötigt. Mit `-n` beschränkst du die Ausgabe auf eine bestimmte Anzahl von Commits:

```bash
git log -n 5
```

Alternativ lässt sich der Zeitraum eingrenzen:

```bash
git log --since="2 weeks ago"
git log --until="2024-03-01"
git log --since="2024-01-01" --until="2024-02-01"
```

### Nach Inhalt und Person filtern

`git log` erlaubt gezielte Suchen innerhalb der Historie, ohne dass du die Ausgabe manuell durchsuchen musst.

| Ziel | Befehl |
|---|---|
| Nach Autor filtern | `git log --author="Anna"` |
| Nach Nachrichtentext suchen | `git log --grep="Validierung"` |
| Commits einer Datei anzeigen | `git log -- pfad/zur/datei.php` |
| Nur Merge-Commits anzeigen | `git log --merges` |
| Merge-Commits ausblenden | `git log --no-merges` |

Diese Filter lassen sich beliebig kombinieren, etwa um alle Commits einer bestimmten Person innerhalb eines Zeitraums zu einer bestimmten Datei zu finden.

### Änderungen direkt mitanzeigen

Manchmal reicht die Nachricht allein nicht aus – du willst sehen, *was* sich tatsächlich geändert hat.

- `git log -p` zeigt zu jedem Commit den vollständigen Patch (Diff) an.
- `git log --stat` zeigt stattdessen eine kompakte Statistik mit geänderten Dateien und der Anzahl hinzugefügter beziehungsweise entfernter Zeilen.

```bash
git log --stat
```

```
8f3c1a9 Formular-Validierung hinzugefügt
 src/Validator.php | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
```

Diese Übersicht eignet sich gut, um schnell einzuschätzen, wie umfangreich ein Commit war, ohne den gesamten Patch lesen zu müssen.

### Eigene Formate mit --pretty und --format

Für individuelle Ansichten bietet Git das Format `--pretty=format:"…"`, mit dem du festlegst, welche Informationen in welcher Reihenfolge erscheinen.

```bash
git log --pretty=format:"%h – %an, %ar : %s"
```

```
8f3c1a9 – Anna Beispiel, 2 hours ago : Formular-Validierung hinzugefügt
1a2b3c4 – Anna Beispiel, 3 hours ago : Erste Projektstruktur angelegt
```

Die wichtigsten Platzhalter:

| Platzhalter | Bedeutung |
|---|---|
| `%h` | Kurzer Commit-Hash |
| `%H` | Vollständiger Commit-Hash |
| `%an` | Autorenname |
| `%ae` | Autoren-E-Mail |
| `%ad` / `%ar` | Datum absolut / relativ |
| `%s` | Betreffzeile der Commit-Nachricht |

Da solche Formate schnell lang werden, lohnt es sich, sie später als Git-Alias zu speichern – ein Thema, das in einem eigenen Kapitel zu fortgeschrittenen Werkzeugen vertieft wird.

### Verzweigungen sichtbar machen

Sobald ein Projekt mehrere Branches enthält, hilft eine grafische Darstellung, Zusammenhänge zu erkennen:

```bash
git log --oneline --graph --all
```

```
* 8f3c1a9 (HEAD -> main) Formular-Validierung hinzugefügt
* 1a2b3c4 Erste Projektstruktur angelegt
```

Die Option `--graph` zeichnet die Commit-Struktur mit Zeichen wie `*`, `|` und `\`, während `--all` sämtliche Branches statt nur den aktuellen einbezieht. In einem reinen lokalen Repository mit nur einem Branch wirkt diese Ansicht noch schlicht – ihr Nutzen zeigt sich erst, sobald mehrere Branches parallel existieren, wie in einem späteren Kapitel ausführlich behandelt wird.

### Relative Referenzen im Log verwenden

Anstelle vollständiger Hashes kannst du Commits relativ zum aktuellen Stand ansprechen:

```bash
git log HEAD~1
git log HEAD~2..HEAD
```

`HEAD~1` bezeichnet den Elternteil des aktuellen Commits, `HEAD~2` den Großelternteil und so weiter. Der Bereichsoperator `..` zeigt alle Commits zwischen zwei Punkten an – eine Notation, die in späteren Kapiteln zu Branches und Vergleichen regelmäßig wiederkehrt.

### Ausblick: Historie in PhpStorm

Alles, was hier über die Kommandozeile erarbeitet wurde, lässt sich auch grafisch im **Git-Werkzeugfenster** von PhpStorm nachvollziehen – inklusive Filterung, Diff-Ansicht und Graphdarstellung per Mausklick. Da dieser Kurs bewusst Kommandozeile und IDE parallel vermittelt, wird der identische Workflow am Ende dieses Kapitels vollständig in PhpStorm wiederholt.

### Checkliste für den Alltag

- 📜 `git log --oneline` für einen schnellen Überblick.
- 🔍 `git log --grep` oder `--author`, um gezielt zu suchen.
- 📊 `git log --stat`, um den Umfang von Änderungen einzuschätzen.
- 🌳 `git log --graph --all`, sobald mehrere Branches im Spiel sind.
- ✂️ `HEAD~n`, um relativ zum aktuellen Stand zu navigieren.

Wer diese Grundtechniken verinnerlicht, verfügt über das Handwerkszeug, um sich in jedem – auch fremden – Git-Repository zügig zurechtzufinden, bevor im nächsten Abschnitt mit `git diff` der inhaltliche Vergleich von Änderungen im Detail folgt.