{ } Programmazione

Git spiegato bene: commit, branch e merge senza paura

I concetti fondamentali di Git spiegati in modo chiaro: area di staging, commit, branch, merge e remote, con i comandi essenziali per il lavoro quotidiano.

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 fetch scarica i nuovi commit dal remote senza toccare il tuo lavoro;
  • git pull scarica e integra nel branch corrente;
  • git push invia 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:

  1. git restore file scarta le modifiche non salvate a un file (queste sì, si perdono).
  2. git revert <commit> crea un nuovo commit che annulla un commit precedente: sicuro anche su rami condivisi.
  3. git reflog mostra ogni posizione in cui HEAD è 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 add e git commit spostano 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.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica e in psicologia, unisce l'analisi tecnica alla comprensione del fattore umano.

Leggi anche