Lezione 22 di 35

Git 22

🔀 Git & GitHub · Modulo 4 · Lezione 22

Milestone e release 🏷️

Raggruppare issue in obiettivi · Tag · Semantic versioning · Creare release · Distribuire il progetto

⏱️ Durata stimata: 60–75 min 📊 Livello: Intermedio-Avanzato (Modulo 4) 🔧 Strumenti: Browser (github.com) · Terminale 📋 Prerequisiti: Lezioni 16, 21 (issue, Projects)

🏷️ Le issue dicono “cosa fare”. Le milestone dicono “per quando”. Una milestone è un obiettivo del progetto con una scadenza: “Versione 1.0 — consegna 15 aprile”. Raggruppa le issue che devono essere completate per raggiungere quell’obiettivo e mostra una barra di progresso. Quando tutte le issue sono chiuse, crei una release — un pacchetto scaricabile con il codice in uno stato preciso. È il modo professionale di dire “ecco, questa versione è finita”.

🎯 Obiettivi della lezione

  • Capire cosa sono le milestone e a cosa servono
  • Creare una milestone con scadenza e associarvi le issue
  • Capire i tag Git e come funzionano
  • Conoscere il Semantic Versioning (SemVer)
  • Creare una release su GitHub
  • Scrivere delle release notes efficaci

📖 1. Teoria

1.1 — Milestone: raggruppare le issue per obiettivo

Una milestone è un contenitore che raggruppa issue e PR sotto un obiettivo comune — tipicamente una versione del progetto o una scadenza. Ogni issue può appartenere a una sola milestone.

Milestone: la vista dall’alto del progetto
v1.0 — MVP
Scadenza: 15 aprile
6 di 8 issue chiuse (75%)
✅ #1 Setup progetto · ✅ #2 Homepage · ✅ #3 Navbar
✅ #4 Contatti · ✅ #5 Footer · ✅ #6 README
🔵 #7 Dark mode (in progress) · ⚪ #8 Responsive
v1.1 — Miglioramenti
Scadenza: 30 maggio
1 di 5 issue chiuse (20%)
✅ #9 Animazioni CSS
⚪ #10 Gallery · ⚪ #11 Blog · ⚪ #12 SEO
⚪ #13 Performance
📊
Barra di progresso
Vedi immediatamente a che punto sei: 6/8, 75%. Mancano 2 issue alla consegna.
📅
Scadenza
La milestone ha una data di scadenza. GitHub ti avverte se sei in ritardo.
🎯
Focus
Il team sa esattamente cosa serve per la prossima versione. Niente dispersione.

1.2 — Creare una milestone

PASSO 1
Nel repository → tab “Issues” → “Milestones” (accanto al bottone “New issue”).
PASSO 2
Clicca “New milestone”.
PASSO 3
Title: il nome della milestone (es. “v1.0 — MVP”, “Consegna marzo”, “Sprint 1”).
PASSO 4
Due date: la data di scadenza (opzionale ma consigliata).
PASSO 5
Description: cosa deve essere completato per raggiungere questo obiettivo (2-3 frasi).
PASSO 6
Clicca “Create milestone”. Poi associa le issue: apri ogni issue → sidebar → “Milestone” → seleziona.

1.3 — Tag Git: segnare un punto nella storia

Un tag è un’etichetta permanente che assegni a un commit specifico. A differenza dei branch (che si spostano), un tag è fisso — punta sempre allo stesso commit. Si usa per marcare le versioni del progetto: “questo commit è la v1.0”.

# Creare un tag leggero (solo un nome)
$ git tag v1.0

# Creare un tag annotato (consigliato — con messaggio e metadati)
$ git tag -a v1.0 -m “Versione 1.0: MVP con homepage, contatti e footer”

# Vedere tutti i tag
$ git tag
v0.1
v1.0

# Vedere i dettagli di un tag
$ git show v1.0
tag v1.0
Tagger: Mario Rossi <mario@email.it>
Date: …
Versione 1.0: MVP con homepage, contatti e footer

# Pushare i tag su GitHub (non vengono pushati automaticamente!)
$ git push origin v1.0 ← push di un tag specifico
$ git push origin –tags ← push di TUTTI i tag
Tag leggero vs tag annotato
Tag leggero Tag annotato ⭐
Comando git tag v1.0 git tag -a v1.0 -m “msg”
Messaggio No Sì — describe il contenuto della versione
Autore e data No Sì — chi ha creato il tag e quando
Quando usarlo Marker temporanei e locali Versioni ufficiali del progetto

⚠️ I tag non vengono pushati automaticamente! Quando fai git push, Git invia solo i commit — i tag restano locali. Devi pushare esplicitamente i tag con git push origin v1.0 o git push origin --tags. È un errore comune che confonde i principianti: “ho creato il tag ma non appare su GitHub” — perché non l’hai pushato.

1.4 — Semantic Versioning (SemVer)

Come numeri le versioni? Non a caso — esiste uno standard chiamato Semantic Versioning che quasi tutti i progetti software seguono. Il formato è MAJOR.MINOR.PATCH.

v2.4.1
2 = MAJOR
Cambiamento incompatibile. Chi aggiorna potrebbe dover modificare il suo codice.
4 = MINOR
Nuova funzionalità compatibile. Chi aggiorna non deve cambiare nulla.
1 = PATCH
Bugfix. Nessuna nuova funzionalità, solo correzioni.
Da A Cosa è successo Tipo
v1.0.0 v1.0.1 Corretto un bug nella validazione del form PATCH
v1.0.1 v1.1.0 Aggiunta pagina gallery e dark mode MINOR
v1.1.0 v1.2.0 Aggiunto blog e sistema di commenti MINOR
v1.2.0 v2.0.0 Riscritto tutto il frontend con React (incompatibile) MAJOR

📌 Per un progetto scolastico: inizia con v0.1.0 (il prefisso 0 indica “non ancora stabile”), poi v0.2.0, v0.3.0 per ogni consegna intermedia. La versione v1.0.0 è la consegna finale — il progetto è “completo”. Dopo, eventuali fix sono v1.0.1, v1.0.2 e così via.

1.5 — Creare una release su GitHub

Una release è una funzionalità di GitHub che collega un tag a una pagina pubblica con release notes, file scaricabili e un archivio del codice sorgente. È il modo ufficiale di distribuire una versione del progetto.

PASSO 1
Nel repository → sidebar destra → “Releases” → “Create a new release” (o “Draft a new release”).
PASSO 2
“Choose a tag”: seleziona un tag esistente (se l’hai già creato da terminale) oppure scrivi il nome di un nuovo tag (es. v1.0.0) e GitHub lo creerà.
PASSO 3
“Release title”: il nome della release (es. “v1.0.0 — MVP”).
PASSO 4
“Describe this release”: scrivi le release notes (cosa c’è di nuovo, cosa è stato corretto). Puoi cliccare “Generate release notes” per generarle automaticamente dalle PR integrate.
PASSO 5
Opzionale: allega file scaricabili (binari, archivi, documentazione PDF).
PASSO 6
Clicca “Publish release”. La release è pubblica e appare nella sidebar del repository.

📌 “Generate release notes” è magico. Clicca questo pulsante e GitHub genera automaticamente le note dalla lista delle PR integrate dal tag precedente. Ogni PR diventa un punto nella lista, con link e autore. È il modo più veloce per avere release notes complete senza scriverle a mano.

1.6 — Scrivere buone release notes

## Cosa c’è di nuovo

### ✨ Nuove funzionalità
– Aggiunta pagina contatti con form di validazione (#3)
– Aggiunto footer responsive con link social (#8)
– Implementata dark mode con toggle (#7)

### 🐛 Bug risolti
– Corretto bug del menu mobile che non si chiudeva (#5)
– Corretta validazione email che accettava indirizzi invalidi (#4)

### 📖 Documentazione
– Aggiornato README con istruzioni di installazione (#6)

### 👥 Contributori
– @marco-rossi
– @giulia-bianchi
– @luca-verdi

1.7 — Il flusso completo: milestone → tag → release

1. MILESTONE
Crea milestone “v1.0”
Associa le issue
Lavora fino al 100%
2. CHIUDI
Tutte le issue chiuse
Milestone al 100%
Chiudi la milestone
3. TAG
git tag -a v1.0.0
-m “MVP completo”
git push origin v1.0.0
4. RELEASE
Su GitHub: Releases
→ New release → v1.0.0
→ Release notes → Publish

💻 2. Esempi guidati

Esempio A — Creare milestone e associare issue

1
Repository → Issues → Milestones → New milestone.
2
Title: “v1.0.0 — MVP”. Due date: 15 aprile 2026. Description: “Prima versione completa del sito con homepage, contatti, about e footer responsive.”
3
Create milestone. Ora apri ogni issue che fa parte del MVP → sidebar → Milestone → seleziona “v1.0.0 — MVP”.
4
Vai su Issues → Milestones: vedi la barra di progresso. Man mano che chiudi issue, la barra avanza.

Esempio B — Creare tag e release

# Tutte le issue della milestone v1.0 sono chiuse.
# Main ha tutti i merge. È il momento di taggare.

$ git switch main
$ git pull ← assicurati di avere l’ultima versione

# Crea il tag annotato
$ git tag -a v1.0.0 -m “v1.0.0: MVP con home, contatti, about e footer”

# Pusha il tag su GitHub
$ git push origin v1.0.0
* [new tag] v1.0.0 -> v1.0.0

# Verifica
$ git tag
v1.0.0
Poi su GitHub: crea la release
1
Repository → sidebar → Releases → “Draft a new release”.
2
“Choose a tag” → seleziona v1.0.0 (appena pushato).
3
Title: “v1.0.0 — MVP”. Clicca “Generate release notes” per auto-generare la lista delle PR.
4
Modifica le note se serve (aggiungi sezioni, ringrazia i compagni). Clicca “Publish release”.
Ora chiunque visiti il repository vede la release nella sidebar. Può scaricare il codice sorgente come .zip o .tar.gz direttamente dalla pagina della release.

🏋️ 3. Esercizi

🟢 Esercizio 1 — Crea la tua prima milestone (Facile)

a) Nel tuo repository, crea una milestone “v1.0.0 — MVP” con una scadenza tra 2 settimane.
b) Associa almeno 3 issue alla milestone.
c) Vai su Issues → Milestones: vedi la barra di progresso?
d) Chiudi 1 delle 3 issue. La barra avanza?
e) Filtra le issue per milestone: nella tab Issues, clicca “Milestone” → seleziona la tua.

🔵 Esercizio 2 — Tag e release (Medio)

a) Assicurati che main sia aggiornato: git pull.
b) Crea un tag annotato: git tag -a v0.1.0 -m "Prima versione di test".
c) Pusha il tag: git push origin v0.1.0.
d) Vai su GitHub → Releases → “Draft a new release” → seleziona il tag v0.1.0.
e) Clicca “Generate release notes”. Cosa appare?
f) Pubblica la release. Verifica che sia visibile nella sidebar del repository.

🟠 Esercizio 3 — Semantic Versioning in pratica (Medio)

Per ciascuno di questi scenari, indica quale numero di versione usaresti (partendo da v1.0.0):

a) Corretto un bug: il form non inviava su Safari. → v???
b) Aggiunta una nuova pagina “Gallery” al sito. → v???
c) Riscritto il CSS da zero usando Tailwind (rompe la compatibilità con i temi precedenti). → v???
d) Corretti 3 typo nel testo della home. → v???
e) Aggiunti dark mode e sistema di notifiche. → v???
f) Crea i tag corrispondenti nel tuo repository e pushali tutti con git push origin --tags.

🟣 Esercizio 4 — Ciclo completo: milestone → lavoro → release (Difficile)

Simula un intero ciclo di rilascio:

a) Crea milestone “v0.1.0 — Prototipo” con scadenza tra 1 settimana.
b) Crea 4 issue e associale alla milestone.
c) Per ogni issue: crea un branch, lavora, committa con closes #N, apri PR, merge.
d) Verifica che la milestone raggiunga il 100%.
e) Chiudi la milestone su GitHub (Issues → Milestones → “Close”).
f) Da terminale: git tag -a v0.1.0 -m "Prototipo completato" → git push origin v0.1.0.
g) Su GitHub: crea una release per v0.1.0 con “Generate release notes”.
h) Condividi il link della release con un compagno — può scaricare il codice?

❓ 4. Quiz di verifica

1. Qual è la differenza tra una milestone e un GitHub Project?

Mostra risposta

Una milestone raggruppa le issue sotto un obiettivo con scadenza (es. “v1.0 — consegna 15 aprile”) e mostra una barra di progresso. È orientata al “per quando”. Un GitHub Project è una board visuale che mostra lo stato di avanzamento di tutte le attività (To Do, In Progress, Done). È orientato al “dove sta ogni cosa adesso”. Si completano: la milestone dice “queste 8 issue devono essere completate entro il 15 aprile”, il Project mostra su quali delle 8 qualcuno sta lavorando in questo momento. Un’issue può avere sia una milestone che essere in un Project.


2. Cos’è un tag Git e in cosa differisce da un branch?

Mostra risposta

Un tag è un’etichetta permanente che punta a un commit specifico — una volta creato, non si sposta mai. Un branch è un puntatore che si sposta in avanti ogni volta che fai un nuovo commit. Il tag è come un segnalibro fisso (“questo è il commit della v1.0”), il branch è come un cursore che avanza (“qui è dove sto lavorando”). I tag si usano per marcare le versioni rilasciate, i branch per il lavoro in corso. Entrambi sono puntatori a commit, ma il tag è immutabile e il branch è mobile.


3. Cosa significa la versione v2.4.1 in Semantic Versioning?

Mostra risposta

In Semantic Versioning (MAJOR.MINOR.PATCH): 2 è la versione major (ci sono state 2 modifiche incompatibili con le versioni precedenti), 4 è la versione minor (4 aggiunte di funzionalità compatibili dalla major 2), 1 è la patch (1 bugfix dalla minor 4). Quando incrementi MAJOR, azzeri MINOR e PATCH (2.0.0 → 3.0.0). Quando incrementi MINOR, azzeri PATCH (2.4.1 → 2.5.0). PATCH si incrementa solo per bugfix (2.4.1 → 2.4.2).


4. Hai creato un tag con git tag -a v1.0.0 ma non appare su GitHub. Perché?

Mostra risposta

Perché i tag non vengono pushati automaticamente con git push. Il push normale invia solo i commit e i branch, non i tag. Devi pushare esplicitamente il tag: git push origin v1.0.0 (un tag specifico) o git push origin --tags (tutti i tag). È una delle differenze tra tag e branch: i branch vengono pushati quando fai push del branch, i tag richiedono un push separato. Questo è intenzionale: evita di pushare tag accidentali o temporanei.


5. Cos’è una release su GitHub e cosa offre in più rispetto a un tag?

Mostra risposta

Una release è una pagina pubblica su GitHub collegata a un tag. Il tag da solo è un puntatore a un commit — è tecnico e minimale. La release aggiunge: un titolo leggibile, release notes (cosa c’è di nuovo, bug risolti, contributori), file scaricabili allegati (binari, documentazione), e archivi automatici del codice sorgente (.zip e .tar.gz). È il modo professionale di distribuire una versione: il prof o un utente può andare sulla pagina della release, leggere cosa c’è di nuovo e scaricare il codice in un click.


6. A cosa serve il pulsante “Generate release notes” quando crei una release?

Mostra risposta

Genera automaticamente le release notes dalla lista delle Pull Request integrate dal tag precedente a quello corrente. Ogni PR diventa un punto nella lista, con il titolo, il numero e l’autore. Se hai usato le PR in modo disciplinato (un titolo chiaro per ogni feature o fix), le note auto-generate sono già un ottimo punto di partenza. Puoi poi modificarle: aggiungere sezioni (Nuove funzionalità, Bug risolti, Contributori), rimuovere PR non rilevanti, o aggiungere contesto. È il modo più veloce per avere release notes complete senza scriverle da zero.


📚 Riepilogo della lezione

Cosa hai imparato oggi:
  • Milestone = obiettivo con scadenza, raggruppa le issue, barra di progresso
  • Creare: Issues → Milestones → New milestone (titolo + scadenza + descrizione)
  • Tag = etichetta permanente su un commit — non si sposta mai
  • Tag annotato: git tag -a v1.0.0 -m "messaggio" (consigliato)
  • I tag non si pushano automaticamente — serve git push origin v1.0.0 o --tags
  • Semantic Versioning: MAJOR.MINOR.PATCH — incompatibile.feature.bugfix
  • Per la scuola: v0.x.0 durante lo sviluppo, v1.0.0 alla consegna finale
  • Release = tag + pagina pubblica + release notes + file scaricabili
  • “Generate release notes” auto-genera la lista dalle PR integrate
  • Flusso: milestone → chiudi issue → tag → release

Prossima lezione →

Lezione 23 — Discussions e Wiki
Spazi di discussione per il team. Documentazione collaborativa.
Quando usare Discussions vs Issues.

Corso Git & GitHub · Per studenti e insegnanti · Lezione 22 di 45