Comandi Git: cheat sheet con esempi per ogni giorno
I comandi Git essenziali sono git init e git clone per creare il repository, git status, git add e git commit per salvare le modifiche, git branch, git switch e git merge per lavorare con i rami, git push, git fetch e git pull per sincronizzarsi con il server, e git restore, git reset e git revert per annullare le modifiche.
Ecco un cheat sheet pratico di Git: i comandi sono raggruppati per attività, ognuno con un esempio e una breve spiegazione. Conviene tenerlo aperto accanto al terminale: quasi tutto ciò che uno sviluppatore fa con Git in una giornata rientra in 20–30 comandi di queste tabelle.
Per leggere i comandi con consapevolezza, tenete a mente tre aree: la directory di lavoro (i file sul disco), l'indice o staging area (ciò che entrerà nel prossimo commit) e il repository (la cronologia dei commit nella cartella .git). La maggior parte dei comandi Git sposta le modifiche tra queste tre aree o tra il repository locale e quello remoto.
Configurazione di Git
Questi comandi si eseguono una sola volta dopo l'installazione. Il flag --global scrive le impostazioni in ~/.gitconfig e vale per tutti i repository dell'utente; senza di esso valgono solo per il repository corrente.
| Comando | Che cosa fa |
|---|---|
git config --global user.name "Ivan Petrov" | Nome dell'autore dei commit |
git config --global user.email "ivan@example.com" | E-mail dell'autore dei commit |
git config --global init.defaultBranch main | Nome del ramo predefinito per i nuovi repository |
git config --global core.editor "code --wait" | Editor per i messaggi di commit (qui VS Code) |
git config --global pull.rebase false | Comportamento predefinito di git pull: fusione |
git config --global core.autocrlf input | Conversione CRLF in LF al commit (macOS/Linux; su Windows di solito true) |
git config --list --show-origin | Mostra tutte le impostazioni e il file da cui provengono |
git config --global alias.st status | Alias: git st al posto di git status |
git --version | Versione di Git installata |
git help commit | Guida completa di un comando (o git commit -h per quella breve) |
Creare e clonare un repository
| Comando | Che cosa fa |
|---|---|
git init | Crea un repository vuoto (la cartella .git) nella cartella corrente |
git init my-project | Crea la cartella my-project con un repository al suo interno |
git clone https://github.com/user/repo.git | Copia un repository remoto con tutta la cronologia |
git clone git@github.com:user/repo.git app | Clona tramite SSH nella cartella app |
git clone --depth 1 URL | Clone superficiale: solo l'ultimo commit, veloce e poco ingombrante |
git clone -b develop URL | Clona e passa subito al ramo develop |
Ciclo base: status, add, commit
È il cuore del lavoro quotidiano: vedere che cosa è cambiato, scegliere ciò che va nell'indice e registrarlo con un commit.
| Comando | Che cosa fa |
|---|---|
git status | Stato: file modificati, nell'indice e non tracciati |
git status -s | Formato breve: M — modificato, A — aggiunto, ?? — non tracciato |
git add file.txt | Aggiunge un file all'indice |
git add . | Aggiunge all'indice tutte le modifiche della cartella corrente e sottostanti, comprese le cancellazioni |
git add -A | Aggiunge all'indice tutte le modifiche di tutto il repository |
git add -p | Sceglie in modo interattivo i singoli frammenti (hunk) delle modifiche |
git commit -m "Aggiungere il form di accesso" | Crea un commit dall'indice con il messaggio indicato |
git commit -am "Correggere un refuso" | Mette nell'indice tutti i file tracciati modificati e fa il commit; i file nuovi non vengono inclusi |
git commit --amend | Riscrive l'ultimo commit: aggiunge ciò che era stato dimenticato nell'indice o corregge il messaggio |
git commit --amend --no-edit | Integra l'ultimo commit senza cambiare il messaggio |
git rm file.txt | Elimina un file dal disco e dall'indice |
git rm --cached secret.env | Smette di tracciare il file, lasciandolo sul disco |
git mv old.js new.js | Rinomina o sposta un file |
Uno scenario tipico:
git status
git add src/login.js src/login.css
git diff --staged # verifica che cosa finirà nel commit
git commit -m "Aggiungere il form di accesso"
Non usate --amend sui commit già inviati a un ramo condiviso: crea un nuovo commit con un hash diverso, e i colleghi dovranno gestire la divergenza nella cronologia.
Consultare la cronologia e le modifiche
| Comando | Che cosa fa |
|---|---|
git log | Cronologia dei commit del ramo corrente |
git log --oneline | Ogni commit su una riga: hash abbreviato e titolo |
git log --oneline --graph --all | Grafo di tutti i rami nel terminale |
git log -p file.txt | Cronologia di un file con i diff di ogni commit |
git log --author="Ivan" --since="2 weeks ago" | Filtro per autore e data |
git log -S "getUser" | Commit in cui è stata aggiunta o rimossa la stringa getUser |
git log main..feature | Commit presenti in feature ma non in main |
git diff | Modifiche nella directory di lavoro, non ancora aggiunte all'indice |
git diff --staged | Modifiche nell'indice rispetto all'ultimo commit (sinonimo di --cached) |
git diff main feature | Differenza tra le punte di due rami |
git diff HEAD~3 -- src/ | Modifiche nella cartella src negli ultimi tre commit |
git show a1b2c3d | Metadati e diff di un commit specifico |
git show HEAD:README.md | Contenuto di un file nell'ultimo commit |
git blame app.js | Chi e in quale commit ha modificato per ultimo ogni riga |
git shortlog -sn | Numero di commit per autore |
I riferimenti ai commit sono utili ovunque: HEAD è il commit corrente, HEAD~1 il suo genitore, HEAD~3 tre passi indietro lungo il primo genitore, HEAD^2 il secondo genitore di un merge commit.
Rami: creare, cambiare, eliminare
Dalla versione 2.23 Git ha git switch per i rami e git restore per i file: hanno separato il sovraccarico git checkout. Le forme vecchie continuano a funzionare.
| Comando | Che cosa fa |
|---|---|
git branch | Elenco dei rami locali; quello corrente è segnato con * |
git branch -a | Rami locali e remoti (di tracciamento) |
git branch -vv | Rami con l'ultimo commit e il ritardo/vantaggio rispetto all'upstream |
git branch feature/login | Crea un ramo senza spostarsi |
git switch feature/login | Passa al ramo |
git switch -c feature/login | Crea un ramo e vi passa (equivale a git checkout -b) |
git switch - | Torna al ramo precedente |
git branch -m new-name | Rinomina il ramo corrente |
git branch -d feature/login | Elimina il ramo, se è già stato unito |
git branch -D feature/login | Elimina il ramo a forza, anche se non unito |
git branch --merged | Rami già uniti nel corrente — candidati all'eliminazione |
Fusione e rebase
| Comando | Che cosa fa |
|---|---|
git merge feature | Unisce feature nel ramo corrente (fast-forward, se possibile) |
git merge --no-ff feature | Crea sempre un merge commit |
git merge --squash feature | Raccoglie nell'indice tutte le modifiche del ramo in un unico blocco, poi git commit |
git merge --abort | Annulla una fusione con conflitti e torna allo stato iniziale |
git rebase main | Sposta i commit del ramo corrente sopra main |
git rebase -i HEAD~4 | Interattivo: unire (squash), rinominare, riordinare, eliminare gli ultimi 4 commit |
git rebase --continue | Prosegue dopo la risoluzione di un conflitto |
git rebase --abort | Annulla completamente il rebase |
git cherry-pick a1b2c3d | Applica un commit al ramo corrente come nuovo commit |
Risolvere un conflitto di fusione è quasi sempre uguale:
git merge feature
# CONFLICT (content): Merge conflict in app.js
git status # i file compaiono nella sezione "both modified"
# modificate app.js ed eliminate i marcatori <<<<<<< ======= >>>>>>>
git add app.js
git commit # Git propone il messaggio pronto per il merge commit
Regola fondamentale del rebase: non rifate il rebase di commit già presenti in un ramo condiviso e su cui altri stanno costruendo il lavoro.
Lavorare con i repository remoti
| Comando | Che cosa fa |
|---|---|
git remote -v | Elenco dei remote e dei loro indirizzi |
git remote add origin git@github.com:user/repo.git | Collega un repository remoto con il nome origin |
git remote set-url origin NUOVO_URL | Cambia l'indirizzo del remote (per esempio da HTTPS a SSH) |
git remote remove upstream | Scollega un remote |
git fetch | Scarica nuovi commit e rami senza toccare i vostri file |
git fetch --prune | Come sopra, più l'eliminazione dei riferimenti a rami cancellati sul server |
git pull | git fetch + fusione del ramo upstream nel corrente |
git pull --rebase | git fetch + rebase dei vostri commit sopra quelli ricevuti |
git push | Invia i commit del ramo corrente al suo upstream |
git push -u origin feature/login | Primo invio del ramo con impostazione dell'upstream |
git push --force-with-lease | Sovrascrive il ramo remoto solo se non ci sono nuovi commit altrui |
git push origin --delete feature/login | Elimina il ramo sul server |
git push --tags | Invia tutti i tag locali |
Invece di git push --force abituatevi a --force-with-lease: se un collega ha già inviato commit nello stesso ramo, il comando si rifiuta di sovrascrivere il suo lavoro.
Annullare le modifiche
È la parte più delicata di Git. La domanda chiave prima di scegliere il comando: le modifiche sono ancora solo nei file, già nell'indice, in un commit locale oppure in un commit pubblicato?
| Situazione | Comando |
|---|---|
| Annullare le modifiche a un file (tornare com'era nell'ultimo commit) | git restore app.js |
| Togliere un file dall'indice, mantenendo le modifiche | git restore --staged app.js |
| Recuperare un file da un commit specifico | git restore --source=a1b2c3d app.js |
| Annullare l'ultimo commit, lasciando le modifiche nell'indice | git reset --soft HEAD~1 |
| Annullare l'ultimo commit, lasciando le modifiche nei file | git reset HEAD~1 (modalità --mixed predefinita) |
| Eliminare l'ultimo commit con tutte le sue modifiche | git reset --hard HEAD~1 |
| Annullare un commit pubblicato con un nuovo commit «inverso» | git revert a1b2c3d |
| Annullare un merge commit | git revert -m 1 <hash-del-merge> |
| Vedere quali file non tracciati verrebbero eliminati | git clean -n |
| Eliminare file e cartelle non tracciati | git clean -fd |
| Ritrovare un commit «perso» dopo un reset o un rebase | git reflog, poi git reset --hard HEAD@{2} |
git reset --hard e git clean -f eliminano in modo irreversibile le modifiche non committate: il reflog conserva solo i commit, non le modifiche nella directory di lavoro. Prima di usarli fate uno git stash o almeno un git status.
Stash: mettere da parte il lavoro non finito
| Comando | Che cosa fa |
|---|---|
git stash | Mette da parte le modifiche dei file tracciati e ripulisce la directory di lavoro |
git stash push -u -m "wip: form" | Mette da parte anche i file non tracciati, con un'etichetta |
git stash list | Elenco degli stash: stash@{0}, stash@{1}… |
git stash show -p stash@{0} | Mostra il diff di uno stash |
git stash pop | Ripristina l'ultimo stash e lo rimuove dall'elenco |
git stash apply stash@{1} | Ripristina uno stash lasciandolo nell'elenco |
git stash drop stash@{1} | Elimina uno stash |
git stash branch fix-form | Crea un ramo dal commit in cui è stato creato lo stash e vi applica le modifiche |
Tag e release
| Comando | Che cosa fa |
|---|---|
git tag | Elenco dei tag |
git tag -a v1.2.0 -m "Release 1.2.0" | Tag annotato con autore, data e messaggio |
git tag v1.2.0 a1b2c3d | Tag leggero su un commit specifico |
git push origin v1.2.0 | Invia un singolo tag |
git tag -d v1.2.0 | Elimina il tag in locale |
git push origin --delete v1.2.0 | Elimina il tag sul server |
git describe --tags | Tag più vicino e numero di commit successivi, per esempio v1.2.0-3-ga1b2c3d |
Comandi avanzati
| Comando | Che cosa fa |
|---|---|
git bisect start, git bisect bad, git bisect good v1.1.0 | Ricerca binaria del commit che ha introdotto un errore; alla fine git bisect reset |
git worktree add ../hotfix main | Una seconda cartella di lavoro con un altro ramo dello stesso repository |
git submodule update --init --recursive | Scarica i submodule dopo il clone |
git grep "TODO" | Ricerca rapida nei file tracciati |
git format-patch -1 HEAD / git apply fix.patch | Salva un commit in una patch e applica una patch alla directory di lavoro |
git gc | Compatta gli oggetti e pulisce il repository (di solito lo fa Git da solo) |
Errori frequenti e come correggerli
Avete fatto il commit su main invece che su un nuovo ramo
Se il commit non è ancora stato inviato, create un ramo sul commit corrente e riportate indietro main:
git branch feature/login # il ramo punta al vostro commit
git reset --hard HEAD~1 # main torna indietro di un passo
git switch feature/login
Avete dimenticato un file nell'ultimo commit
git add dimenticato.js
git commit --amend --no-edit
Push rifiutato: rejected, non-fast-forward
Sul server ci sono commit che voi non avete. Prima recuperateli, poi inviate:
git pull --rebase
git push
Avete committato per errore un file con le password
Toglietelo dal tracciamento e inseritelo in .gitignore: git rm --cached .env, poi il commit. Se il commit è già stato inviato, considerate il segreto compromesso e rigeneratelo — dalla cronologia non è sparito.
Riepilogo
Per il lavoro quotidiano bastano poche righe: status, add, commit, switch, merge, pull, push e log --oneline. I comandi di annullamento — restore, reset, revert — si scelgono in base al fatto che il commit sia stato pubblicato o meno, mentre reflog va ricordato come rete di sicurezza per i casi estremi. Tutti i comandi di questo cheat sheet li esercitiamo in pratica nel corso di Git, provandoli nel proprio repository.
Domande frequenti
Quanti comandi Git deve conoscere un principiante?
Per iniziare bastano 10–12: init, clone, status, add, commit, log, diff, branch, switch, merge, pull e push. Gli altri si imparano man mano che servono.
In cosa git switch differisce da git checkout?
git switch serve solo a cambiare e creare rami, mentre git checkout serve anche a ripristinare file. La separazione in switch e restore evita di cancellare per errore delle modifiche confondendo un ramo con un file.
Come vedere la guida di un comando Git?
Eseguite git help nome-comando per il manuale completo oppure git nome-comando -h per l'elenco breve dei flag. La stessa documentazione è disponibile su git-scm.com.
Si possono accorciare i comandi Git lunghi?
Sì, con gli alias: git config --global alias.lg "log --oneline --graph --all" permette di digitare git lg.
Questi comandi funzionano su Windows?
Sì, i comandi sono identici su tutti i sistemi. Su Windows conviene eseguirli in Git Bash, in PowerShell o nel terminale dell'editor di codice.
Questo argomento è trattato in modo approfondito, con pratica, nel corso «Git da zero a sviluppatore sicuro».
- Primo repository: init, add, commit e la magia dell'indice
- Leggiamo la storia: log, diff, show e navigazione nel passato
- Branch: la realtà parallela del tuo codice
- Annullare gli errori: restore, reset, revert — correttamente e con cautela
- GitHub e repository remoti: il tuo codice nel cloud
- Strumenti avanzati: rebase, stash, cherry-pick e tag