🐙 Git e GitHub CLI
Comandi Git di base e avanzati per il controllo di versione, branching, repository remoti, stash, tag e GitHub CLI.
🔹 Comandi di base
| Comando | Esempio | Descrizione | 
|---|---|---|
| git add | Aggiunge un file all’area di staging | |
| git add file.txt | Metti in staging un file specifico per il prossimo commit | |
| git add . | Metti in staging tutte le modifiche nella directory corrente e sotto-directory | |
| git add -p | Scegli interattivamente quali parti dei file mettere in staging (utile per commit parziali) | |
| git clone | Clona un repository in una nuova directory | |
| git clone -b branch_name URL | Clona solo il branch specificato (invece di quello predefinito) | |
| git clone --depth 1 URL | Clona solo l’ultimo commit, creando una copia shallow per risparmiare tempo e spazio | |
| git commit | Registra le modifiche nel repository | |
| git commit -m "Initial commit" | Esegui un commit con messaggio senza aprire l’editor | |
| git commit -a -m "Fix bugs" | Metti in staging e committa tutti i file modificati tracciati con un messaggio | |
| git commit --amend | Aggiorna l’ultimo commit (cambia messaggio o includi altre modifiche) | |
| git commit --fixup abc1234 | Crea un commit di tipo fixup da squashare automaticamente durante un rebase interattivo | |
| git config | Ottieni e imposta opzioni del repository o globali | |
| git config --global user.name "Name" | Imposta il nome utente Git globale | |
| git config --global user.email "email@example.com" | Imposta l’email Git globale | |
| git config --list | Elenca tutte le impostazioni Git (nome, email, editor, ecc.) | |
| git diff | Mostra le differenze tra commit, tra commit e working tree, ecc. | |
| git diff HEAD | Mostra cosa hai modificato dall’ultimo commit (modifiche non in staging) | |
| git diff --staged | Mostra cosa verrà incluso nel prossimo commit | |
| git diff --word-diff HEAD~1 | Mostra differenze a livello di parola | |
| git grep | Cerca all’interno dei file del repository | |
| git grep "functionName" | Trova tutte le occorrenze di  | |
| git grep -n "TODO" | Trova le righe contenenti  | |
| git grep -i "login" | Cerca la parola  | |
| git init | Crea un repository Git vuoto o reinizializza uno esistente | |
| git init my-project | Inizializza un nuovo repo nella directory my-project | |
| git init --bare | Inizializza un repository bare | |
| git log | Mostra i log dei commit | |
| git log --oneline | Mostra la cronologia dei commit in formato compatto a una riga | |
| git log --graph --all | Mostra tutti i branch in un grafico visivo dei commit | |
| git log -p --stat | Mostra patch e statistiche dei file modificati nei commit | |
| git reset | Rimuove file dallo staging mantenendo le modifiche nella working directory | |
| git reset HEAD file.txt | Rimuovi un file dallo staging (mantiene le modifiche) | |
| git reset --hard HEAD~1 | Torna indietro di un commit e cancella tutte le modifiche (irreversibile!) | |
| git reset --soft HEAD~1 | Annulla l’ultimo commit ma mantieni le modifiche pronte per un nuovo commit | |
| git reset --mixed HEAD~1 | Annulla un commit ma mantieni le modifiche non in staging nella working directory | |
| git show | Mostra vari tipi di oggetti | |
| git show <commit_hash> | Mostra modifiche e messaggio di un commit specifico | |
| git show HEAD~1 | Mostra il commit precedente a quello attuale | |
| git show --stat | Mostra un riepilogo delle modifiche ai file per l’ultimo commit | |
| git status | Mostra lo stato della working tree | |
| git status -s | Mostra lo stato in formato breve | |
| git status -b | Mostra branch corrente e stato dei file | 
🌿 Branching e Merge
| Comando | Esempio | Descrizione | 
|---|---|---|
| git branch | Crea, elenca o elimina branch | |
| git branch new-feature | Crea un nuovo branch chiamato  | |
| git branch -d old-feature | Elimina un branch locale chiamato  | |
| git checkout | Passa a un branch o ripristina file da un altro commit | |
| git checkout main | Passa al branch  | |
| git checkout -b new-branch | Crea e passa a un nuovo branch chiamato  | |
| git switch | Passa a branch (alternativa semplificata a checkout) | |
| git switch main | Passa al branch  | |
| git switch -c feature-x | Crea e passa a un nuovo branch chiamato  | |
| git switch new-feature | Passa a un branch esistente chiamato  | |
| git merge | Unisci modifiche da un altro branch in quello corrente | |
| git merge new-feature | Unisci il branch  | |
| git merge --no-ff new-feature | Crea sempre un commit di merge (anche se fast-forward è possibile) | |
| git merge --abort | Annulla il merge e ripristina le modifiche se ci sono conflitti | |
| git rebase | Sposta o riapplica commit su un nuovo commit base | |
| git rebase main | Riapplica i commit del tuo branch sopra il branch  | |
| git rebase -i HEAD~3 | Modifica interattivamente gli ultimi 3 commit | |
| git rebase --abort | Interrompi e annulla un rebase in corso | |
| git rebase -i --autosquash HEAD~5 | Squasha automaticamente commit segnati come fixup o squash durante un rebase interattivo | |
| git cherry-pick | Applica commit specifici da un altro branch | |
| git cherry-pick <hash> | Applica un commit specifico (per hash) al branch corrente | |
| git cherry-pick --continue | Continua cherry-pick dopo aver risolto conflitti | |
| git cherry-pick A^..B | Applica un intervallo di commit da  | 
📡 Repository remoti
| Comando | Esempio | Descrizione | 
|---|---|---|
| git remote | Gestisce i collegamenti a repository remoti (come GitHub) | |
| git remote -v | Mostra i nomi remoti e i relativi URL | |
| git remote add origin URL | Aggiungi un repository remoto chiamato  | |
| git pull | Scarica e unisce automaticamente modifiche da un branch remoto | |
| git pull origin main | Recupera e unisci modifiche dal branch remoto  | |
| git pull --rebase origin main | Recupera e rebase il tuo branch corrente sopra quello remoto invece di fare merge | |
| git push | Carica le tue modifiche locali in un repository remoto | |
| git push origin main | Push del tuo branch locale  | |
| git fetch | Scarica modifiche da remoto senza unirle | |
| git fetch origin | Recupera tutti gli aggiornamenti dal remoto  | |
| git fetch origin main | Recupera solo il branch  | |
| git fetch --all | Recupera aggiornamenti da tutti i remoti | |
| git fetch --prune | Pulisci branch eliminati — rimuovi riferimenti locali a branch eliminati sul remoto | |
| git fetch --dry-run | Mostra cosa verrebbe scaricato, senza effettivamente scaricare nulla | |
| git fetch origin +main | Aggiorna forzatamente il tuo branch di tracking locale ( | 
📦 Stash e Pulizia
| Comando | Esempio | Descrizione | 
|---|---|---|
| git stash | Salva temporaneamente modifiche non commitate (work in progress) | |
| git stash | Salva file modificati e in staging, poi ripristina la working directory all’ultimo commit | |
| git stash apply | Riapplica le ultime modifiche in stash (lo stash rimane salvato) | |
| git stash pop | Riapplica e rimuovi l’ultimo stash | |
| git stash list | Mostra l’elenco di tutte le modifiche in stash | |
| git stash branch feature-fix | Crea un nuovo branch e applica l’ultimo stash su di esso | |
| git clean | Elimina definitivamente file non tracciati (non in Git) | |
| git clean -f | Elimina i file non tracciati nella directory corrente | |
| git clean -fd | Elimina file e cartelle non tracciati | |
| git clean -n | Anteprima di cosa verrebbe eliminato (dry run sicuro) | 
🏷️ Tag
| Comando | Esempio | Descrizione | 
|---|---|---|
| git tag | Crea, elenca o elimina tag per segnare punti specifici nella cronologia (come release) | |
| git tag -a v1.0 -m "Version 1.0" | Crea un tag annotato chiamato  | |
| git tag -d v1.0 | Elimina il tag locale  | |
| git push | Carica commit, branch e tag dal locale al repository remoto | |
| git push origin --tags | Push di tutti i tag locali sul remoto (utile dopo aver creato più versioni) | |
| git push origin v1.0 | Push di un tag specifico (es.  | |
| git push origin :refs/tags/v1.0 | Elimina il tag remoto  | 
🛠️ Risoluzione dei conflitti
| Comando | Esempio | Descrizione | 
|---|---|---|
| git mergetool | Apre uno strumento visuale per aiutare a risolvere conflitti di merge | |
| git mergetool --tool=meld | Usa uno strumento di merge specifico (come Meld) per risolvere conflitti | |
| git rerere | Permette a Git di ricordare come hai risolto conflitti di merge in passato | |
| git config --global rerere.enabled true | Abilita il riutilizzo automatico delle risoluzioni di conflitti passati | |
| git rerere status | Mostra quali file hanno risoluzioni di conflitti salvate | |
| git rerere diff | Mostra quali modifiche Git ha salvato per uso futuro | 
⚙️ Comandi avanzati
| Comando | Esempio | Descrizione | 
|---|---|---|
| git bisect | Usa ricerca binaria per trovare il commit che ha introdotto un bug | |
| git bisect start | Avvia una ricerca binaria tra un commit buono e uno difettoso per localizzare il bug | |
| git bisect bad | Segna il commit corrente come “bad” (contiene il bug) | |
| git bisect good <commit> | Segna un commit “good” noto dove il bug non esisteva | |
| git blame | Mostra chi ha modificato per ultimo ogni riga di un file, con revisione e autore | |
| git blame file.txt | Mostra autore e info commit per ogni riga del file | |
| git blame -L 10,20 file.txt | Mostra info blame solo per le righe 10-20 | |
| git blame --show-email file.txt | Mostra anche gli indirizzi email degli autori insieme alle modifiche | |
| git reflog | Visualizza e gestisce il reference log (reflog) dei movimenti dei branch e di HEAD | |
| git reflog show main@{1.week.ago} | Vedi dove puntava il branch  | |
| git reflog expire --expire=30.days --dry-run | Anteprima delle voci di reflog più vecchie di 30 giorni che possono essere eliminate | |
| git reflog delete HEAD@{2} | Elimina una voce specifica di reflog (attenzione: può influire sul recupero) | |
| git submodule | Aggiunge, inizializza, aggiorna o ispeziona submodule (repository dentro repository) | |
| git submodule add URL path | Aggiungi un repository esterno come submodule nel percorso specificato | |
| git submodule update --init | Inizializza e scarica tutti i submodule elencati nel repository | |
| git submodule foreach git pull | Esegui  | |
| git submodule sync --recursive | Sincronizza gli URL dei submodule dopo modifiche nel file  | |
| git submodule update --remote --merge | Aggiorna i submodule all’ultimo commit dei loro branch remoti | |
| git archive | Crea un archivio (zip, tar, ecc.) dei file da un commit o branch specifico | |
| git archive --format=zip HEAD > archive.zip | Crea un archivio ZIP dei file del progetto al commit HEAD | |
| git archive -o release.tar.gz HEAD | Crea un archivio compresso  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | Crea un archivio compresso  | |
| git gc | Pulisce file non necessari e ottimizza il repository per le prestazioni | |
| git gc --aggressive | Esegui una pulizia e ottimizzazione approfondita (può essere lenta ma efficace) | |
| git gc --prune=now | Rimuovi subito tutti gli oggetti irraggiungibili (pericoloso se non sicuri) | |
| git shortlog | Riepilogo rapido di autori e loro commit | |
| git shortlog -e | Mostra un elenco di autori con i loro indirizzi email (es. per analizzare chi ha contribuito e quanto) | |
| git shortlog -s -n | Mostra quanti commit ha fatto ciascun autore, ordinati per numero di commit | |
| git shortlog -sne | Come sopra, ma include anche nomi e email — utile per tracciare attività in dettaglio | |
| git revert | Crea un nuovo commit che annulla le modifiche di un commit precedente senza riscrivere la cronologia | |
| git revert HEAD | Annulla l’ultimo commit creando un nuovo commit che ne ribalta le modifiche | |
| git revert <commit_hash> | Annulla un commit specifico per hash, aggiungendo in sicurezza un nuovo commit che lo ribalta | 
🐙 GitHub CLI
ghti permette di gestire GitHub dal terminale.
| Comando | Esempio | Descrizione | 
|---|---|---|
| gh auth login | Autenticati con un host GitHub per consentire ai comandi CLI di interagire con il tuo account | |
| gh auth login --with-token < mytoken.txt | Autenticati usando un personal access token salvato in un file ( | |
| gh auth login --hostname enterprise.internal | Autenticati a un server GitHub Enterprise (non github.com) | |
| gh repo clone | Clona un repository GitHub sulla tua macchina locale | |
| gh repo clone user/repo | Clona il repository repo di proprietà di  | |
| gh repo clone cli/cli -- --depth=1 | Clona il repository ma scarica solo l’ultimo commit per un clone più veloce e leggero | |
| gh repo clone cli/cli workspace/cli | Clona il repository in una cartella personalizzata  | |
| gh issue list | Elenca le issue in un repository GitHub, opzionalmente filtrate per vari criteri | |
| gh issue list --assignee "@me" | Elenca le issue assegnate a te | |
| gh issue list --state all | Elenca le issue indipendentemente dallo stato (aperte o chiuse) | |
| gh issue list --search "error no:assignee sort:created-asc" | Elenca le issue che corrispondono a “error”, non assegnate, ordinate per data di creazione crescente | |
| gh pr create | Crea una pull request su GitHub tramite CLI | |
| gh pr create --title "..." | Crea una pull request con il titolo indicato | |
| gh pr create --project "Roadmap" | Collega la pull request a un progetto GitHub chiamato “Roadmap” | |
| gh pr create --base develop --head monalisa:feature | Crea una PR dal branch  | |
| gh repo create | Crea un nuovo repository GitHub dalla CLI | |
| gh repo create my-project | Crea un nuovo repository chiamato  | |
| gh repo create my-project --public --clone | Crea un repository pubblico e clonalo localmente | |
| gh repo create my-project --private --source=. --remote=upstream | Crea un repository remoto privato dalla cartella corrente e aggiungi un remoto chiamato  | 
💡 Alias Git (Scorciatoie utili)
Imposta alias pratici per velocizzare i comandi Git più comuni:
git config --global alias.br branch                                       # scorciatoia per: git branch
git config --global alias.ci commit                                       # scorciatoia per: git commit
git config --global alias.co checkout                                     # scorciatoia per: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # grafico della cronologia leggibile
git config --global alias.last "log -1 HEAD"                              # mostra l’ultimo commit
git config --global alias.st status                                       # scorciatoia per: git status🚀 Comandi Git Avanzati per Professionisti
| Comando | Esempio | Descrizione | 
|---|---|---|
| git filter-repo | Uno strumento potente e performante per riscrivere la cronologia Git per rimuovere o modificare file, autori o percorsi; sostituisce git filter-branch con maggiore velocità e sicurezza | |
| git filter-repo --path secret.txt --invert-paths | Riscrivi in modo efficiente la cronologia del repository per rimuovere file o directory sensibili senza i problemi di performance di  | |
| git filter-repo --replace-text replacements.txt | Sostituisci stringhe o pattern in massa in tutta la cronologia (es. sanificare credenziali) | |
| git filter-repo --subdirectory-filter src | Estrai la cronologia di una sottodirectory in un nuovo repository, preservando i metadati dei commit | |
| git worktree | Gestisci più directory di lavoro collegate a un singolo repository, consentendo lavoro parallelo su branch diversi senza clonare | |
| git worktree add ../feature feature-branch | Crea una directory di lavoro aggiuntiva collegata allo stesso repository, permettendo checkout paralleli di branch senza clonare | |
| git worktree list | Elenca tutte le worktree attive, i loro percorsi e i branch associati | |
| git worktree remove ../feature | Rimuovi una worktree collegata quando non serve più, ripulendo in sicurezza le directory di lavoro | |
| git replace | Crea riferimenti temporanei che sostituiscono oggetti esistenti, consentendo manipolazioni locali non distruttive della cronologia per test | |
| git replace <old_commit> <new_commit> | Scambia temporaneamente un commit con un altro nel tuo repo locale, utile per testare o correggere la cronologia senza riscriverla | |
| git replace --list | Mostra tutti i riferimenti di sostituzione attivi | |
| git replace -d <replace_ref> | Elimina un riferimento di sostituzione specifico per ripristinare il comportamento | |
| git stash | Salva temporaneamente modifiche non commitate in uno stack, permettendo di cambiare contesto senza fare commit di lavoro incompleto | |
| git stash push -p | Seleziona interattivamente blocchi di modifiche da mettere in stash, con controllo granulare su cosa salvare | |
| git stash push -m "WIP selective stash" | Crea uno stash con un messaggio personalizzato per identificarlo facilmente | |
| git stash apply stash@{2} | Applica uno stash specifico dall’elenco senza rimuoverlo | |
| git rebase | Riapplica commit su un altro base tip, facilitando una cronologia più pulita, lineare e modificabile in modo interattivo | |
| git rebase --interactive --autosquash | Avvia una sessione di rebase interattivo che riordina e squash automaticamente i commit marcati come fixup o squash, semplificando la pulizia della cronologia | |
| git rebase -i --autosquash HEAD~10 | Riordina e squash automaticamente i commit marcati come fixup o squash, pulendo la cronologia prima del push | |
| git commit --fixup <commit> | Crea un commit di tipo fixup che verrà autosquashato durante il rebase interattivo | |
| git commit --squash <commit> | Crea un commit di tipo squash da combinare con un commit specifico durante il rebase | |
| git bisect | Strumento di ricerca binaria per identificare in modo efficiente il commit che ha introdotto un bug testando commit successivi e restringendo il problema | |
| git bisect run | Automatizza il processo di bisect eseguendo uno script di test su ciascun commit per identificare rapidamente il commit difettoso senza intervento manuale | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | Automatizza il bisect eseguendo uno script di test su ciascun commit, velocizzando notevolmente l’identificazione del bug | |
| git bisect visualize | Apri uno strumento grafico per visualizzare il processo di bisect | |
| git bisect reset | Esci dalla modalità bisect e torna all’HEAD originale | |
| git commit | Registra modifiche nel repository con opzioni dettagliate per amend, firma, fixup e personalizzazione dei messaggi, mantenendo una cronologia di alta qualità | |
| git commit --gpg-sign | Crea un commit firmato con la tua chiave GPG per garantire la verifica crittografica di autenticità e autore | |
| git commit -S -m "Signed commit" | Firma crittograficamente i tuoi commit con la chiave GPG, garantendo integrità e autenticità | |
| git config --global user.signingkey <key_id> | Configura globalmente la chiave GPG usata per firmare i commit | |
| git log --show-signature | Verifica e mostra le informazioni della firma GPG dei commit | |
| git reflog | Mantiene un log degli aggiornamenti di HEAD e dei branch, essenziale per recuperare commit persi e comprendere i movimenti locali della cronologia | |
| git reset --hard HEAD@{3} | Resetta il branch corrente a uno stato precedente dal reflog per recuperare o annullare modifiche | |
| git reflog expire --expire=now --all | Scade immediatamente tutte le voci del reflog, ripulendo la cronologia (usare con cautela) | 
🧰 Suggerimenti e Automazione per Workflow Professionale
| Argomento | Comandi / Esempio | Spiegazione e Suggerimenti Pro | 
|---|---|---|
| Pulizia Aggressiva del Repository | git gc --aggressive --prune=now | Esegue una garbage collection profonda e rimuove subito gli oggetti irraggiungibili per ottimizzare il repository. Usare durante finestre di manutenzione | 
| Worktree Parallele dei Branch | git worktree add ../feature-branch feature | Mantieni più directory di lavoro per sviluppare funzionalità simultanee, evitando l’overhead del clone | 
| Cronologia Pulita e Lineare | git rebase -i --autosquash | Prima del push, usa rebase interattivo con autosquash per mantenere una cronologia pulita e leggibile | 
| Commit Sicuri | git commit -S | Firma i commit con GPG per aumentare l’affidabilità nei repository condivisi, obbligatorio in molti ambienti enterprise | 
| Bisect Automatizzato | git bisect run ./test-script.sh | Automatizza la ricerca dei bug eseguendo uno script di test su ciascun commit candidato durante il bisect | 
| Cache Risoluzione Conflitti | git config --global rerere.enabled true | Abilita il riutilizzo delle risoluzioni dei conflitti per velocizzare la gestione di conflitti ricorrenti in rebase o merge | 
| Alias e Hook Condivisi | Archivia alias Git comuni e hook di commit in un repository condiviso o pipeline CI per applicare standard di team e aumentare la produttività | 
Risorse aggiuntive
🧠 Suggerimento
Non cercare di memorizzare tutto. Usa --help, esplora e pratica regolarmente:
git help <command>
git status🌐 Link utili
📘 Documentazione ufficiale di Git — manuale dettagliato di tutti i comandi Git:
https://git-scm.com/docs
📙 Learn Git Branching — tutorial visivo interattivo per padroneggiare i concetti di branching:
https://learngitbranching.js.org
📕 Pro Git book (gratuito, di Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Git Cheatsheet (riferimento conciso ufficiale):
https://education.github.com/git-cheat-sheet-education.pdf