Software di Controllo Versione
Informazioni utili sul software di controllo versione: vantaggi e svantaggi degli strumenti più diffusi.
Che cos'è il software di controllo versione?
Il software di controllo versione (VCS) è uno strumento che registra le modifiche a un insieme di file nel tempo, in modo da poter richiamare qualsiasi versione precedente, vedere chi ha modificato cosa e combinare il lavoro di più persone senza sovrascriversi a vicenda. È la colonna portante di qualsiasi flusso di lavoro software collaborativo ed è indispensabile nel momento in cui più di una persona tocca una codebase.
Questa pagina illustra le due famiglie di software di controllo versione, presenta gli strumenti più conosciuti con i loro compromessi e ti aiuta a decidere quale si adatta al tuo progetto. Se vuoi prima comprendere il concetto di base, leggi Sistema di Controllo Versione; per scoprire perché Git in particolare ha avuto successo, consulta Che cos'è Git.
Centralizzato vs. distribuito
Quasi ogni VCS rientra in una di due architetture, e la differenza influenza tutto il resto.
- Centralizzato (CVCS): un singolo server contiene la cronologia canonica. I client estraggono una copia di lavoro e inviano le modifiche direttamente a quel server. Esempi: CVS, SVN. Il vantaggio è un'unica fonte della verità e un semplice controllo degli accessi; lo svantaggio è che occorre l'accesso di rete per eseguire il commit, e il server rappresenta un singolo punto di guasto.
- Distribuito (DVCS): ogni clone è una copia completa dell'intero repository, inclusa tutta la cronologia. Si eseguono commit, si gestiscono branch e si visualizza la cronologia in locale e offline, per poi sincronizzarsi con gli altri quando si è pronti. Esempi: Git, Mercurial, Monotone. Questo rende la maggior parte delle operazioni istantanee ed elimina il singolo punto di guasto, a fronte di un modello mentale leggermente più complesso.
Il design distribuito di Git è il motivo principale per cui creare branch ed eseguire commit sembrano istantanei — non c'è nessun viaggio di andata e ritorno verso un server. Ogni clone effettuato con git clone contiene già la cronologia completa del progetto.
Strumenti più diffusi
Git
Git è lo standard de facto dei sistemi di controllo versione distribuiti oggi. È veloce, efficiente e gestisce progetti di qualsiasi dimensione. I suoi punti di forza distintivi sono la creazione di branch locali a basso costo (vedere git branch), un'area di staging pratica (vedere git add) e il supporto per molti flussi di lavoro. È un software libero e open source.

Limitazioni. Il supporto per file binari di grandi dimensioni è debole di default — anche se Git LFS affronta questo problema. Le operazioni possono rallentare su repository molto grandi con cronologie lunghe, e la vastità dei comandi può risultare opprimente per i principianti.
CVS
CVS (Concurrent Versions System) è un sistema centralizzato storicamente molto diffuso, ma oggi largamente obsoleto, superato dai moderni strumenti distribuiti. Registra la cronologia di file e documenti e funziona su quasi tutte le piattaforme hardware e i sistemi operativi. È un software libero e open source.

Limitazioni. CVS non verifica l'integrità del repository e manca di commit atomici, tracciamento dei merge e revisioni firmate — carenze che hanno direttamente motivato la creazione dei suoi successori.
SVN
SVN (Apache Subversion) è un sistema di controllo versione centralizzato ampiamente utilizzato nel corso degli anni 2000 e ancora presente in alcuni ambienti enterprise e legacy. Le sue funzionalità includono directory con versioning, commit atomici, tracciamento dei merge, operazioni di copia/spostamento/rinomina/eliminazione di prima classe, un modello client–server, metadati con versioning in forma libera, supporto MIME completo e blocco dei file. È un software libero e open source.

Limitazioni. I tempi di modifica dei file non vengono memorizzati, la normalizzazione dei nomi di file può essere problematica tra piattaforme diverse e non è supportato il versioning firmato delle revisioni.
Mercurial
Mercurial è un sistema di controllo versione distribuito scritto principalmente in Python. È veloce, supporta progetti di qualsiasi dimensione e ha un'interfaccia notoriamente prevedibile e facile da imparare. Funziona su sistemi Unix-like, Windows e macOS, gestisce bene i file binari e offre una gestione efficace dei merge e dei branch. È un software libero e open source.

Limitazioni. Python è richiesto per tutti i componenti aggiuntivi, i checkout parziali non sono supportati e la compatibilità con le estensioni di terze parti non è sempre ottimale.
Monotone
Monotone è un sistema di controllo versione distribuito scritto in C++. È un VCS transazionale a file singolo che offre operazioni completamente disconnesse, merge sensibile alla cronologia, branch leggeri, bassa manutenzione e sincronizzazione peer-to-peer. Funziona su Linux, Solaris, macOS, Windows e altri sistemi Unix. È un software libero e open source.

Limitazioni. Senza il supporto HTTP, gli utenti non possono estrarre o inviare modifiche da dietro un proxy, e alcune operazioni — in particolare il pull iniziale — presentano problemi di prestazioni. Monotone è oggi largamente abbandonato e ha una rilevanza moderna limitata.
Confronto rapido
| Strumento | Architettura | Stato | Punto di forza | Principale debolezza |
|---|---|---|---|---|
| Git | Distribuito | Standard di settore | Velocità, branching, ecosistema | File binari grandi, curva di apprendimento |
| Mercurial | Distribuito | Mantenuto, di nicchia | Interfaccia prevedibile e semplice | Ecosistema più piccolo |
| SVN | Centralizzato | Legacy / enterprise | Blocco file, modello semplice | Richiede server per il commit |
| CVS | Centralizzato | Obsoleto | Importanza storica | Nessun commit atomico né controllo integrità |
| Monotone | Distribuito | Largamente abbandonato | Forte modello di integrità | Nessun HTTP, pull iniziale lento |
Quale scegliere?
Per quasi ogni nuovo progetto la risposta è Git: ha la community più grande, il miglior supporto di hosting (GitHub, GitLab, Bitbucket) e il tooling più ricco. Scegli un'alternativa solo quando un vincolo concreto ti spinge in quella direzione:
- Mercurial — se il tuo team preferisce un insieme di comandi più ridotto e coerente e non sei legato all'ecosistema Git.
- SVN — se hai bisogno di un blocco file rigoroso per asset binari non unificabili, o gestisci un flusso di lavoro centralizzato già esistente.
- CVS / Monotone — generalmente solo per la manutenzione di un repository legacy esistente; da evitare per nuovi progetti.
Una volta scelto Git, il passo successivo è installarlo e imparare come funziona in pratica la gestione del codice sorgente.