domenica 28 settembre 2025

Git: Consultazione della Cronologia dei Commit

Dopo aver effettuato diversi commit, oppure quando si clona un repository con una cronologia già esistente, è fondamentale poter analizzare lo storico delle modifiche.

Lo strumento principale messo a disposizione da Git per questo scopo è il comando git log, che consente di ispezionare in dettaglio l’evoluzione di un progetto.

Il comando più semplice è:

git log

L’output predefinito elenca i commit in ordine cronologico inverso, mostrando per ciascun commit:

  • l’hash SHA-1 univoco
  • l’autore con email
  • la data
  • il messaggio di commit

git log
FIG 1 - git log

Opzioni utili di git log

Git mette a disposizione un’ampia gamma di opzioni per adattare l’output alle proprie esigenze.

1. Mostrare le modifiche introdotte da ciascun commit
git log -p -2
  • L’opzione -p (o --patch) visualizza le differenze introdotte.
  • Il parametro -2 limita l’output agli ultimi due commit.
  • Utile in fase di code review o per analizzare l’evoluzione del codice.
git log -p -2
FIG 2 - git log -p -2

2. Visualizzare statistiche sintetiche

git log --stat

Mostra i file modificati, il numero di righe aggiunte/rimosse e un riepilogo finale.
git log --stat
FIG 3 - git log --stat
git log --shortstat
Questo comando fornisce un riassunto molto conciso per ogni commit. Mostra un'unica riga con il conteggio totale dei file modificati e il numero totale di righe aggiunte e cancellate. Non elenca i nomi specifici dei file.

3. Formattazione personalizzata

Consente di definire un formato personalizzato dell’output, utile per generare report o output leggibili da script.
git log --pretty=format:"%h - %an, %ar : %s"

Segnaposto principali

SegnapostoDescrizione
%HHash completo del commit
%hHash abbreviato
%THash dell'albero
%tHash dell'albero abbreviato
%PHash dei genitori
%pHash dei genitori abbreviati
%anNome autore
%aeEmail autore
%adData autore (formato configurabile con --date=)
%arData autore relativa (es. “2 weeks ago”)
%cnNome committer
%ceEmail committer
%cdData del committer
%crData del committer, relativa
%sMessaggio del commit
git log --pretty=format
FIG 4 - git log --pretty=format

4. Output compatti
  • git log --oneline
    commit in una sola riga (hash abbreviato + messaggio).
  • git log --pretty=short|full|fuller
    diversi livelli di dettaglio.
  • git log --abbrev-commit
    mostra solo le prime cifre dell’hash.
git log --oneline
FIG 5 - git log --oneline

5. Rappresentazione grafica

Visualizza un grafico ASCII che illustra la struttura di branch e merge, molto utile in repository complessi.
git log --graph
git log --graph
FIG 6 - git log --graph

Opzioni per limitare l'output di git log

Oltre alle opzioni di formattazione, il comando git log supporta numerose opzioni di limitazione, che consentono di filtrare i commit mostrati.
Queste opzioni sono utili per concentrarsi su un intervallo temporale, un autore, un file specifico o persino su modifiche particolari al codice.

1. Limitazione numerica

Per visualizzare solo gli ultimi n commit:

git log -2
Mostra solo gli ultimi due commit.
git log -2
FIG 7 - git log -2



2. Limitazione temporale

È possibile filtrare i commit in base a date assolute o relative:

git log --since=2.weeks
git log --since="2025-01-01" --until="2025-01-31"


--since / --after  
commit successivi a una certa data.

--until / --before 
commit precedenti a una certa data.

Esempi validi di date:
"2008-01-15" (formato ISO)
"2 years 1 day 3 minutes ago" (relativo)



3. Filtrare per autore o committer

git log --author="Alice"
git log --committer="Bob"

--author  
mostra commit scritti da un certo autore.

--committer
mostra commit applicati da uno specifico committer.

É possibile utilizzare più di una regola --author o --grep contemporaneamente.
Con l’opzione --all-match, Git mostrerà solo i commit che soddisfano tutti i criteri.



4. Ricerca nei messaggi di commit

git log --grep="bugfix"

Mostra i commit che hanno "bugfix" nel messaggio di commit.
Può essere combinato con --author e --since per ricerche più precise.



5. Pickaxe: cercare modifiche nel codice

git log -S function_name

L’opzione -S (detta pickaxe) trova i commit in cui cambia il numero di occorrenze di una stringa (es. aggiunta o rimozione di una funzione).
Ottimo per capire quando e perché è stata introdotta o rimossa una porzione di codice.



6. Limitazione per file o directory

git log -- path/to/file

Mostra solo i commit che hanno modificato un file o una directory specifica.
Per separare chiaramente le opzioni dal percorso si usa --:

git log --since="2025-01-01" -- path/to/file



7. Evitare i merge commit

In repository con workflow basati su merge, la cronologia può risultare affollata.
Per nascondere i merge commit non informativi:

git log --no-merges


Tabelle riepilogative delle opzioni comuni

OpzioneDescrizione
-p o --patchMostra le differenze introdotte da ciascun commit
--statRiepilogo file modificati e righe aggiunte/rimosse
--shortstatSolo il riepilogo numerico (senza elenco file)
--name-onlyElenco dei file modificati
--name-statusElenco file + stato (A=Added, M=Modified, D=Deleted)
--abbrev-commitHash abbreviati
--relative-dateDate in formato relativo (“2 days ago”)
--graphGrafico ASCII della cronologia
--prettyFormati alternativi (oneline, short, full, fuller, format)
--onelineAlias di --pretty=oneline --abbrev-commit. Mostra ogni commit su una singola riga 


Opzioni di filtro

OpzioneDescrizione
-n <numero>Limita il numero di commit visualizzati all'ultimo <numero> specificato
--author="<pattern>"Filtra i commit in base all'autore. Accetta anche espressioni regolari.
--committer="<pattern>"Filtra i commit in base al committer.
--grep="<pattern>"Filtra i commit in base a un pattern nel messaggio del commit.
--since="<data>"Visualizza i commit a partire da una data specificata("2 weeks ago", "2023-01-01", "yesterday").
--until="<data>"Visualizza i commit fino a una data specificata.
--after="<data>"Alias di --since
--before="<data>"Alias di --until
<file-o-cartella>Mostra solo i commit che hanno modificato un file o una cartella specifica
--mergesMostra solo i commit di merge.
--no-mergesEsclude i commit di merge dalla visualizzazione.


Opzioni di navigazione

OpzioneDescrizione
--reverseLimita il numero di commit visualizzati all'ultimo <numero> specificato
<start>..<end>Filtra i commit in base all'autore. Accetta anche espressioni regolari.
-S"<stringa>"
o --all-match-S"<stringa>"
Mostra i commit che hanno introdotto o rimosso una riga contenente una stringa specifica. Utile per il debugging.
-G"<regex>"Simile a -S, ma usa un'espressione regolare per cercare le modifiche nel contenuto dei file



Differenza tra autore e committer

  • Autore (Author): chi ha scritto originariamente la modifica.
  • Committer: chi ha applicato la modifica al repository (può coincidere con l’autore o essere un maintainer che ha accettato una patch).

Questo permette di riconoscere sia chi ha prodotto il codice sia chi ne ha garantito l’integrazione


Esempio avanzato

Visualizzare i commit:

  • scritti da Giovanni Lubrano Lavadera,
  • nel mese di novembre 2024,
  • che non siano merge commit,
  • relativi alla directory test/
git log --pretty="%h - %s" \ --author="Giovanni Lubrano Lavadera" \ --since="2024-11-01" \ --before="2024-12-01" \ --no-merges -- test/




Nessun commento:

Posta un commento

I messaggi sono soggetti a moderazione da parte dell'amministratore prima della loro pubblicazione.