Einführung
git log durchläuft den Commit-Graphen von einem Startpunkt aus (Standard: HEAD) rückwärts durch die Eltern und gibt jeden Commit aus. Es ist das primäre Werkzeug zur Erkundung der Projekthistorie.
Grundlegende Verwendung
git log
git log --oneline
git log --oneline --graph --decorate --all
Die letzte Form ist die Schweizer-Taschenmesser-Ansicht: ein kompakter Graph jedes Branches mit dekorierten Refs.
Filtern nach Datum, Autor, Nachricht
git log --since="2 weeks ago"
git log --until=2025-01-01
git log --author="Ada"
git log --grep="bugfix"
git log -S "deprecated_function" # Pickaxe: wann erschien ein String?
-S ist unschätzbar für Code-Archäologie: Es findet Commits, die die Anzahl der Vorkommen eines Strings in irgendeiner Datei verändern.
Diffs anzeigen
git log -p # vollständiger Patch pro Commit
git log --stat # geänderte Dateien plus +/- Zählungen
git log --shortstat # nur Zusammenfassungszeile
git log -p -- path/to/file # nur Commits, die einen Pfad berühren
Eigene Formate
--pretty=format: akzeptiert Platzhalter. Ein nützlicher Einzeiler:
git log --pretty=format:"%h %an %ad %s" --date=short
%h abgekürzter Hash, %an Autorenname, %ad Autorendatum, %s Betreff. Die vollständige Liste finden Sie unter git help log.
Limits und Bereiche
git log -n 5 # letzte 5 Commits
git log main..feature # Commits auf feature, nicht auf main
git log main...feature # symmetrische Differenz
git log feature ^main # gleichbedeutend mit main..feature
Datei-Umbenennungen folgen
Git zeichnet Umbenennungen nicht auf, es erkennt sie. Um der Historie über eine Umbenennung hinweg zu folgen:
git log --follow -- path/to/file
Nützliche Aliase
Eine Handvoll git log-Aliase rentiert sich in der ersten Woche. Zwei besonders gute:
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.last "log -1 HEAD --stat"
git config --global alias.recent "log --since='2 weeks ago' --author=$(git config user.email)"
git lg liefert den Vogelperspektivgraphen; git last zeigt, was gerade passiert ist; git recent beantwortet "Woran habe ich in letzter Zeit gearbeitet?". Fügen Sie für jeden Log-Aufruf, den Sie mehr als zweimal eintippen, einen Alias hinzu.
Umkehren und begrenzen
Standardmäßig läuft git log von neu nach alt. Manchmal (Release Notes, Code-Archäologie) wollen Sie das Gegenteil, gepaart mit einem sauberen Format:
git log --reverse --oneline v1.0.0..v1.1.0
git log --reverse --pretty=format:"* %s (%h)" v1.0.0..HEAD > CHANGELOG.draft
Hier zahlen sich Pickaxe und Pfadfilter aus: git log --reverse -S "old_api" -- src/ zeigt die chronologische Historie des Erscheinens und Verschwindens eines Strings, ideal zum Verfolgen von Deprecations.
Häufige Fehler
Nur die Historie von HEAD lesen und Commits auf anderen Branches verpassen; übergeben Sie --all, um sie zu sehen. --author (eine Regex auf das Autorenfeld) mit einem literalen Exakt-Match verwechseln; setzen Sie das Muster sorgfältig in Anführungszeichen. git log file statt git log -- file verwenden: Der ---Trenner macht Pfade von Refs unterscheidbar, besonders wenn ein Branch und eine Datei einen Namen teilen. Schließlich: Erwarten, dass git log gelöschte Commits nach einem Force-Reset zeigt; verwenden Sie dafür git reflog. git log läuft nur erreichbare Historie ab.