🐙 Git e GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
Data di Pubblicazione

31 agosto 2025

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 functionName in tutti i file del progetto

git grep -n "TODO"

Trova le righe contenenti TODO e mostra i numeri di riga (utile per note nel codice)

git grep -i "login"

Cerca la parola login senza distinzione di maiuscole/minuscole

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 new-feature

git branch -d old-feature

Elimina un branch locale chiamato old-feature

git checkout Passa a un branch o ripristina file da un altro commit
git checkout main

Passa al branch main

git checkout -b new-branch

Crea e passa a un nuovo branch chiamato new-branch

git switch Passa a branch (alternativa semplificata a checkout)
git switch main

Passa al branch main

git switch -c feature-x

Crea e passa a un nuovo branch chiamato feature-x

git switch new-feature

Passa a un branch esistente chiamato new-feature

git merge Unisci modifiche da un altro branch in quello corrente
git merge new-feature

Unisci il branch new-feature nel branch corrente

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 main

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 A (escluso) a B (incluso)

📡 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 origin

git pull Scarica e unisce automaticamente modifiche da un branch remoto
git pull origin main

Recupera e unisci modifiche dal branch remoto main nel tuo branch corrente

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 main sul remoto origin

git fetch Scarica modifiche da remoto senza unirle
git fetch origin

Recupera tutti gli aggiornamenti dal remoto origin, senza applicarli

git fetch origin main

Recupera solo il branch main dal remoto

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 (origin/main), sovrascrivendo conflitti

📦 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 v1.0 con messaggio (salvato come oggetto Git completo, utile per release)

git tag -d v1.0

Elimina il tag locale v1.0 (non influisce sul remoto)

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. v1.0) sul repository remoto

git push origin :refs/tags/v1.0

Elimina il tag remoto v1.0 (nota la sintassi con i due punti)

🛠️ 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 main una settimana fa

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 pull dentro ogni submodule per aggiornarli all’ultimo commit

git submodule sync --recursive

Sincronizza gli URL dei submodule dopo modifiche nel file .gitmodules

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 .tar.gz dall’attuale HEAD

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

Crea un archivio compresso .tar.gz del progetto corrente, con tutti i file dentro una cartella project/ nell’archivio

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

gh ti 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 (mytoken.txt)

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 user in una cartella chiamata repo

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 workspace/cli

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 feature nel fork monalisa verso il branch develop

gh repo create Crea un nuovo repository GitHub dalla CLI
gh repo create my-project

Crea un nuovo repository chiamato my-project su GitHub (segue prompt interattivo)

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 upstream

💡 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-branch. Usare con cautela

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