Il controllo di versione è un sistema che gestisce nel tempo un insieme di cambiamenti generati da uno o più file o, più in generale, da un insieme di informazioni relative allo sviluppo di un software.
In questo senso, il controllo di versione assume una rilevanza notevole nella maggior parte dei progetti di sviluppo software, in quanto tramite esso specifici team di sviluppo possono gestire e registrare la continua evoluzione dei documenti digitali quali il codice sorgente, la documentazione testuale, così come tante altre informazioni importanti e relative allo sviluppo del software.
Tutto ciò risulta possibile grazie ad una combinazione di tecnologie e procedure volte a tener traccia dei cambiamenti che, di volta in volta, avvengono sui file di un determinato progetto.
Il motivo per cui il controllo di versione è così importante e ampiamente utilizzato dagli sviluppatori software è certamente il supporto che esso offre verso ogni aspetto relativo alla gestione di un progetto: stabilità e controllo del codice sorgente, comunicazioni rapide ed efficienti fra sviluppatori, gestione dei rilasci e degli aggiornamenti software, attribuzioni e autorizzazioni assegnati a determinati sviluppatori in caso di modifiche o revisioni della documentazione digitale e molto altro ancora.
Il controllo di versione è stato progettato in ambito ingegneristico e si è sviluppato in virtù dei processi formali basati sui disegni cartacei, in quanto ciascuna modifica a tali documenti è identificata incrementando un numero o un codice (numero di versione o etichetta di versione) che viene rispettivamente associato ad un determinato documento ed etichettato con il nome della persona che ha apportato l’eventuale modifica. In questo modo, viene assegnata a ciascuna versione di un progetto un numero identificativo al fine di rendere più chiara e semplice ogni forma di controllo e gestione del software.
Il controllo di versione nasce, infatti, anche e soprattutto per rendere facilmente gestibile ogni forma di revisione del software, in quanto rende implicita la possibilità di tornare ad uno stato precedente del progetto in caso di errori.
Difatti, il controllo di versione è stato pensato esattamente a partire dalla necessità sempre più comune a molti sviluppatori di tener traccia dei cambiamenti effettuati da parte di ciascun programmatore verso il progetto software, condividendone allo stesso tempo la versione più aggiornata del progetto e, quindi, di mostrare in tempi molto brevi lo stato di avanzamento del software.
In teoria, il controllo di versione può essere applicato a qualsiasi tipologia di registrazione di informazioni, eppure nella pratica le tecniche e gli strumenti più sofisticati progettati e utilizzati per il controllo di versione sono stati raramente usati al di fuori degli ambienti di sviluppo software.
Se nei primi anni di utilizzo dei sistemi di versione, quest’ultimi si sono avvalsi di un modello centralizzato in cui tutte le funzioni di controllo sono eseguite da un server condiviso, solo alcuni anni fa determinati sistemi di versione hanno cominciato ad usare un modello distribuito. Tale modello distribuito ha permesso ad ogni sviluppatore di lavorare direttamente tramite il suo repository locale, in modo da condividere le modifiche tra più repository soltanto in un secondo momento.
Questa modalità di operare ha cambiato in modo più che positivo il modo di lavorare degli sviluppatori, in quanto ha permesso ai team di sviluppo di agire sul software anche in assenza di una connessione di rete e di accedere alle funzioni di controllo versione anche senza autorizzazione da parte dell’autorità centrale.
Nel tempo, sono poi nati nuovi sistemi di versione caratterizzati dalla possibilità, offerta agli sviluppatori, di lavorare sullo stesso file contemporaneamente, fornendo tutti gli strumenti necessari per combinare le diverse modifiche effettuate da ciascun sviluppatore in un momento successivo.
Ad oggi, sono presenti alcuni strumenti di controllo versione
ancora più avanzati in termini di funzionalità aggiuntive o
plugin e di una più profonda integrazione con altri strumenti
e procedimenti di ingegneria del software.
Fra i primi sistemi di controllo versione troviamo software quali Subversion o abbreviato SVN, Concurrent Versions System o semplicemente CVS e Mercurial.
Per quanto concerne SVN, tale software è stato progettato nella sua prima versione nell’ottobre 2000 dalla CollabNet e distribuito come software open source dall’Apache Software Foundation.
SVN è stato progettato quale sistema centralizzato per il controllo di versione e caratterizzato da alcune qualità quali: sicurezza, affidabilità, semplicità d’uso, capacità di supportare le esigenze di una vasta gamma di utenti e progetti.
Tutte queste caratteristiche portano SVN ad essere, ancora oggi, largamente utilizzato sia da piccoli team di sviluppo che da grandi aziende per mantenere le versioni di un file, come ad esempio il codice sorgente.
In particolare SVN nasce con lo scopo di essere il naturale successore di CVS, ormai superato in quanto distribuito nella sua prima versione nel novembre 1990.
CVS, anch’esso progettato come software libero, è uno fra i primi sistemi per il controllo di versione centralizzato ideato per gestire il lavoro e i cambiamenti operati in un insieme di file, al fine di rendere più semplice e organizzato tutto il lavoro relativo all’implementazione di un software in via di sviluppo e di permettere a molti sviluppatori di collaborare in team allo sviluppo del codice sorgente, nonché di accedere alle medesime risorse disponibili in maniera concorrente.
Più recente è poi Mercurial, anch’esso open source e multipiattaforma, è invece un software per il controllo di versione distribuito.
Rilasciato nella sua prima versione nell’aprile 2005, Mercurial in quanto sistema di controllo versione distribuito si differenzia rispetto ai precedenti sistemi di controllo versione centralizzato, caratterizzandosi per i seguenti vantaggi:
Infatti, i sistemi per il controllo di versione distribuito, contrariamente ai sistemi per il controllo di versione centralizzato, permettono una collaborazione con gruppi di persone in modi differenti e simultaneamente per lo stesso progetto, impostando diversi tipologie di flussi di lavoro come ad esempio i modelli gerarchici.
Git è un sistema per il controllo di versione distribuito, nonché uno strumento fondamentale per lo sviluppo software soprattutto in ambito collaborativo e per l’implementazione di progetti open source.
Caratterizzato da un’interfaccia intuitiva e a riga di comando, Git è stato progettato nel 2005 da Luis Torvalds, informatico a cui si deve anche la nascita del kernel Linux. Difatti, Git nasce quale strumento volto a facilitare lo sviluppo del kernel Linux, diventando solo in un secondo momento uno degli strumenti di controllo versione più diffusi e utilizzati fra gli sviluppatori di tutto il mondo.
Effettivamente, Git rappresenta molto bene tutti i vantaggi che è possibile trarre da un sistema per il controllo di versione distribuito e ne offre anche nuovi.
Tramite il suo supporto allo sviluppo non lineare, Git incoraggia operazioni di diramazione e di fusione in fase di sviluppo, tra l’altro in modo rapido e comodo. In questo modo, Git si presenta come un software per la gestione facile ed efficiente anche di grandi progetti.
Inoltre, essendo molto veloce e scalabile, Git è anche molto più veloce degli altri sistemi di controllo versione, implementando anche varie strategie di fusione.
Tuttavia, il grande vantaggio di Git, così come dei sistemi per il controllo di versione distribuito, è la funzionalità di backup offsite. Tale funzionalità permette, infatti, ad ogni sviluppatore di agire sul progetto anche e soprattutto tramite repository locale e, pertanto, di mantenere una copia dell’intero codice sorgente, eliminando in questo modo qualsiasi tipo di inconveniente relativo alla produttività e alla conservazione dei dati.
Progettato nel 2013, GitLab nasce come piattaforma web open source al fine di consentire la gestione dei repository Git e delle sue funzioni di assistenza.
GitLab permette la creazione di repository pubblici e privati in modo da consentire agli sviluppatori di creare il proprio codice e gestire le modifiche per ciascuna versione anche contemporaneamente, così come consente di tracciare eventuali errori o problemi, scrivere commenti e allegare documenti all’interno di un determinato repository.
In questo senso, GitLab si presenta come un’ottima piattaforma web ed è sicuramente fra le più utilizzate e apprezzate da molte aziende in tutto il mondo, così come è impiegato dalla Kritek s.r.o. per la progettazione e la gestione anche di grandi progetti.
Inoltre, GitLab mette a disposizione varie funzionalità a seconda del tipo di abbonamento che si ha. Tuttavia è possibile utilizzarlo anche in maniera del tutto gratuita, seppur con delle limitazioni.
GitHub è poi un servizio di hosting per progetti software altrettanto valido e realizzato nel 2009 dalla GitHub Inc. e acquisito dalla Microsoft nel 2018, acquisizione che portò ad un aumento del numero dei progetti importati su GitLab.
Anch’esso nato come implementazione dello strumento di controllo versione distribuito Git, GitHub è il sito web principalmente utilizzato dagli sviluppatori che caricano il codice sorgente dei loro progetti al fine di renderlo scaricabile dagli utenti. In tal modo, ciascun utente ha la possibilità di interagire con lo sviluppatore tramite un sistema di tracciamento dei problemi e di scrittura dei commenti che permette di cogliere eventuali errori in modo semplice e veloce.
Inoltre, GitHub elabora una serie di dettagliate pagine volte a riassumere il lavoro svolto dagli sviluppatori relativamente alle varie versioni dei repository.
Bitbucket è, invece, un servizio di hosting web-based per progetti che usano i sistemi di controllo versione Mercurial o Git.
Progettato nel 2010, Bitbucket offre sia piani commerciali che gratuiti. La differenza fra le due tipologie di registrazione al servizio di hosting si individuano esclusivamente in termini di quantità di utenti da aggiungere ai propri repository.
Bitbucket risulta nelle sue funzioni e caratteristiche più simile a GitHub, mentre si differenzia maggiormente da GitLab in quanto quest’ultima è una piattaforma ideata per funzionare in molti ambienti di sviluppo anche molto diversi fra loro, incluso il cloud. Inoltre, GitLab e Bitbucket risultano completamente diversi sia per quanto riguarda la loro architettura sia circa le loro funzionalità e caratteristiche di utilizzo.
Dunque, GitLab risulta essere una valida scelta relativamente alla sua struttura e alle sue funzionalità pensate per una gestione eccellente della pianificazione e del monitoraggio di interi progetti, così come si configura come un ottimo strumento per la gestione delle idee, della pianificazione e dell’interazione fra sviluppatori, nonché per il rilevamento dei problemi circa lo sviluppo del software finale.