MaisTools
Sviluppatore/

Git Cheat Sheet

Riferimento rapido di Git: comandi, flag, esempi e varianti organizzati per sezione con ricerca istantanea.

Git Cheat Sheet

Comandi, flag, esempi ed errori comuni

Configurazione

git config

Legge o imposta opzioni di configurazione di Git su tre livelli: sistema, utente (globale) o repository (locale).

Flag--global--local--system--list--unset--edit
Esempio
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
git config credential.helper

Definisce come Git memorizza le credenziali HTTPS per non chiedere la password ad ogni push.

Esempio
git config --global credential.helper manager
git config --global core.excludesfile

Imposta un .gitignore globale applicato a tutti i repository.

Esempio
git config --global core.excludesfile ~/.gitignore_global

Repository

git init

Crea un nuovo repository Git nella directory corrente.

Flag--bare--initial-branch=--shared
Esempio
git init
git init --initial-branch=main meu-projeto
git clone

Copia un repository remoto sulla macchina locale insieme a tutta la storia.

Flag--depth--branch--single-branch--recurse-submodules--mirror--bare
Esempio
git clone https://github.com/user/repo.git

Stage e commit

git status

Mostra lo stato del working directory e dello staging: cosa è modificato, in stage o non tracciato.

Flag-s-b--ignored-uno
Esempio
git status
git add

Sposta le modifiche dal working directory allo staging area, pronte per il prossimo commit.

Flag-A-p-i-u-n-f
Esempio
git add src/components/Button.tsx
git add .
git commit

Registra il contenuto dello staging in un nuovo commit del repository locale con un messaggio.

Flag-m-a--amend--no-edit-S--allow-empty--no-verify--fixup--squash
Esempio
git commit -m "feat: adiciona git cheat sheet"
git restore

Ripristina file: li toglie dallo staging o annulla le modifiche nel working directory.

Flag--staged--source=--worktree
Esempio
git restore --staged file.txt
git restore file.txt
git rm

Rimuove file dal repository (ed eventualmente dal disco).

Flag--cached-r-f-n
Esempio
git rm secret.env
git mv

Rinomina o sposta un file tracciato, equivalente a mv + git add + git rm.

Flag-f-n
Esempio
git mv old.tsx new.tsx

Branch

git branch

Elenca, crea, rinomina o elimina branch.

Flag-a-r-vv-d-D-m-M--merged--no-merged--contains
Esempio
git branch
git branch feature/login
git checkout

Vecchio comando per cambiare branch o ripristinare file. Oggi si raccomandano git switch e git restore.

Flag-b-B--orphan--detach
Esempio
git checkout main
git checkout -b feature/x
git switch

Versione moderna di checkout dedicata al cambio di branch.

Flag-c-C--detach--discard-changes
Esempio
git switch main
git switch -c feature/login

Merge e rebase

git merge

Unisce le modifiche di un'altra branch in quella corrente, creando un commit di merge se necessario.

Flag--no-ff--ff-only--squash--abort--continue-X-s
Esempio
git switch main
git merge feature/login
git rebase

Riapplica i commit della branch corrente sopra un'altra base, riscrivendo la storia.

Flag-i--onto--continue--abort--skip--autosquash--autostash
Esempio
git switch feature
git rebase main
git cherry-pick

Applica un commit specifico di un'altra branch su quella corrente.

Flag-x-n--continue--abort
Esempio
git cherry-pick a1b2c3d
git mergetool

Apre uno strumento grafico per risolvere i conflitti di merge.

Flag--tool=-y
Esempio
git mergetool --tool=meld

Remote

git remote

Gestisce i remoti del repository (origin, upstream, ecc).

Sottocomandiaddremoverenameset-urlshowprune
Flag-v
Esempio
git remote -v
git fetch

Scarica commit e ref dal remoto senza integrarli nella branch locale.

Flag--all--prune--tags--depth--unshallow
Esempio
git fetch origin
git pull

Equivale a git fetch seguito da git merge (o rebase) sulla branch corrente.

Flag--rebase--ff-only--no-rebase--autostash
Esempio
git pull origin main
git push

Invia i commit locali al remoto.

Flag-u--force--force-with-lease--tags--delete--dry-run--all
Esempio
git push -u origin feature/login

Stash

git stash

Salva modifiche non commitate su una pila temporanea per pulire il working directory.

Sottocomandipush
Flag-u-a-m-k-p
Esempio
git stash push -m "WIP login"
git stash list / show / pop / apply / drop / clear

Manipolazione della pila degli stash.

Esempio
git stash list
git stash pop

Tag

git tag

Crea, elenca, elimina o verifica tag. I tag segnano punti della storia (release).

Flag-a-m-s-d-l-f
Esempio
git tag -a v1.2.0 -m "Release 1.2"
git describe

Restituisce un nome leggibile basato sul tag più vicino.

Flag--tags--always--dirty--abbrev
Esempio
git describe --tags --always --dirty

Log

git log

Mostra la storia dei commit con filtri e formati flessibili.

Flag--oneline--graph--all--decorate-p--stat--since--author--grep-S
Esempio
git log --oneline --graph --decorate --all
git show

Mostra il contenuto di un commit, tag o oggetto.

Flag--stat--name-only--name-status
Esempio
git show HEAD
git show a1b2c3d:src/file.tsx
git diff

Mostra le differenze tra working dir, staging, commit o branch.

Flag--cached--staged--stat--name-only--word-diff
Esempio
git diff
git diff --cached
git diff main feature
git blame

Mostra chi ha modificato ogni riga di un file e in quale commit.

Flag-L-w-C-M
Esempio
git blame -L 10,30 file.tsx
git shortlog

Riepilogo raggruppato per autore (utile per le release notes).

Flag-s-n-e
Esempio
git shortlog -sne
git reflog

Storia locale di tutto ciò che HEAD ha toccato. Salvavita per recuperare commit persi.

Sottocomandishowexpiredelete
Esempio
git reflog
git reset --hard HEAD@{2}

Annulla

git reset

Sposta HEAD a un altro commit, alterando opzionalmente staging e working dir.

Flag--soft--mixed--hard--keep--merge
Esempio
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
git revert

Crea un nuovo commit che annulla le modifiche di un altro. Sicuro su branch condivise.

Flag--no-commit-m--continue--abort
Esempio
git revert a1b2c3d
git clean

Cancella file non tracciati dal working directory. Operazione distruttiva.

Flag-n-f-d-x-X-i
Esempio
git clean -nfd

Sottomoduli

git submodule add

Aggiunge un repository come sottomodulo dentro a quello corrente.

Flag-b--name
Esempio
git submodule add -b main https://github.com/user/lib.git vendor/lib
git submodule init / update

Inizializza e scarica i sottomoduli definiti in .gitmodules.

Flag--init--recursive--remote--merge--rebase
Esempio
git submodule update --init --recursive
git submodule status / foreach / deinit

Vedere lo stato, eseguire un comando in ogni sottomodulo o disattivarlo.

Flag--recursive
Esempio
git submodule foreach 'git pull origin main'

Hook

Attivare un hook manuale

Crea un file eseguibile in .git/hooks/ con il nome dell'evento (pre-commit, pre-push, commit-msg, post-merge, ecc).

Esempio
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
git config core.hooksPath

Definisce una directory di hook condivisa (versionabile, fuori da .git).

Esempio
git config core.hooksPath .githooks
Husky

Tool JS che versiona gli hook in package.json e li installa automaticamente.

Esempio
npx husky init
echo "npm test" > .husky/pre-commit
git commit --no-verify

Salta gli hook pre-commit e commit-msg (usare con moderazione).

Esempio
git commit --no-verify -m "hotfix"

Avanzato

git bisect

Ricerca binaria nella storia per trovare il commit che ha introdotto un bug.

Sottocomandistartgoodbadskipresetrun
Esempio
git bisect start
git bisect bad HEAD
git bisect good v1.0
git bisect reset
git worktree

Crea più working directory legate allo stesso .git, permettendo di lavorare su più branch in parallelo.

Sottocomandiaddlistremoveprune
Esempio
git worktree add ../proj-hotfix hotfix/urgente
git rebase -i

Riscrive la storia: combina, riordina, modifica o elimina commit.

Sottocomandipickrewordeditsquashfixupdropexec
Esempio
git rebase -i HEAD~5
# pick    a1b2 feat: x
# squash  c3d4 fix typo
# reword  e5f6 chore: y
# drop    g7h8 wip
git filter-repo

Riscrive la storia in massa, sostituto moderno di git filter-branch. Utile per rimuovere file sensibili.

Flag--path--invert-paths--replace-text
Esempio
git filter-repo --path secrets.env --invert-paths
git archive

Crea un tarball o zip del contenuto di una ref, senza .git.

Flag--format--prefix-o
Esempio
git archive --format=zip --prefix=app/ -o release.zip v1.0
git bundle

Impacchetta commit in un singolo file, trasferibile offline.

Sottocomandicreateverifyunbundle
Esempio
git bundle create repo.bundle --all
git clone repo.bundle nova-pasta
git rev-parse

Risolve un riferimento in SHA completa, corta o nome.

Flag--short--abbrev-ref--verify
Esempio
git rev-parse HEAD
git rev-parse --abbrev-ref HEAD
git rev-parse --short HEAD
git cat-file

Ispeziona oggetti Git (blob, tree, commit, tag).

Flag-p-t-s
Esempio
git cat-file -p HEAD
git cat-file -t a1b2c3d
git ls-files / ls-tree

Elenca file tracciati (ls-files) o il contenuto di una tree (ls-tree).

Flag--cached--others--ignored
Esempio
git ls-files
git ls-tree -r HEAD --name-only
git gc / fsck

Manutenzione: garbage collection, integrità, rimozione di oggetti sciolti.

Flag--aggressive--prune=now
Esempio
git gc --aggressive --prune=now
git fsck --full
git sparse-checkout

Permette di tenere localmente solo un sottoinsieme dell'albero, utile per monorepo grandi.

Sottocomandiinitsetlistdisable
Esempio
git sparse-checkout init --cone
git sparse-checkout set apps/web libs/ui
git notes

Aggiunge note ai commit senza alterarne lo SHA.

Sottocomandiaddshoweditremove
Esempio
git notes add -m "reviewed by QA" HEAD

Riferimento

Flusso Git
┌──────────────┐  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
Merge vs Rebase vs Squash
Merge

Branch condivise, integrare grandi feature preservando il contesto, branch di release.

Vantaggi
  • Non riscrive la storia
  • Sicuro in qualsiasi scenario
  • Preserva la timeline reale
Svantaggi
  • Storia con diamanti e rumore
  • git log più difficile da leggere
Rebase

Aggiornare la feature branch locale con main prima della PR. Mantenere una storia lineare.

Vantaggi
  • Storia lineare e pulita
  • git log leggibile
  • git bisect più efficace
Svantaggi
  • Riscrive gli SHA (MAI su branch pubbliche)
  • I conflitti possono essere ripetitivi
  • Perde il contesto temporale
Squash

Prima di mergeare una feature con vari commit 'wip' o 'fix typo' in main.

Vantaggi
  • 1 commit pulito per feature
  • main con storia ultra leggibile
Svantaggi
  • 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.

Reset: soft, mixed, hard
--softMantiene staging e working dir

Sposta 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.

Errori comuni e soluzioni
fatal: refusing to merge unrelated histories
Causa

I due repository non condividono un commit antenato comune.

Soluzione

git pull origin main --allow-unrelated-histories

Updates were rejected because the remote contains work that you do not have
Causa

Il remoto ha commit che il locale non conosce.

Soluzione

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 branches
Causa

Ci sono modifiche locali che andrebbero in conflitto cambiando branch.

Soluzione

git stash, git switch altra-branch, poi git stash pop.

CONFLICT (content): Merge conflict in <file>
Causa

Il merge o il rebase ha toccato le stesse righe di un'altra branch.

Soluzione

Modificare tra <<<<<<< ======= >>>>>>> poi git add file e git merge --continue. Per abortire: git merge --abort.

detached HEAD
Causa

È stato fatto checkout di uno SHA o di un tag invece di una branch.

Soluzione

Per salvare il lavoro: git switch -c nuova-branch. Per scartare: git switch main.

Permission denied (publickey)
Causa

Chiave SSH non configurata su GitHub o GitLab.

Soluzione

Eseguire ssh-keygen -t ed25519 -C "email" e aggiungere ~/.ssh/id_ed25519.pub alle chiavi SSH del servizio.

fatal: Authentication failed (HTTPS)
Causa

GitHub non accetta più password, serve un Personal Access Token.

Soluzione

Generare un PAT su GitHub e usarlo come password, oppure passare il remote a SSH.

Your branch and 'origin/main' have diverged
Causa

Entrambi i lati hanno commit diversi.

Soluzione

git pull --rebase su feature locale, oppure git pull semplice su main condivisa.

error: failed to push some refs (non-fast-forward)
Causa

Il remoto è andato avanti, non si può pushare senza integrare prima.

Soluzione

git pull --rebase seguito da git push.

Ho cancellato la branch sbagliata o ho fatto reset --hard e ho perso lavoro
Causa

Operazione distruttiva senza backup.

Soluzione

git reflog per trovare lo SHA, poi git checkout -b recuperata <sha>. I commit restano per ~30 giorni prima del gc.

.gitignore non funziona
Causa

Il file era già tracciato prima di essere ignorato.

Soluzione

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 .env
Causa

git add . senza prudenza.

Soluzione

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 CRLF
Causa

Differenze di fine riga tra Windows e Unix.

Soluzione

git config --global core.autocrlf true su Windows, oppure input su Mac e Linux.

Filename too long (Windows)
Causa

Limite di 260 caratteri di Windows.

Soluzione

git config --system core.longpaths true