Git — Guida ai fondamentali

Una guida pratica ai comandi e concetti essenziali di Git, dal setup quotidiano alla gestione degli errori.


Il modello a tre aree

Git organizza le modifiche in tre zone distinte:

Working directory  →  Staging area  →  Repository  →  Remote
                    (git add)         (git commit)   (git push)

Quattro termini fondamentali da tenere a mente:


Setup iniziale

Configurazione dell'identità globale (una volta sola):

git config --global user.name "Il Tuo Nome"
git config --global user.email "email@example.com"
git config --global core.editor nano
git config --list   # verifica

Inizializzare o clonare un repository:

git init mio-progetto        # crea cartella + .git
git clone https://github.com/user/repo.git
git clone https://github.com/user/repo.git nome-locale

Il file .gitignore nella root del progetto elenca file e cartelle che Git deve ignorare (es. node_modules/, *.log, .env).


Workflow quotidiano

Controllare lo stato del repository:

git status                   # file modificati, staged, untracked
git diff                     # diff working dir → staging
git diff --staged            # diff staging → ultimo commit

Aggiungere file allo staging e committare:

git add file.txt             # singolo file
git add src/                 # intera cartella
git add -p                   # scegli blocchi interattivamente (patch mode)
git commit -m "feat: aggiunta analisi SPM"
git commit -am "fix: corretto path"   # add + commit per file già tracciati

Consultare la storia dei commit:

git log --oneline --graph
git log -5                   # ultimi 5 commit
git show abc1234             # dettaglio di un commit specifico

Branch & merge

Gestire i branch:

git branch                   # elenca branch locali
git branch feature-doppler   # crea branch
git switch feature-doppler   # passa al branch
git switch -c fix-spm        # crea e passa in un solo comando
git branch -d feature-doppler  # elimina branch

Integrare le modifiche:

git switch main
git merge feature-doppler    # integra branch in main
git rebase main              # sposta i commits su main (storia lineare)

Quando due branch modificano la stessa riga si crea un conflitto di merge. Git marca il file con <<<<<<< / ======= / >>>>>>>. Risolvi manualmente, poi git add + git commit.

Mettere da parte modifiche temporanee con stash:

git stash                    # salva working directory
git stash pop                # ripristina
git stash list               # elenca stash salvati

Remote & GitHub

Gestire i remote:

git remote -v                # elenca remote configurati
git remote add origin https://github.com/user/repo.git
git remote rename origin upstream

Sincronizzare con il remote:

git push origin main         # invia commits
git push -u origin feature-x # push + traccia il branch remoto
git fetch origin             # scarica senza merge
git pull                     # fetch + merge
git pull --rebase            # fetch + rebase (storia lineare)

Fork workflow su GitHub: fork → clone → branch → commit → push → pull request. Per tenere sincronizzato il fork: git fetch upstream && git rebase upstream/main.


Annullare errori

Prima del commit:

git restore file.txt         # scarta modifiche nel working dir
git restore --staged file.txt  # rimuovi dallo staging
git clean -fd                # elimina file untracked

Modificare l'ultimo commit (solo se non ancora pushato):

git commit --amend -m "messaggio corretto"

Annullare un commit già pubblico in modo sicuro:

git revert abc1234           # crea un commit inverso

Spostare HEAD indietro con reset (attenzione):

git reset --soft HEAD~1      # torna di 1 commit, modifiche restano staged
git reset --mixed HEAD~1     # torna di 1 commit, modifiche nel working dir
git reset --hard HEAD~1      # ⚠ elimina definitivamente le modifiche

Regola d'oro: non riscrivere la storia di commit già pushati su un remote condiviso. Usa git revert per annullare in modo sicuro.


git add -p — staging interattivo

La modalità patch mostra il diff a pezzi (hunk) e chiede cosa fare con ciascuno:

Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]?
Tasto Azione
y aggiungi questo hunk allo staging
n salta, non aggiungerlo
q esci, non aggiungere questo né i successivi
a aggiungi questo e tutti i successivi del file
d salta questo e tutti i successivi del file
s dividi l'hunk in parti più piccole
e modifica manualmente le righe da includere
? mostra l'help

Utile con i notebook .ipynb: permette di includere solo le modifiche al codice sorgente, saltando i metadata di esecuzione (execution_count, outputs).


Cheatsheet

# Setup
git init / git clone <url>
git config --global user.name "Nome"

# Stato
git status
git diff / git diff --staged
git log --oneline --graph --all

# Staging & commit
git add -p / git add .
git commit -m "messaggio"

# Branch
git switch -c <nome>
git merge <branch>
git rebase <branch>

# Remote
git push / git pull / git fetch
git remote -v

# Undo
git restore <file>
git revert <hash>
git reset --soft/mixed/hard HEAD~N

# Varie
git stash / git stash pop
git tag v1.0
git cherry-pick <hash>

Alias consigliato da aggiungere alla configurazione globale:

git config --global alias.lg "log --oneline --graph --all --decorate"

Guida ai fondamentali di Git — versione per uso quotidiano in sviluppo e ricerca.