Introduzione
git log percorre il grafo dei commit da un punto di partenza (predefinito: HEAD) all'indietro attraverso i parent, stampando ogni commit. È lo strumento principale per esplorare la storia del progetto.
Uso di base
git log
git log --oneline
git log --oneline --graph --decorate --all
L'ultima forma è la vista coltellino svizzero: un grafico compatto di ogni branch con i ref decorati.
Filtrare per data, autore, messaggio
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: quando è apparsa una stringa?
-S è prezioso per l'archeologia: trova i commit che cambiano il numero di occorrenze di una stringa in qualsiasi file.
Mostrare i diff
git log -p # patch completa per commit
git log --stat # file modificati più conteggi +/-
git log --shortstat # solo riga di riepilogo
git log -p -- path/to/file # solo commit che toccano un path
Formati personalizzati
--pretty=format: accetta segnaposto. Una utile riga singola:
git log --pretty=format:"%h %an %ad %s" --date=short
%h hash abbreviato, %an nome autore, %ad data autore, %s oggetto. Vedi git help log per la lista completa.
Limiti e range
git log -n 5 # ultimi 5 commit
git log main..feature # commit su feature non su main
git log main...feature # differenza simmetrica
git log feature ^main # uguale a main..feature
Seguire i rename dei file
Git non registra i rename, li rileva. Per seguire la storia attraverso un rename:
git log --follow -- path/to/file
Alias utili
Una manciata di alias per git log si ripaga nella prima settimana. Due particolarmente buoni:
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 dà la vista dall'alto del grafo; git last mostra cosa è appena successo; git recent risponde a "su cosa ho lavorato ultimamente?". Aggiungi un alias per ogni invocazione di log che digiti più di due volte.
Inverso e limite
Per impostazione predefinita git log percorre dal più nuovo al più vecchio. A volte (note di rilascio, archeologia del codice) vuoi l'opposto, abbinato a un formato pulito:
git log --reverse --oneline v1.0.0..v1.1.0
git log --reverse --pretty=format:"* %s (%h)" v1.0.0..HEAD > CHANGELOG.draft
Qui pickaxe e i filtri di path danno il loro meglio: git log --reverse -S "old_api" -- src/ mostra la storia cronologica dell'apparizione e scomparsa di una stringa, perfetto per tracciare le deprecazioni.
Errori comuni
Leggere solo la storia di HEAD e perdere i commit su altri branch; passa --all per vederli. Confondere --author (una regex sul campo autore) con una corrispondenza esatta letterale; quota il pattern con cura. Usare git log file invece di git log -- file: il separatore -- disambigua i path dai ref, specialmente se un branch e un file condividono un nome. Infine, aspettarsi che git log mostri i commit cancellati dopo un force-reset; usa git reflog per quello. git log percorre solo la storia raggiungibile.