Version Control

Git Setup

Guida completa per impostare Git - dalla configurazione al primo commit

Cos'è Git?

Git è un sistema di controllo versione distribuito che ti permette di:

  • 📝 Tracciare le modifiche al codice nel tempo
  • 🔄 Collaborare con altri sviluppatori
  • ↩️ Tornare a versioni precedenti del progetto
  • 🌿 Lavorare su più feature in parallelo (branches)

Git è lo standard de facto nello sviluppo software moderno, utilizzato da milioni di sviluppatori e aziende in tutto il mondo.


Perché Usare Git?

ℹ️ Vantaggi principali

  • Backup automatico: Ogni commit è un punto di ripristino
  • Collaborazione: Lavora in team senza conflitti
  • Sperimentazione sicura: Testa nuove idee senza rischi
  • Storia completa: Chi ha fatto cosa e quando

Installazione Git

macOS

# Tramite Homebrew (consigliato)
brew install git

# Verifica installazione
git --version

Windows

Scarica Git da git-scm.com e segui l'installer.

# Verifica installazione da Git Bash
git --version

Linux (Ubuntu/Debian)

sudo apt update
sudo apt install git

# Verifica installazione
git --version

Configurazione Iniziale

Prima di iniziare, configura il tuo nome e email (visibili nei commit):

# Imposta nome (globale per tutti i progetti)
git config --global user.name "Il Tuo Nome"

# Imposta email
git config --global user.email "tua.email@esempio.com"

# Editor di default (opzionale)
git config --global core.editor "code --wait"  # VS Code

# Verifica configurazione
git config --list

⚠️ Email pubblica

L'email sarà visibile nella cronologia Git. Se usi GitHub, puoi utilizzare l'email no-reply: username@users.noreply.github.com


Creare il Primo Repository

Opzione 1: Nuovo Progetto

# Crea cartella progetto
mkdir mio-progetto
cd mio-progetto

# Inizializza repository Git
git init

# Output: Initialized empty Git repository in /percorso/mio-progetto/.git/

Opzione 2: Progetto Esistente

# Naviga nella cartella del progetto
cd /percorso/progetto-esistente

# Inizializza Git
git init

Anatomia di un Commit

Un commit è uno snapshot del tuo progetto in un momento specifico. È composto da:

  1. Modifiche ai file (cosa è cambiato)
  2. Messaggio descrittivo (perché è cambiato)
  3. Metadata (chi, quando, parent commit)
  4. Hash univoco (identificatore SHA-1)

Workflow: Dal File al Commit

Git utilizza tre "aree" principali:

Working Directory → Staging Area → Repository
  (modifica)          (git add)     (git commit)

1. Working Directory

Cartella con i tuoi file di lavoro.

2. Staging Area (Index)

Area intermedia dove "prepari" i file per il commit.

3. Repository (.git)

Database con tutta la storia dei commit.


Il Tuo Primo Commit - Passo per Passo

Step 1: Crea un File

# Crea file README
echo "# Mio Primo Progetto Git" > README.md

# Verifica contenuto
cat README.md

Step 2: Controlla lo Status

git status

Output:

On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        README.md

nothing added to commit but untracked files present

ℹ️ Cosa significa?

  • Untracked: Git vede il file ma non lo sta ancora tracciando
  • Suggerimento: Usa git add per iniziare a tracciarlo

Step 3: Aggiungi File alla Staging Area

# Aggiungi singolo file
git add README.md

# OPPURE aggiungi tutti i file
git add .

# Verifica status
git status

Output:

On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README.md

Step 4: Crea il Commit

git commit -m "feat: add README with project description"

Output:

[main (root-commit) a1b2c3d] feat: add README with project description
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

✅ Congratulazioni! 🎉

Hai appena creato il tuo primo commit Git! Il codice a1b2c3d è l'hash univoco del tuo commit.


Anatomia di un Buon Commit Message

Formato Conventional Commits

<tipo>(<scope>): <descrizione breve>

[corpo opzionale]

[footer opzionale]

Tipi Comuni

TipoSignificatoEsempio
featNuova featurefeat: add user authentication
fixBug fixfix: resolve login timeout issue
docsDocumentazionedocs: update API reference
styleFormattazionestyle: format code with prettier
refactorRefactoringrefactor: simplify user validation
testTesttest: add unit tests for auth
choreMaintenancechore: update dependencies

Best Practices

✅ DO:

git commit -m "fix: resolve null pointer in user profile"
git commit -m "feat: add dark mode toggle to settings"
git commit -m "docs: update installation guide for Windows"

❌ DON'T:

git commit -m "fix stuff"
git commit -m "update"
git commit -m "asdfghjkl"
git commit -m "work in progress"

💡 Regola d'oro

Scrivi commit message che completino la frase: "Se applicato, questo commit..."

Esempio: "Se applicato, questo commit aggiungerà il toggle dark mode"


Comandi Essenziali

Visualizzare la Storia

# Log completo
git log

# Log compatto (una riga per commit)
git log --oneline

# Log con grafico branches
git log --oneline --graph --all

# Ultimi 5 commit
git log -5

Vedere le Modifiche

# Differenze working directory vs staging
git diff

# Differenze staging vs ultimo commit
git diff --staged

# Differenze con commit specifico
git diff a1b2c3d

Controllare lo Stato

# Status dettagliato
git status

# Status compatto
git status -s

Workflow Completo - Esempio Pratico

Simuliamo lo sviluppo di una piccola feature:

# 1. Crea file index.html
echo "<!DOCTYPE html><html><body><h1>Hello World</h1></body></html>" > index.html

# 2. Controlla status
git status
# Output: index.html è untracked

# 3. Aggiungi a staging
git add index.html

# 4. Commit
git commit -m "feat: create homepage with Hello World"

# 5. Modifica file
echo "<p>Welcome to my website</p>" >> index.html

# 6. Vedi cosa è cambiato
git diff
# Output: mostra la riga aggiunta

# 7. Staging + Commit in un comando (solo file già tracciati)
git commit -am "feat: add welcome message to homepage"

# 8. Visualizza cronologia
git log --oneline

Output cronologia:

b3c4d5e feat: add welcome message to homepage
a1b2c3d feat: create homepage with Hello World

File .gitignore

Alcuni file non dovrebbero essere tracciati (es. password, file temporanei, dipendenze).

Crea .gitignore

# Crea file
touch .gitignore

Esempio .gitignore per Node.js

# Dependencies
node_modules/

# Environment variables
.env
.env.local

# Build output
dist/
build/

# IDE
.vscode/
.idea/

# OS
.DS_Store
Thumbs.db

# Logs
*.log
npm-debug.log*

Aggiungi al Repository

git add .gitignore
git commit -m "chore: add gitignore for Node.js project"

Cosa Fare se Sbagli

Modificare l'Ultimo Commit

# Hai dimenticato un file?
git add file-dimenticato.txt
git commit --amend --no-edit

# Vuoi cambiare il messaggio?
git commit --amend -m "feat: nuovo messaggio corretto"

⚠️ Attenzione

--amend riscrive la storia! Usalo solo se non hai ancora fatto push.

Togliere File dalla Staging

# Unstage singolo file
git restore --staged file.txt

# Unstage tutto
git restore --staged .

Scartare Modifiche Locali

# Scarta modifiche a singolo file
git restore file.txt

# Scarta tutte le modifiche (ATTENZIONE: irreversibile!)
git restore .

Prossimi Passi

Ora che hai padroneggiato il commit, ecco cosa imparare dopo:

  1. Branches - Lavorare su feature isolate
  2. Merge - Unire modifiche da branch diversi
  3. Remote - Collegare GitHub/GitLab
  4. Pull/Push - Sincronizzare con repository remoto
  5. Collaboration - Pull requests e code review

Risorse Utili

Documentazione Ufficiale

Tools Visivi

Cheat Sheets

Esercizi Interattivi


Conclusione

Hai imparato:

  • ✅ Cos'è Git e perché usarlo
  • ✅ Installare e configurare Git
  • ✅ Creare repository e commit
  • ✅ Workflow: working directory → staging → commit
  • ✅ Best practices per commit messages
  • ✅ Comandi essenziali (status, log, diff)
  • ✅ Gestire .gitignore
  • ✅ Correggere errori comuni

Git può sembrare complesso all'inizio, ma con la pratica diventerà naturale. Commita spesso, commita presto!


✅ Challenge

Esercizio pratico: Crea un repository Git, scrivi 5 file diversi (HTML, CSS, JS) e fai un commit per ogni file con un messaggio appropriato. Poi usa git log --oneline --graph per visualizzare la cronologia!