Git Cheat Sheet
Comandi, flag, esempi ed errori comuni
Configurazione
Legge o imposta opzioni di configurazione di Git su tre livelli: sistema, utente (globale) o repository (locale).
git config --global user.name "John Doe" git config --global user.email "john.doe@example.com"
Definisce come Git memorizza le credenziali HTTPS per non chiedere la password ad ogni push.
git config --global credential.helper manager
Imposta un .gitignore globale applicato a tutti i repository.
git config --global core.excludesfile ~/.gitignore_global
Repository
Crea un nuovo repository Git nella directory corrente.
git init git init --initial-branch=main meu-projeto
Copia un repository remoto sulla macchina locale insieme a tutta la storia.
git clone https://github.com/user/repo.git
Stage e commit
Mostra lo stato del working directory e dello staging: cosa è modificato, in stage o non tracciato.
git status
Sposta le modifiche dal working directory allo staging area, pronte per il prossimo commit.
git add src/components/Button.tsx git add .
Registra il contenuto dello staging in un nuovo commit del repository locale con un messaggio.
git commit -m "feat: adiciona git cheat sheet"
Ripristina file: li toglie dallo staging o annulla le modifiche nel working directory.
git restore --staged file.txt git restore file.txt
Rimuove file dal repository (ed eventualmente dal disco).
git rm secret.env
Rinomina o sposta un file tracciato, equivalente a mv + git add + git rm.
git mv old.tsx new.tsx
Branch
Elenca, crea, rinomina o elimina branch.
git branch git branch feature/login
Vecchio comando per cambiare branch o ripristinare file. Oggi si raccomandano git switch e git restore.
git checkout main git checkout -b feature/x
Versione moderna di checkout dedicata al cambio di branch.
git switch main git switch -c feature/login
Merge e rebase
Unisce le modifiche di un'altra branch in quella corrente, creando un commit di merge se necessario.
git switch main git merge feature/login
Riapplica i commit della branch corrente sopra un'altra base, riscrivendo la storia.
git switch feature git rebase main
Applica un commit specifico di un'altra branch su quella corrente.
git cherry-pick a1b2c3d
Apre uno strumento grafico per risolvere i conflitti di merge.
git mergetool --tool=meld
Remote
Gestisce i remoti del repository (origin, upstream, ecc).
git remote -v
Scarica commit e ref dal remoto senza integrarli nella branch locale.
git fetch origin
Equivale a git fetch seguito da git merge (o rebase) sulla branch corrente.
git pull origin main
Invia i commit locali al remoto.
git push -u origin feature/login
Stash
Salva modifiche non commitate su una pila temporanea per pulire il working directory.
git stash push -m "WIP login"
Manipolazione della pila degli stash.
git stash list git stash pop
Tag
Crea, elenca, elimina o verifica tag. I tag segnano punti della storia (release).
git tag -a v1.2.0 -m "Release 1.2"
Restituisce un nome leggibile basato sul tag più vicino.
git describe --tags --always --dirty
Log
Mostra la storia dei commit con filtri e formati flessibili.
git log --oneline --graph --decorate --all
Mostra il contenuto di un commit, tag o oggetto.
git show HEAD git show a1b2c3d:src/file.tsx
Mostra le differenze tra working dir, staging, commit o branch.
git diff git diff --cached git diff main feature
Mostra chi ha modificato ogni riga di un file e in quale commit.
git blame -L 10,30 file.tsx
Riepilogo raggruppato per autore (utile per le release notes).
git shortlog -sne
Storia locale di tutto ciò che HEAD ha toccato. Salvavita per recuperare commit persi.
git reflog
git reset --hard HEAD@{2}Annulla
Sposta HEAD a un altro commit, alterando opzionalmente staging e working dir.
git reset --soft HEAD~1 git reset --mixed HEAD~1 git reset --hard HEAD~1
Crea un nuovo commit che annulla le modifiche di un altro. Sicuro su branch condivise.
git revert a1b2c3d
Cancella file non tracciati dal working directory. Operazione distruttiva.
git clean -nfd
Sottomoduli
Aggiunge un repository come sottomodulo dentro a quello corrente.
git submodule add -b main https://github.com/user/lib.git vendor/lib
Inizializza e scarica i sottomoduli definiti in .gitmodules.
git submodule update --init --recursive
Vedere lo stato, eseguire un comando in ogni sottomodulo o disattivarlo.
git submodule foreach 'git pull origin main'
Hook
Crea un file eseguibile in .git/hooks/ con il nome dell'evento (pre-commit, pre-push, commit-msg, post-merge, ecc).
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit chmod +x .git/hooks/pre-commit
Definisce una directory di hook condivisa (versionabile, fuori da .git).
git config core.hooksPath .githooks
Tool JS che versiona gli hook in package.json e li installa automaticamente.
npx husky init echo "npm test" > .husky/pre-commit
Salta gli hook pre-commit e commit-msg (usare con moderazione).
git commit --no-verify -m "hotfix"
Avanzato
Ricerca binaria nella storia per trovare il commit che ha introdotto un bug.
git bisect start git bisect bad HEAD git bisect good v1.0 git bisect reset
Crea più working directory legate allo stesso .git, permettendo di lavorare su più branch in parallelo.
git worktree add ../proj-hotfix hotfix/urgente
Riscrive la storia: combina, riordina, modifica o elimina commit.
git rebase -i HEAD~5 # pick a1b2 feat: x # squash c3d4 fix typo # reword e5f6 chore: y # drop g7h8 wip
Riscrive la storia in massa, sostituto moderno di git filter-branch. Utile per rimuovere file sensibili.
git filter-repo --path secrets.env --invert-paths
Crea un tarball o zip del contenuto di una ref, senza .git.
git archive --format=zip --prefix=app/ -o release.zip v1.0
Impacchetta commit in un singolo file, trasferibile offline.
git bundle create repo.bundle --all git clone repo.bundle nova-pasta
Risolve un riferimento in SHA completa, corta o nome.
git rev-parse HEAD git rev-parse --abbrev-ref HEAD git rev-parse --short HEAD
Ispeziona oggetti Git (blob, tree, commit, tag).
git cat-file -p HEAD git cat-file -t a1b2c3d
Elenca file tracciati (ls-files) o il contenuto di una tree (ls-tree).
git ls-files git ls-tree -r HEAD --name-only
Manutenzione: garbage collection, integrità, rimozione di oggetti sciolti.
git gc --aggressive --prune=now git fsck --full
Permette di tenere localmente solo un sottoinsieme dell'albero, utile per monorepo grandi.
git sparse-checkout init --cone git sparse-checkout set apps/web libs/ui
Aggiunge note ai commit senza alterarne lo SHA.
git notes add -m "reviewed by QA" HEAD
Riferimento
┌──────────────┐ git add ┌────────────┐ git commit ┌─────────────┐ git push ┌──────────┐
│ Working Dir │ ───────────▶ │ Staging │ ───────────▶ │ Local Repo │ ──────────▶ │ Remote │
│ (files) │ ◀─────────── │ (index) │ ◀─────────── │ (.git) │ ◀────────── │ (origin) │
└──────────────┘ git restore └────────────┘ git reset └─────────────┘ git fetch └──────────┘
git pull = git fetch + git merge- untrackedfile nuovo, Git non lo conosce ancora
- modifiedfile noto è stato modificato
- stagedmarcato per il prossimo commit
- committedsalvato in .git, parte della storia
- ignoredelencato in .gitignore
Branch condivise, integrare grandi feature preservando il contesto, branch di release.
- Non riscrive la storia
- Sicuro in qualsiasi scenario
- Preserva la timeline reale
- Storia con diamanti e rumore
- git log più difficile da leggere
Aggiornare la feature branch locale con main prima della PR. Mantenere una storia lineare.
- Storia lineare e pulita
- git log leggibile
- git bisect più efficace
- Riscrive gli SHA (MAI su branch pubbliche)
- I conflitti possono essere ripetitivi
- Perde il contesto temporale
Prima di mergeare una feature con vari commit 'wip' o 'fix typo' in main.
- 1 commit pulito per feature
- main con storia ultra leggibile
- Perde la granularità dello sviluppo
- git bisect localizza solo l'intera feature
Regola d'oro: rebase localmente, merge pubblicamente. Mai fare rebase su branch usate da altri.
--softMantiene staging e working dirSposta HEAD. Mantiene staging e working dir intatti. I file restano in stage.
Raggruppare commit senza perdere modifiche.
--mixedPulisce staging, mantiene working dir(default) Sposta HEAD. Pulisce lo staging ma mantiene il working dir. I file tornano unstaged.
Rifare quello che andava nel prossimo commit.
--hardCancella tutto (distruttivo)Sposta HEAD. Pulisce staging E working dir. Cancella le modifiche non commitate. Distruttivo.
Tornare allo stato di un altro commit, abbandonando tutto.
fatal: refusing to merge unrelated historiesI due repository non condividono un commit antenato comune.
git pull origin main --allow-unrelated-histories
Updates were rejected because the remote contains work that you do not haveIl remoto ha commit che il locale non conosce.
git pull --rebase origin main e poi git push. Mai fare push --force senza --force-with-lease.
Please commit your changes or stash them before you switch branchesCi sono modifiche locali che andrebbero in conflitto cambiando branch.
git stash, git switch altra-branch, poi git stash pop.
CONFLICT (content): Merge conflict in <file>Il merge o il rebase ha toccato le stesse righe di un'altra branch.
Modificare tra <<<<<<< ======= >>>>>>> poi git add file e git merge --continue. Per abortire: git merge --abort.
detached HEADÈ stato fatto checkout di uno SHA o di un tag invece di una branch.
Per salvare il lavoro: git switch -c nuova-branch. Per scartare: git switch main.
Permission denied (publickey)Chiave SSH non configurata su GitHub o GitLab.
Eseguire ssh-keygen -t ed25519 -C "email" e aggiungere ~/.ssh/id_ed25519.pub alle chiavi SSH del servizio.
fatal: Authentication failed (HTTPS)GitHub non accetta più password, serve un Personal Access Token.
Generare un PAT su GitHub e usarlo come password, oppure passare il remote a SSH.
Your branch and 'origin/main' have divergedEntrambi i lati hanno commit diversi.
git pull --rebase su feature locale, oppure git pull semplice su main condivisa.
error: failed to push some refs (non-fast-forward)Il remoto è andato avanti, non si può pushare senza integrare prima.
git pull --rebase seguito da git push.
Ho cancellato la branch sbagliata o ho fatto reset --hard e ho perso lavoroOperazione distruttiva senza backup.
git reflog per trovare lo SHA, poi git checkout -b recuperata <sha>. I commit restano per ~30 giorni prima del gc.
.gitignore non funzionaIl file era già tracciato prima di essere ignorato.
git rm --cached <file> seguito da git commit -m "untrack". Per le directory: git rm -r --cached <cartella>.
Ho committato un segreto, una password o un file .envgit add . senza prudenza.
Ruotare il segreto, eseguire git filter-repo --path .env --invert-paths, git push --force-with-lease e avvisare il team di riclonare.
LF will be replaced by CRLFDifferenze di fine riga tra Windows e Unix.
git config --global core.autocrlf true su Windows, oppure input su Mac e Linux.
Filename too long (Windows)Limite di 260 caratteri di Windows.
git config --system core.longpaths true