Git 22
🔀 Git & GitHub · Modulo 4 · Lezione 22
Milestone e release 🏷️
Raggruppare issue in obiettivi · Tag · Semantic versioning · Creare release · Distribuire il progetto
🏷️ 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.
✅ #4 Contatti · ✅ #5 Footer · ✅ #6 README
🔵 #7 Dark mode (in progress) · ⚪ #8 Responsive
⚪ #10 Gallery · ⚪ #11 Blog · ⚪ #12 SEO
⚪ #13 Performance
1.2 — Creare una milestone
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”.
$ 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 | 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.
| 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.
v1.0.0) e GitHub lo creerà.📌 “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
### ✨ 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
Associa le issue
Lavora fino al 100%
Milestone al 100%
Chiudi la milestone
-m “MVP completo”
git push origin v1.0.0
→ New release → v1.0.0
→ Release notes → Publish
💻 2. Esempi guidati
Esempio A — Creare milestone e associare issue
Esempio B — Creare tag e release
# 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
🏋️ 3. Esercizi
🟢 Esercizio 1 — Crea la tua prima milestone (Facile)
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)
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)
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)
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
- 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.0o--tags - Semantic Versioning: MAJOR.MINOR.PATCH — incompatibile.feature.bugfix
- Per la scuola:
v0.x.0durante lo sviluppo,v1.0.0alla 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