🐙 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