modulo 06 / lezione 36
Dialogare con l'AI senza perdere controllo
Git essenziale per il vibe coder: branch, commit, revert, blame
Usare Git come memoria affidabile e rete di sicurezza durante il lavoro con AI.
Git essenziale per il vibe coder: branch, commit, revert, blame
Git è il safety net del vibe coding. Quando l’AI sbaglia, e succede, il modo in cui torni a uno stato pulito determina se il danno è di 5 minuti o di 5 ore. Conoscere 8 comandi Git essenziali è il prerequisito per sperimentare con coraggio: se sai annullare, puoi provare di più.
Perché questa lezione conta
Senza Git, ogni esperimento AI è un rischio. Hai paura di cancellare ciò che funzionava. Lavori in modo conservativo, perdi il vantaggio di velocità della generazione. Con Git, ogni stato è recuperabile. Ti puoi permettere di accettare un suggerimento, vedere se va, rifiutarlo se no. La lezione non è un tutorial Git completo: è il sottoinsieme essenziale per usare AI senza paura.
Obiettivo operativo
Alla fine devi saper:
- usare branch per isolare esperimenti AI;
- fare commit piccoli e tornare indietro velocemente quando serve;
- usare blame e log per capire storia senza fare archeologia.
Nucleo della lezione
1. Branch per isolare esperimenti
Concetto: ogni esperimento AI vive in un branch separato. Main resta stabile. Se l’esperimento va bene, merge. Se no, scarta il branch.
Comandi base:
git checkout -b feat/nome-task— crea nuovo branch e ci passa sopra.git branch— lista branch.git checkout main— torna su main.git branch -D feat/abbandonato— elimina branch (locale) anche se non mergiato.git push -u origin feat/nome-task— spinge il branch su remoto la prima volta.
Convenzione naming: feat/, fix/, refactor/, chore/ come prefisso. Aiuta a distinguere il tipo di lavoro.
Pratica per agenti: prima di lanciare un agente CLI, sempre branch dedicato. Non lanciare agenti su main.
2. Commit come checkpoint
Concetto: ogni stato funzionante che vuoi poter ricuperare = commit. Commit piccoli, frequenti, con messaggio sensato.
Comandi base:
git status— cosa è cambiato.git diff— diff non staged.git diff --staged— diff staged.git add file.ts— stage di un file specifico (preferibile agit add .).git add -p— stage interattivo, scegli pezzi (utile per separare modifiche).git commit -m "..."— commit.git log --oneline -10— ultimi 10 commit in formato compatto.
Conventional Commits (raccomandato): <tipo>(<scope>): <descrizione>.
Esempi:
feat(auth): aggiungi login con magic-linkfix(form): valida email server-side per evitare bypass clientrefactor(utils): estrai formatPrice in modulo dedicatodocs(agents): aggiorna comandi build dopo migrazione a bun
Messaggio commit dovrebbe rispondere “perché”, non solo “cosa”. Il “cosa” è leggibile dal diff.
3. Revert e reset: tornare indietro
Tre modi diversi di “annullare”, ognuno per situazione diversa:
git restore <file>: scarta modifiche non committate su un file. Recupera versione dell’ultimo commit. Utile quando l’AI ha modificato file che non volevi.
git reset --hard HEAD: scarta tutte le modifiche non committate. Torna esattamente allo stato dell’ultimo commit. Utile dopo sessione AI andata male prima del commit.
git reset --hard HEAD~1: cancella ultimo commit e torna allo stato precedente. Distrugge l’ultimo commit. Solo se non è già pushato a remoto condiviso.
git revert <commit>: crea un nuovo commit che annulla un commit precedente. Non distrugge storia, sicuro per branch condivisi.
Regola: prima di reset, valuta cosa stai distruggendo. Se sei su branch personale e non condiviso, reset è ok. Se condiviso, revert.
Pre-condizione importante: se hai modifiche non committate che vuoi tenere ma il branch è in stato confuso, git stash salva le modifiche da parte. Recuperi con git stash pop.
4. Blame e log per capire storia
Quando un bug appare e non sai da dove viene:
git log --oneline file.ts: storia di un file. Quali commit lo hanno toccato.
git blame file.ts: chi ha scritto cosa, riga per riga. Output: hash commit + autore + data per ogni riga.
git show <commit>: cosa è cambiato in un commit specifico, con diff completo.
git log -S "stringa": trova commit che hanno aggiunto/rimosso una specifica stringa di codice. Utile per “quando è stata introdotta questa funzione?”.
git bisect: bisezione binaria su commit per trovare quale ha introdotto un bug. Avanzato ma potente.
Importante: git blame non è giudizio personale. È strumento di archeologia. “Chi ha scritto questa riga” = “in quale commit è stata aggiunta”, non “chi è da incolpare”.
Su progetti con AI: blame mostra il committente umano, non il modello che ha generato. Pratica: in commit message rilevanti, segnala se il codice è stato generato e accettato (es. Co-Authored-By: Claude).
Procedura pratica
Workflow quotidiano con Git + AI:
- Inizio sessione:
git status(deve essere pulito),git pullse collaborativo. - Branch nuovo:
git checkout -b feat/task-piccolo. - Lavoro AI: genera, leggi diff, accetta o rifiuta.
- Commit periodici: dopo ogni passo verificato,
git add ...+git commit -m "...". - Se va male:
git reset --hard HEAD(perdi solo modifiche non commit) ogit restore <file>per file specifici. - Push periodico:
git pushper backup remoto. - A fine task: PR (pull request) o merge in main + delete branch.
Laboratorio guidato
Simulazione completa:
Step 1: git checkout -b feat/lab-git. Stato: pulito.
Step 2: chiedi a un’AI di creare una funzione utility (es. formatPrice). Accetta diff. git add + git commit -m "feat(utils): aggiungi formatPrice".
Step 3: chiedi all’AI di aggiungere test. Accetta. git add + git commit -m "test(utils): aggiungi test per formatPrice".
Step 4: chiedi di “migliorare il modulo”. L’AI fa refactor laterale che rompe altre cose. Diff lungo, fuori scope.
Step 5: prima di committare, git restore . (annulla tutto). Tornato a fine step 3.
Step 6: chiedi di fare la stessa modifica con scope ristretto e cambia approccio.
Step 7: git log --oneline mostra storia pulita di 2 commit. Stato finale: come desideravi.
Pratica esattamente questo flusso una volta. Memorizza i comandi.
Output atteso
Una sequenza minima di comandi Git stampata o salvata in ~/.config/cheatsheet/git.md:
# Inizio task
git checkout -b feat/task
# Durante lavoro AI
git status
git diff
git restore <file> # scarta modifiche su file
git reset --hard HEAD # scarta tutto non committato
# Salva passo verificato
git add <file>
git commit -m "tipo(scope): descrizione"
# Fine task
git push -u origin feat/task
# Capire storia
git log --oneline -20
git blame <file>
git show <hash>
Studio passo passo
Studia questa lezione in tre passaggi, senza correre subito al prompt o al codice.
- Prima lettura: chiarisci l’obiettivo: usare Git come memoria affidabile e rete di sicurezza durante il lavoro con AI. Se non riesci a riscriverlo in una frase tua, rileggi il nucleo della lezione.
- Seconda lettura: trasforma i contenuti in domande operative:
- Branch per isolare esperimenti, commit per salvare punti buoni, diff per rivedere, revert per tornare indietro.
- Messaggi di commit come narrazione tecnica: cosa è cambiato e perché.
- Blame e log per capire storia del codice senza attribuire colpe personali.
- Applicazione: svolgi il laboratorio: creare un branch, fare due commit piccoli, introdurre un errore e recuperare con revert o nuova correzione. L’output da ottenere è: una sequenza minima di comandi Git per lavorare con AI senza paura di sperimentare.
Prima di passare alla lezione successiva, controlla di avere un artefatto concreto: una tabella, un prompt, una checklist, un mini report, un diff commentato o una decisione scritta. Nel vibe coding la comprensione resta astratta finché non produce una traccia verificabile.
Checklist di verifica
- ho un branch dedicato per ogni sessione AI significativa;
- faccio commit piccoli (uno per passo verificato);
- scrivo messaggi commit nel formato Conventional Commits;
- so distinguere
restore,reset --hard,revert; - uso
git blame/logper capire storia, non per giudicare; - pusho a remoto regolarmente per backup.
Errori comuni
Lavorare su main. Esperimento va male = main rotto. Sempre branch dedicato.
Commit gigante a fine giornata. “Salviamo tutto in un commit”. Storia inutilizzabile, revert impossibile.
Messaggio “update” o “wip”. Tre commit “update” = tre commit invisibili. Messaggio che dice il perché.
git add . cieco. Aggiunge file non voluti (file generati, log, secrets). Preferisci git add file.ts.
git push --force su branch condiviso. Distrugge lavoro altrui. Solo su branch personali, se necessario.
Niente backup remoto. Disco fail = lavoro perso. Push regolare anche su progetti personali.
Confondere revert con reset. Revert crea commit, è sicuro su branch condivisi. Reset distrugge storia, solo branch personali.
Prompt di lavoro
Per messaggio commit:
Diff dei cambiamenti:
[output di `git diff --staged`]
Genera commit message in formato Conventional Commits in italiano.
Vincoli:
- soggetto: max 70 caratteri, presente, "perché" sintetico
- formato: tipo(scope): descrizione
- tipi ammessi: feat, fix, refactor, docs, test, chore, style, perf
- corpo (opzionale): solo se "perché" non è ovvio dal soggetto, max 3 righe
Output: solo il messaggio, niente altro.
Esercizio finale
Per la prossima settimana di lavoro AI, mantieni rigore:
- ogni task = nuovo branch;
- ogni passo verificato = commit;
- nessun task senza pull request finale;
- usa
git restore/resetquando l’AI sbaglia, senza colpa.
A fine settimana guarda la cronologia: 20-40 commit piccoli, branch chiari, niente “fix mistakes”. Quel ritmo è ciò che permette di lavorare con AI con velocità senza accumulare disordine.