Git — Guida ai fondamentali
Una guida pratica ai comandi e concetti essenziali di Git, dal setup quotidiano alla gestione degli errori.
Il modello a tre aree
Git organizza le modifiche in tre zone distinte:
Working directory → Staging area → Repository → Remote
(git add) (git commit) (git push)
- Working directory — i file su cui stai lavorando ora
- Staging area (index) — area di preparazione: scegli cosa includere nel prossimo commit
- Repository (
.git) — database locale con tutta la storia del progetto - Remote — copia del repo su un server (es. GitHub)
Quattro termini fondamentali da tenere a mente:
- Commit — snapshot immutabile dello stato del progetto, identificato da un hash SHA-1
- Branch — puntatore mobile a un commit; permette di lavorare su funzionalità separate in parallelo
- HEAD — puntatore al branch o commit attualmente attivo
- Merge — integrazione delle modifiche di un branch in un altro
Setup iniziale
Configurazione dell'identità globale (una volta sola):
git config --global user.name "Il Tuo Nome"
git config --global user.email "email@example.com"
git config --global core.editor nano
git config --list # verifica
Inizializzare o clonare un repository:
git init mio-progetto # crea cartella + .git
git clone https://github.com/user/repo.git
git clone https://github.com/user/repo.git nome-locale
Il file .gitignore nella root del progetto elenca file e cartelle che Git deve ignorare (es. node_modules/, *.log, .env).
Workflow quotidiano
Controllare lo stato del repository:
git status # file modificati, staged, untracked
git diff # diff working dir → staging
git diff --staged # diff staging → ultimo commit
Aggiungere file allo staging e committare:
git add file.txt # singolo file
git add src/ # intera cartella
git add -p # scegli blocchi interattivamente (patch mode)
git commit -m "feat: aggiunta analisi SPM"
git commit -am "fix: corretto path" # add + commit per file già tracciati
Consultare la storia dei commit:
git log --oneline --graph
git log -5 # ultimi 5 commit
git show abc1234 # dettaglio di un commit specifico
Branch & merge
Gestire i branch:
git branch # elenca branch locali
git branch feature-doppler # crea branch
git switch feature-doppler # passa al branch
git switch -c fix-spm # crea e passa in un solo comando
git branch -d feature-doppler # elimina branch
Integrare le modifiche:
git switch main
git merge feature-doppler # integra branch in main
git rebase main # sposta i commits su main (storia lineare)
Quando due branch modificano la stessa riga si crea un conflitto di merge. Git marca il file con <<<<<<< / ======= / >>>>>>>. Risolvi manualmente, poi git add + git commit.
Mettere da parte modifiche temporanee con stash:
git stash # salva working directory
git stash pop # ripristina
git stash list # elenca stash salvati
Remote & GitHub
Gestire i remote:
git remote -v # elenca remote configurati
git remote add origin https://github.com/user/repo.git
git remote rename origin upstream
Sincronizzare con il remote:
git push origin main # invia commits
git push -u origin feature-x # push + traccia il branch remoto
git fetch origin # scarica senza merge
git pull # fetch + merge
git pull --rebase # fetch + rebase (storia lineare)
Fork workflow su GitHub: fork → clone → branch → commit → push → pull request. Per tenere sincronizzato il fork: git fetch upstream && git rebase upstream/main.
Annullare errori
Prima del commit:
git restore file.txt # scarta modifiche nel working dir
git restore --staged file.txt # rimuovi dallo staging
git clean -fd # elimina file untracked
Modificare l'ultimo commit (solo se non ancora pushato):
git commit --amend -m "messaggio corretto"
Annullare un commit già pubblico in modo sicuro:
git revert abc1234 # crea un commit inverso
Spostare HEAD indietro con reset (attenzione):
git reset --soft HEAD~1 # torna di 1 commit, modifiche restano staged
git reset --mixed HEAD~1 # torna di 1 commit, modifiche nel working dir
git reset --hard HEAD~1 # ⚠ elimina definitivamente le modifiche
Regola d'oro: non riscrivere la storia di commit già pushati su un remote condiviso. Usa
git revertper annullare in modo sicuro.
git add -p — staging interattivo
La modalità patch mostra il diff a pezzi (hunk) e chiede cosa fare con ciascuno:
Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]?
| Tasto | Azione |
|---|---|
y |
aggiungi questo hunk allo staging |
n |
salta, non aggiungerlo |
q |
esci, non aggiungere questo né i successivi |
a |
aggiungi questo e tutti i successivi del file |
d |
salta questo e tutti i successivi del file |
s |
dividi l'hunk in parti più piccole |
e |
modifica manualmente le righe da includere |
? |
mostra l'help |
Utile con i notebook .ipynb: permette di includere solo le modifiche al codice sorgente, saltando i metadata di esecuzione (execution_count, outputs).
Cheatsheet
# Setup
git init / git clone <url>
git config --global user.name "Nome"
# Stato
git status
git diff / git diff --staged
git log --oneline --graph --all
# Staging & commit
git add -p / git add .
git commit -m "messaggio"
# Branch
git switch -c <nome>
git merge <branch>
git rebase <branch>
# Remote
git push / git pull / git fetch
git remote -v
# Undo
git restore <file>
git revert <hash>
git reset --soft/mixed/hard HEAD~N
# Varie
git stash / git stash pop
git tag v1.0
git cherry-pick <hash>
Alias consigliato da aggiungere alla configurazione globale:
git config --global alias.lg "log --oneline --graph --all --decorate"
Guida ai fondamentali di Git — versione per uso quotidiano in sviluppo e ricerca.