1. Configurazione iniziale di Git#
git config --global user.name "Tuo Nome" - impostare username globale
git config --global user.email "[email protected]" - impostare email globale
git config --list - mostrare tutti i valori di configurazione
git help <comando> - vedere manuale di un comando
2. Creazione e clonazione#
git init - inizializzare un nuovo repository Git
git clone <url> - clonare un repository remoto sulla macchina locale
git clone --depth 1 <url> - clonare solo l’ultimo commit (più veloce, senza la cronologia completa)
3. Stato e ispezione#
git status - mostra lo stato della working tree
git log - mostra la cronologia completa dei commit
git log --oneline - mostra la cronologia in formato compatto
git log --graph --decorate --all - mostra la cronologia con grafo dei branch
git show <commit> - mostra i dettagli di un commit
git diff - mostra differenze non ancora in stage
git diff --staged - mostra differenze già in stage
4. Aggiunta e commit#
git add <file> - aggiunge un file all’area di stage
git add . - aggiunge tutte le modifiche all’area di stage
git add -p - aggiunta interattiva a blocchi
git commit -m "Messaggio" - crea un commit con messaggio
git commit --amend - modifica l’ultimo commit (evitalo se l’hai già pubblicato con push)
git restore --staged <file> - rimuove un file dallo stage (equivalente moderno di git reset <file>)
git restore <file> - annulla le modifiche non salvate in stage di un file (attenzione: sono perse)
git reset --soft HEAD~1 - annulla l’ultimo commit mantenendo le modifiche
git reset --hard HEAD~1 - annulla l’ultimo commit eliminando le modifiche
5. Branching#
git branch - elenca i branch locali
git branch <nome> - crea un nuovo branch
git branch -d <nome> - elimina un branch già mergiato
git branch -D <nome> - elimina forzatamente un branch
git branch -m <nuovo_nome> - rinomina il branch corrente
6. Checkout e switch#
git checkout <branch> - passa a un branch (comando classico)
git checkout -b <nuovo_branch> - crea e passa a un nuovo branch
git switch <branch> - passa a un branch (comando moderno)
git switch -c <nuovo_branch> - crea e passa a un nuovo branch (moderno)
7. Merge e rebase#
git merge <branch> - unisce un branch nel branch corrente
git merge --no-ff <branch> - merge con commit esplicito
git rebase <branch> - riallinea i commit in modo lineare
git rebase -i <base> - rebase interattivo
git rebase --abort - annulla un rebase in corso
git rebase --continue - continua un rebase dopo la risoluzione conflitti
8. Remote#
git remote -v - mostra i repository remoti configurati
git remote add origin <url> - aggiunge un repository remoto
git remote remove origin - rimuove un remoto
git remote rename origin upstream - rinomina un remoto
9. Push e pull#
git push - invia i commit al remoto predefinito
git push -u origin <branch> - imposta upstream e invia il branch
git push --force-with-lease - force push più sicuro
git pull - scarica e integra modifiche (fetch + merge)
git pull --rebase - scarica e integra modifiche con rebase
10. Stash#
git stash - salva temporaneamente le modifiche non committate
git stash push -m "msg" - salva uno stash con messaggio
git stash list - elenca gli stash disponibili
git stash apply [stash@{n}] - applica uno stash senza rimuoverlo
git stash pop [stash@{n}] - applica e rimuove uno stash
git stash drop [stash@{n}] - elimina uno stash specifico
git stash clear - elimina tutti gli stash
11. Tag#
git tag - elenca i tag
git tag <nome> - crea un tag leggero
git tag -a <nome> -m "msg" - crea un tag annotato
git push --tags - invia tutti i tag al remoto
git tag -d <nome> - elimina un tag locale
git push origin :refs/tags/<nome> - elimina un tag remoto
12. Pulizia e manutenzione#
git clean -n - anteprima dei file non tracciati da rimuovere
git clean -fd - rimuove file e cartelle non tracciati
git prune - rimuove oggetti orfani
git gc - esegue garbage collection del repository
13. Comandi avanzati#
git reflog - mostra la cronologia dei movimenti di HEAD
git cherry-pick <commit> - applica un commit specifico su un altro branch
git bisect start - avvia la ricerca binaria di un bug
git bisect good - marca un commit come buono
git bisect bad - marca un commit come problematico
git blame <file> - mostra autore e commit per ogni riga
git rev-parse HEAD - mostra l’hash del commit corrente
git shortlog - riepiloga i contributi per autore
git archive -o out.zip HEAD - esporta uno snapshot del repository
14. Troubleshooting e recovery#
git reflog - recupera hash recenti anche dopo reset o rebase
git reset --hard <hash> - torna a uno stato noto del repository
git merge --abort - annulla un merge in corso
git rebase --abort - annulla un rebase in corso
git pull --rebase --autostash - riallinea branch divergenti mantenendo modifiche locali
15. Workflow e best practice#
- Conventional Commits (
feat:,fix:,docs:…) - usa messaggi di commit coerenti e leggibili - Nomi dei branch (
feature/<nome>,fix/<ticket>,hotfix/<ticket>,release/<versione>) - adotta una convenzione condivisa - Branch protection su
main- richiedi pull request, review e CI verde prima del merge - Commit piccoli e frequenti - un commit = una modifica logica, più facile da rivedere e da annullare
16. Comandi avanzati per DevOps e CI/CD#
git clone --depth 1 <url> - clonazione veloce per pipeline
git fetch --depth=1 origin <branch> - fetch superficiale del branch
git fetch --prune --tags - aggiorna tag e pulisce riferimenti remoti obsoleti
git checkout --force <hash> - checkout deterministico per build riproducibili
git diff --name-only origin/main...HEAD - elenca file cambiati per job condizionali
last_tag=$(git describe --tags --abbrev=0) - recupera l’ultimo tag
count_since=$(git rev-list --count ${last_tag}..HEAD) - conta i commit dal tag
echo "${last_tag}+build.${count_since}" - genera una versione build
git describe --tags --always --dirty - genera metadati versione human-friendly
git submodule add <url> path - aggiunge un submodule
git submodule update --init --recursive - inizializza e aggiorna submodule
git submodule sync --recursive - sincronizza URL dei submodule
git sparse-checkout init --cone - abilita sparse checkout
git sparse-checkout set path/solo-necessario - scarica solo i percorsi necessari
git worktree add ../build-wt <branch> - crea una working tree separata
git worktree remove ../build-wt - rimuove la working tree separata
git config --global commit.gpgsign true - abilita firma automatica dei commit
git tag -s v1.2.3 -m "release firmata" - crea un tag firmato
GIT_TRACE=1 GIT_CURL_VERBOSE=1 git fetch - abilita trace e debug rete
git clean -fdx - pulizia completa di file non tracciati (attenzione)
git merge --ff-only - evita merge commit non previsti
git fetch origin "+refs/heads/release/*:refs/remotes/origin/release/*" - fetch selettivo con refspec
git checkout <tag|hash> - recupera stato da tag o commit specifico
git bisect run ./test.sh - automatizza il bisect con script di test
git lfs install - inizializza Git LFS
git lfs track "*.bin" - traccia file grandi con LFS
git add .gitattributes - aggiunge le regole LFS
git clone --mirror <url> - crea mirror bare del repository
git remote add --mirror=push backup <url-backup> - configura push mirror verso backup
git remote prune origin - rimuove riferimenti remoti non più esistenti
git rev-parse HEAD > .git/ci-build-hash - salva hash commit per chiavi cache
git fetch origin main && git merge-base --is-ancestor origin/main HEAD || exit 1 - verifica branch aggiornato in CI
git log --pretty=format:"* %h %s (%an)" <from>..<to> - genera changelog tra due ref
git log --oneline -- <path/> - filtra i commit per cartella
git verify-commit <hash> - valida firma di un commit
git verify-tag <tag> - valida firma di un tag
17. Git hooks per automazioni locali#
Gli hook sono script che Git esegue automaticamente in certi momenti. Si trovano in .git/hooks/ e devono essere eseguibili (chmod +x).
pre-commit - esegue lint o test veloci prima del commit
commit-msg - valida il formato del messaggio di commit
pre-push - esegue test o una build rapida prima del push
Esempio di hook commit-msg che accetta solo messaggi in formato Conventional Commits:
#!/usr/bin/env bash
# .git/hooks/commit-msg
msg_file="$1" # Git passa il percorso del file con il messaggio
msg=$(head -n1 "$msg_file") # prima riga del messaggio
if ! echo "$msg" | grep -Eq '^(feat|fix|docs|style|refactor|perf|test|chore)(\(.+\))?!?: .+'; then
echo "Messaggio non valido. Esempio: feat(login): aggiunge il recupero password"
exit 1 # un codice diverso da 0 blocca il commit
fiNote di sicurezza#
- Preferisci
git push --force-with-leaseagit push --forcesui branch condivisi - Prima di
git clean -fdxlanciagit clean -ndxper vedere cosa verrà eliminato - Proteggi i branch principali e richiedi una CI verde prima del merge
Riferimenti utili#
- Documentazione ufficiale di Git
- Pro Git, il libro gratuito (disponibile anche in italiano)


