Git 19
🔀 Git & GitHub · Modulo 4 · Lezione 19
Fork e open source 🍴
Contribuire ai progetti degli altri · Fork · Upstream · Il workflow dell’open source contributor
🍴 Finora hai collaborato su repository a cui avevi accesso diretto. Ma come contribuisci a un progetto di cui non sei collaboratore? Ad esempio un progetto open source, il repository del prof, o il progetto di un’altra classe? La risposta è il fork: crei una copia personale del repository, ci lavori sopra, e poi proponi le tue modifiche tramite una Pull Request. È il meccanismo che ha reso GitHub la piattaforma dell’open source.
🎯 Obiettivi della lezione
- Capire la differenza tra fork e clone
- Creare un fork di un repository
- Configurare il remoto
upstreamper restare sincronizzato con il progetto originale - Eseguire il workflow completo: fork → clone → branch → push → PR
- Mantenere il fork aggiornato con il repository originale
- Conoscere le basi della cultura open source
📖 1. Teoria
1.1 — Il problema: non hai i permessi di push
Nel Modulo 3 hai lavorato su repository dove sei collaboratore — hai i permessi per fare push e creare branch. Ma ci sono migliaia di progetti su GitHub a cui vorresti contribuire e dove non hai i permessi: librerie che usi, strumenti open source, il template del prof.
1.2 — Cos’è un fork
Un fork è una copia completa di un repository nel tuo account GitHub. Il fork è un repository a tutti gli effetti: ha la stessa storia, gli stessi file, gli stessi branch — ma è tuo, quindi puoi fare push, creare branch, modificare quello che vuoi senza toccare il progetto originale.
Tu non hai i permessi di push
Hai tutti i permessi
| Fork | Clone | |
|---|---|---|
| Dove vive | Su GitHub (nel tuo account) | Sul tuo computer (locale) |
| Cosa copia | L’intero repository su GitHub | L’intero repository in locale |
| Chi può farlo | Chiunque (su repo pubblici) | Chiunque (su repo pubblici) |
| Permette push | Sì — è un tuo repository | Solo se hai i permessi sul remoto |
| Collegamento con l’originale | GitHub mostra “forked from…” | Nessun collegamento speciale |
1.3 — I due remoti: origin e upstream
Quando lavori con un fork, hai due remoti da gestire: il tuo fork (origin) e il repository originale (upstream).
$ git remote add upstream git@github.com:proprietario/progetto.git
# Verifica: ora hai 2 remoti
$ git remote -v
origin git@github.com:tuousername/progetto.git (fetch)
origin git@github.com:tuousername/progetto.git (push)
upstream git@github.com:proprietario/progetto.git (fetch)
upstream git@github.com:proprietario/progetto.git (push)
1.4 — Il workflow completo del fork
Crea la copia nel tuo account
(del tuo fork)
upstream URL
feature/x
git push origin feature/x
dal tuo fork verso il repo originale
commenta, e (se tutto ok) merge
1.5 — Mantenere il fork aggiornato
Il repository originale continua a evolversi dopo che hai creato il fork. Per non restare indietro, devi periodicamente sincronizzare il fork con l’upstream. Ci sono due modi: da terminale o da GitHub.
$ git fetch upstream
$ git merge upstream/main
$ git push origin main
git pull.
$ git switch main
$ git fetch upstream
remote: Enumerating objects: 12, done.
From github.com:proprietario/progetto
a1b2c3d..f4e5d6c main -> upstream/main
$ git merge upstream/main
Updating a1b2c3d..f4e5d6c
Fast-forward
$ git push origin main ← aggiorna il fork su GitHub
📌 Quando sincronizzare? Prima di creare un nuovo branch per lavorare. Se il tuo fork è indietro di settimane, il tuo branch partirà da codice vecchio e la PR avrà conflitti con le modifiche recenti. Regola: sincronizza all’inizio di ogni sessione di lavoro.
1.6 — Aprire una PR dal fork
La PR dal fork funziona come quella normale, con una differenza: la PR va dal tuo fork al repository originale. GitHub lo gestisce automaticamente.
git push origin feature/x.1.7 — La cultura open source: le regole non scritte
Contribuire a un progetto open source non è solo codice — è entrare in una comunità con le sue regole e la sua cultura. Ecco cosa devi sapere prima di fare la tua prima PR a un progetto esterno:
💻 2. Esempi guidati
Esempio A — Fork workflow completo
prof-rossi/sito-classe. Tu vuoi aggiungere la tua pagina personale. Non hai permessi di push — devi usare il fork.# Vai su github.com/prof-rossi/sito-classe → clicca “Fork” → “Create fork”
# Ora hai: github.com/tuousername/sito-classe
# === PASSO 2: CLONE (del tuo fork) ===
$ git clone git@github.com:tuousername/sito-classe.git
$ cd sito-classe
# === PASSO 3: AGGIUNGI UPSTREAM ===
$ git remote add upstream git@github.com:prof-rossi/sito-classe.git
$ git remote -v
origin git@github.com:tuousername/sito-classe.git (fetch)
origin git@github.com:tuousername/sito-classe.git (push)
upstream git@github.com:prof-rossi/sito-classe.git (fetch)
upstream git@github.com:prof-rossi/sito-classe.git (push)
# === PASSO 4: CREA UN BRANCH ===
$ git switch -c feature/pagina-mario
# === PASSO 5: LAVORA ===
$ echo “<h1>Mario Rossi</h1><p>Appassionato di coding</p>” > studenti/mario.html
$ git add . && git commit -m “Aggiunta pagina personale di Mario”
# === PASSO 6: PUSH (al tuo fork, NON all’upstream) ===
$ git push -u origin feature/pagina-mario
# === PASSO 7: APRI PR (su GitHub) ===
# Vai su github.com/tuousername/sito-classe
# Clicca “Compare & pull request”
# Verifica: base repo = prof-rossi/sito-classe ← head repo = tuousername/sito-classe
# Titolo: “Aggiunta pagina personale di Mario Rossi”
# Descrizione: “Aggiunta la mia pagina nella cartella studenti/”
# Clicca “Create pull request”
Esempio B — Sincronizzare il fork prima di un nuovo lavoro
# Prima: sincronizza il fork con l’upstream.
$ git switch main
$ git fetch upstream
From github.com:prof-rossi/sito-classe
a1b2c3d..g7h8i9j main -> upstream/main
$ git merge upstream/main
Updating a1b2c3d..g7h8i9j
Fast-forward
studenti/giulia.html | 1 + ← Giulia ha aggiunto la sua pagina!
$ git push origin main ← aggiorna il tuo fork su GitHub
# Ora crea il nuovo branch dal main aggiornato
$ git switch -c feature/aggiorna-pagina-mario
# …lavora…commit…push…PR
🏋️ 3. Esercizi
🟢 Esercizio 1 — Il tuo primo fork (Facile)
b) Clicca “Fork” per creare la tua copia.
c) Clona il fork sul tuo computer.
d) Aggiungi il remoto upstream:
git remote add upstream URL-originale.e) Verifica con
git remote -v: vedi sia origin che upstream?f) Vai su GitHub: il tuo fork mostra “forked from…” in alto?
🔵 Esercizio 2 — PR dal fork (Medio)
feature/contributo.b) Aggiungi un file (es.
contributi/tuonome.md) con il tuo nome e un messaggio.c) Committa e pusha al tuo fork:
git push -u origin feature/contributo.d) Su GitHub, apri una Pull Request dal tuo fork al repository originale.
e) Nella descrizione spiega cosa hai aggiunto e perché.
f) Se il repository originale è di un compagno, chiedigli di revisionare e fare merge.
🟠 Esercizio 3 — Sincronizzare il fork (Medio)
a) Controlla se il tuo fork è indietro: su GitHub, il fork mostra “This branch is N commits behind”?
b) Da terminale, sincronizza:
git fetch upstream → git merge upstream/main → git push origin main.c) Verifica su GitHub: il banner “behind” è sparito?
d) Prova anche il Modo 2: su GitHub, clicca “Sync fork” → “Update branch”.
e) In locale, fai
git pull per allinearti.
🟣 Esercizio 4 — Simula un progetto open source di classe (Difficile)
Questo esercizio simula un progetto open source all’interno della classe:
libro-di-classe con un README.md, un CONTRIBUTING.md con le regole e un file capitoli/indice.md.b) Ogni studente:
— Fa fork del repository.
— Clona il proprio fork e configura upstream.
— Crea un branch
capitolo/nome-argomento.— Scrive un breve capitolo in
capitoli/nome-argomento.md (es. “capitoli/storia-di-internet.md”).— Pusha e apre una PR al repository originale.
c) Il maintainer revisiona ogni PR, chiede modifiche se necessario, e fa merge.
d) Ogni studente sincronizza il fork dopo ogni merge per vedere i capitoli degli altri.
e) Alla fine: il repository contiene un “libro” scritto collaborativamente da tutta la classe con il workflow open source.
❓ 4. Quiz di verifica
1. Qual è la differenza tra fork e clone?
Mostra risposta
Il fork crea una copia del repository su GitHub, nel tuo account — è un’operazione remota che avviene nel browser. Il clone scarica un repository sul tuo computer — è un’operazione locale che avviene nel terminale. Il fork ti dà un repository su cui hai tutti i permessi di push; il clone ti dà solo una copia locale. Nel workflow tipico, fai prima il fork (su GitHub), poi il clone del fork (sul computer). Il fork mantiene un collegamento con il repository originale, il clone no.
2. Cos’è upstream e a cosa serve?
Mostra risposta
upstream è il nome convenzionale dato al repository originale da cui hai fatto il fork. Lo aggiungi manualmente con git remote add upstream URL. Serve per sincronizzare il fork: puoi scaricare le novità dal repository originale (git fetch upstream) e integrarle nel tuo fork (git merge upstream/main). Senza upstream, il tuo fork resta fermo alla versione del momento del fork e non riceve gli aggiornamenti degli altri contributori. origin punta al tuo fork, upstream punta all’originale.
3. Quando fai git push su un fork, dove vanno i commit?
Mostra risposta
Vanno al tuo fork su GitHub (origin), non al repository originale (upstream). Quando fai git push origin feature/x, i commit arrivano su github.com/tuousername/progetto. Il repository originale non viene toccato — non hai i permessi per fare push lì. Per proporre le tue modifiche al repository originale, apri una Pull Request dal tuo fork al repository originale. È il maintainer del progetto originale che decide se accettarle.
4. Il tuo fork è “5 commits behind” rispetto all’originale. Come ti sincronizzi?
Mostra risposta
Due modi. Da terminale: git switch main → git fetch upstream (scarica le novità) → git merge upstream/main (integra nel tuo main locale) → git push origin main (aggiorna il fork su GitHub). Da GitHub: vai al tuo fork, clicca “Sync fork” → “Update branch” — GitHub aggiorna il main del fork automaticamente. Poi in locale fai git pull per allinearti. Il metodo da terminale è più flessibile e ti dà controllo completo; quello da GitHub è più veloce per sincronizzazioni semplici.
5. Vuoi contribuire a un progetto open source. Qual è la prima cosa da fare?
Mostra risposta
Leggere il file CONTRIBUTING.md (o CONTRIBUTING) del progetto. Questo file spiega le regole della comunità: come configurare l’ambiente di sviluppo, come formattare i commit, come strutturare le PR, quali branch usare. Poi cerca le issue con etichetta “good first issue” — sono pensate per nuovi contributori. Prima di iniziare a lavorare su un’issue, commenta per chiedere se puoi prenderla in carico. Questo evita duplicazioni e mostra rispetto per la comunità.
6. La tua PR è stata rifiutata dal maintainer. Come reagisci?
Mostra risposta
Con maturità: chiedi feedback. Rispondi con qualcosa come “Grazie per aver guardato la PR. Potresti dirmi cosa migliorare per una prossima volta?”. Il rifiuto non è personale — può dipendere da molti fattori: il progetto ha cambiato direzione, la modifica non è nella roadmap, l’implementazione non segue le convenzioni del progetto. Ogni rifiuto è un’occasione per imparare. Non prendertela, non insistere aggressivamente, e non aprire la stessa PR di nuovo senza aver fatto le modifiche richieste. La pazienza e la gentilezza sono le competenze più importanti nell’open source.
📚 Riepilogo della lezione
- Fork = copia del repo nel tuo account GitHub — hai tutti i permessi
- origin = il tuo fork · upstream = il repository originale
- Workflow: fork → clone → upstream → branch → lavora → push (origin) → PR (verso upstream)
- Sincronizzare:
fetch upstream→merge upstream/main→push origin main - Da GitHub: “Sync fork” per aggiornare con un click
- PR dal fork: GitHub imposta automaticamente base = originale ← head = tuo fork
- Cultura open source: leggi CONTRIBUTING.md, cerca “good first issue”, chiedi prima, PR piccole, sii paziente
Prossima lezione →
Lezione 20 — Branch protection e required reviews
Proteggere main da push diretti. Richiedere approvazioni obbligatorie.
Configurare le regole per un progetto di gruppo sicuro.
Corso Git & GitHub · Per studenti e insegnanti · Lezione 19 di 45