modulo 07 / lezione 32
Casi reali, debugging della storia, recupero
git blame e archeologia del codice
Capire chi e quando ha scritto una riga, e perché, senza trasformarlo in caccia alle streghe.
git blame e archeologia del codice
git blame mostra, per ogni riga di un file, l’ultimo commit che l’ha modificata. È uno strumento di contesto: serve a capire quando una decisione è entrata nel codice, quali file erano coinvolti e quale discussione cercare in PR o issue.
Il nome è infelice. Usarlo bene significa cercare storia, non colpe.
Perché questa lezione conta
Quando trovi una riga sospetta, il diff attuale non basta. Devi sapere se quella riga nasce da un bugfix urgente, da una migrazione, da una compatibilità con un cliente o da un refactor incompleto.
blame è il primo passo di archeologia del codice: parte da una riga e ti porta a commit, PR, issue e decisioni.
Obiettivo operativo
Alla fine della lezione devi saper usare git blame su file e intervalli, ignorare commit di formattazione, seguire l’evoluzione di una funzione con git log -L e trasformare l’indagine in una spiegazione tecnica utile.
Comandi base
git blame src/auth.ts
git blame -L 42,60 src/auth.ts
git blame -w src/auth.ts
-L limita l’output a un intervallo di righe. -w ignora cambiamenti di whitespace, utile dopo formattazioni automatiche.
Per vedere il commit:
git show <sha>
git show --stat <sha>
Guarda messaggio, diff, file toccati e data. Poi cerca la PR associata se il progetto usa merge commit o riferimenti a issue.
Ignorare commit di formattazione
Se un commit ha solo formattato il repository, blame può diventare poco utile. Crea un file:
.git-blame-ignore-revs
Dentro inserisci gli SHA dei commit da ignorare:
abc1234567890abcdef
def4567890abcdef123
Poi usa:
git blame --ignore-revs-file .git-blame-ignore-revs src/auth.ts
Puoi configurarlo nel repo:
git config blame.ignoreRevsFile .git-blame-ignore-revs
Questo file va versionato, così tutto il team legge la stessa storia.
Seguire una funzione nel tempo
Per vedere come una funzione è cambiata:
git log -L :verifyEmail:src/auth.ts
Oppure per intervallo:
git log -L 42,80:src/auth.ts
git log -L mostra l’evoluzione del blocco nel tempo. È più informativo di un singolo blame quando vuoi capire perché una condizione è stata aggiunta, rimossa e poi reintrodotta.
Metodo di indagine
Usa una sequenza precisa:
- individua riga o funzione sospetta;
- esegui
git blame -L; - apri il commit con
git show; - guarda file collegati nello stesso commit;
- cerca PR o issue;
- confronta con
git log -L; - scrivi una nota di contesto prima di modificare.
La nota può essere breve:
La validazione è stata introdotta in abc123 per gestire provider legacy.
La PR collegata cita utenti senza email verificata.
Il fix attuale deve preservare quel caso.
Cultura di team
Non usare blame per chiedere “perché hai scritto questa cosa?” a freddo. Chiedi: “Ho visto che questa riga nasceva nel commit X per il caso Y; quel vincolo esiste ancora?”.
La differenza cambia il tono e migliora la qualità della risposta.
Laboratorio guidato
Scegli un file reale complesso:
- identifica tre righe critiche;
- usa
git blame -Lper ciascuna; - apri i commit collegati;
- segui una funzione con
git log -L; - crea o aggiorna
.git-blame-ignore-revsse trovi formattazioni rumorose; - scrivi una spiegazione di 10 righe per un nuovo collega.
Output atteso
Una scheda di archeologia:
File:
Righe:
Commit rilevanti:
Decisione originale:
Vincoli ancora validi:
Rischi se cambiamo:
Prossima modifica consigliata:
Errori comuni
Fermarsi al nome dell’autore. L’autore non basta: servono commit, contesto e vincoli.
Ignorare commit di formatting. Possono nascondere la storia utile.
Non leggere il diff completo. Una riga spesso ha senso solo insieme ad altri file.
Cambiare senza capire il perché. Rischi di reintrodurre bug già risolti.
Checklist di verifica
- so usare
git blame -L; - so ignorare commit rumorosi con
.git-blame-ignore-revs; - so usare
git log -L; - so trasformare blame in contesto tecnico;
- so fare domande di review senza personalizzare il problema.
Esercizi
Base · facile
Scopri chi ha modificato per ultimo le righe di un file e in quale commit.
Soluzione
git blame file.js
# a1b2c3d (Anna 2025-03-01 12:00 12) const x = calcola();
git blame annota ogni riga del file con l’ultimo commit che l’ha toccata, l’autore e la data. Serve a capire quando e perché una riga è arrivata, non a dare colpe.
Intermedio · medio
Limita il blame a un intervallo di righe e segui una riga anche quando il codice è stato spostato. Spiega l’uso reale.
Soluzione
git blame -L 40,60 file.js # solo le righe 40-60
git blame -M file.js # segue le righe spostate dentro il file
git blame -C file.js # segue anche le righe copiate da altri file
-L restringe l’indagine alla zona che ti interessa. -M/-C evitano che un semplice spostamento/copia attribuisca la riga a chi l’ha solo riorganizzata: così risali al commit che ha davvero scritto quella logica. Uso tipico: capire la motivazione dietro una riga sospetta prima di modificarla.
Sfida · difficile
Dal blame, risali al commit di una riga e leggine il contesto completo (messaggio e diff). Spiega come combinare blame e log per l’archeologia del codice.
Soluzione
git blame file.js # trova l'hash della riga sospetta
git show a1b2c3d # messaggio + diff completo di quel commit
git log -L 50,50:file.js # l'intera storia di evoluzione di una singola riga
Il blame dà il “chi/quando” della riga attuale; git show <hash> aggiunge il perché (messaggio e modifiche dell’intero commit); git log -L ricostruisce tutta la storia di quella riga nel tempo. Insieme trasformano una riga misteriosa in una vicenda comprensibile: utile prima di cambiare codice che non hai scritto, per non rompere un’intenzione nascosta.
Collegamenti
- Modulo: Casi reali, debugging della storia, recupero - lezione 32 del corso.
- Si collega a debugging, refactor sicuro e code review.