Git è lo strumento di controllo di versione più diffuso, ed è anche uno dei più temuti dai principianti. Il motivo è che molti lo imparano come una sequenza di comandi da ripetere a memoria, senza capire cosa succede sotto. Quando qualcosa va storto, il panico è inevitabile. Eppure il modello mentale di Git è sorprendentemente semplice: una volta compreso, anche i comandi più strani acquistano senso.
Perché serve un controllo di versione
Senza controllo di versione si finisce con cartelle chiamate progetto-finale, progetto-finale-2, progetto-finale-davvero. Git risolve tre problemi concreti:
- Storia: ogni modifica salvata è recuperabile, con autore, data e motivazione.
- Sperimentazione: puoi provare un'idea su un ramo separato senza toccare il codice funzionante.
- Collaborazione: più persone lavorano sugli stessi file e Git aiuta a combinare il lavoro.
Le tre aree di Git
Il punto chiave è che i file, in Git, passano attraverso tre zone:
| Area | Cosa contiene | Comando tipico |
|---|---|---|
| Cartella di lavoro | I file come li vedi e modifichi | (modifichi con l'editor) |
| Area di staging | Le modifiche scelte per il prossimo commit | git add |
| Repository | La storia dei commit salvati | git commit |
L'area di staging (detta anche index) confonde molti all'inizio, ma è utilissima: ti permette di decidere esattamente cosa entra in un commit. Se hai corretto un bug e nel frattempo hai modificato anche la documentazione, puoi fare due commit separati, ognuno con il suo significato.
Cos'è davvero un commit
Un commit è una fotografia completa del progetto in un certo momento, accompagnata da un messaggio, un autore e un riferimento al commit precedente (il "genitore"). Ogni commit è identificato da un hash, una lunga stringa esadecimale calcolata dal contenuto. Questo significa che un commit non può essere alterato senza cambiare identità: la storia è a prova di modifiche silenziose.
Il flusso di base è sempre lo stesso:
git status # cosa è cambiato?
git add file1.py file2.py # scelgo cosa salvare
git commit -m "Correggi il calcolo dell'IVA sugli sconti"
git log --oneline # vedo la storia
Abituati a usare git status di continuo: è il comando che ti dice sempre dove ti trovi.
Branch: rami leggeri
Un branch in Git non è una copia del progetto: è semplicemente un'etichetta mobile che punta a un commit. Quando fai un nuovo commit su un branch, l'etichetta avanza. Per questo creare un branch è istantaneo e non costa nulla.
git switch -c nuova-funzione # crea il branch e ci si sposta
# ... modifiche e commit ...
git switch main # torna al ramo principale
Esiste anche un'etichetta speciale, HEAD, che indica dove ti trovi in questo momento. Quando senti parlare di "detached HEAD", significa che stai guardando un commit direttamente, senza essere su un branch: i commit fatti in quello stato rischiano di perdersi se non crei un branch.
Merge: unire il lavoro
Quando la funzione è pronta, la si integra nel ramo principale:
git switch main
git merge nuova-funzione
Possono accadere due cose. Se main non è cambiato nel frattempo, Git sposta semplicemente l'etichetta in avanti (fast-forward). Se invece entrambi i rami hanno nuovi commit, Git crea un commit di merge con due genitori.
Un conflitto si verifica quando le due linee di sviluppo hanno modificato le stesse righe in modo diverso. Git non sceglie al posto tuo: marca il file con i delimitatori <<<<<<<, ======= e >>>>>>>. Tu decidi la versione corretta, rimuovi i delimitatori, poi esegui git add e git commit. Un conflitto non è un errore, è una domanda.
Remote: lavorare con gli altri
Un remote è un'altra copia del repository, di solito su un server. I comandi essenziali sono tre:
git fetchscarica i nuovi commit dal remote senza toccare il tuo lavoro;git pullscarica e integra nel branch corrente;git pushinvia i tuoi commit al remote.
Un'abitudine sana è fare git fetch e guardare cosa è cambiato prima di integrare, invece di eseguire git pull alla cieca.
Come annullare senza danni
Gran parte della paura di Git nasce dal timore di perdere lavoro. Alcuni strumenti di sicurezza:
git restore filescarta le modifiche non salvate a un file (queste sì, si perdono).git revert <commit>crea un nuovo commit che annulla un commit precedente: sicuro anche su rami condivisi.git reflogmostra ogni posizione in cuiHEADè stato di recente: è la rete di salvataggio per recuperare commit che sembrano spariti.
La regola generale: ciò che è stato committato è quasi sempre recuperabile; ciò che non è mai stato committato no. Committa spesso.
In sintesi
- Git ha tre aree: cartella di lavoro, staging e repository;
git addegit commitspostano le modifiche tra loro. - Un commit è una fotografia completa e immutabile del progetto, identificata da un hash.
- Un branch è solo un'etichetta che punta a un commit: crearne uno è gratis.
- I conflitti di merge sono domande a cui rispondi tu, non errori.
- Committa spesso e ricorda
git reflog: il lavoro salvato è quasi sempre recuperabile.