In questa guida parliamo di Git, il software di controllo versione distribuito più diffuso e utilizzato al mondo, popolare anche grazie a servizi come GitHub, GitLab e Bitbucket. Se ti è mai capitato di lavorare ad un progetto, scrivere un documento o preparare del materiale un po’ articolato, ti sarai accorto di come sia facile perdersi anche nel proprio lavoro. Spesso, per tener traccia di modifiche e tentativi di correzione, i file iniziano a spuntare come funghi. Ecco che troviamo miodocumento.txt accompagnato da miodocumento.txt.old e da miodocumento.txt.versione1. Quale era quello giusto? L’ultimo a cui avevo lavorato contiene tutte le modifiche? Sono domande che capita di porsi e fretta, stress e stanchezza non aiutano certo a darsi le risposte corrette.
Tutto ciò diventa sempre meno gestibile quando si inizia a parlare di grandi progetti, destinati a scenari produttivi, cui probabilmente partecipano professionisti diversi e (perché no?) dislocati in varie parti del mondo: figuriamoci in tali casi come può diventare tutto più complicato. Ciò ha portato alla nascita di un particolare tipo di strumenti software dedicati al controllo di versione, la soluzione ad ogni problema: ne trattiamo qui e ci soffermiamo soprattutto sul campione della categoria ovvero Git.
Per “controllo di versione” intendiamo un sistema informatico che permette di tenere traccia di tutte le modifiche che vengono apportate ad uno specifico progetto. Spesso si tratta di progetti informatici, ma il controllo di versione può trovare spazio in ogni ambito. Gli strumenti di tale categoria si accollano l’onere di conservare ogni versione dei file permettendo il recupero di una delle precedenti, tenere traccia delle modifiche, rendere disponibile quanto realizzato fino ad un dato istante e offrire soluzioni in caso di errore.
Attività del genere possono fare comodo a chiunque. Un grafico che lavora alla produzione di un’immagine potrebbe permettersi di tornare indietro al momento della necessità. Una maestra potrebbe conservare una versione di un quiz con le sole domande ed una successiva completa di risposte fornendole agli allievi in momenti differenti. Oppure una relazione potrebbe essere scritta e conservata tenendo traccia dello stato di avanzamento.
L’uso di strumenti simili si rivela particolarmente utile soprattutto quando si lavora in team. Si ha la possibilità di garantire una certa consistenza di lavoro tra gruppi operativi differenti. Se, supponiamo, il nostro progetto è suddiviso nel modulo A e nel modulo B, chi lavora al secondo deve poter essere sicuro di farlo interagire con una certa versione del modulo A che espone determinate caratteristiche.
Di software per il controllo di versione ne esistono molti e la loro evoluzione si intreccia strettamente con i progressi compiuti dalla comunicazione in Rete, questo per due motivi principali: in primis, si hanno possibilità sempre migliori di trasmettere dati tra macchine differenti; in secondo luogo, il mondo del lavoro si è modificato in modo da agevolare il reperimento di collaboratori in luoghi diversi dal proprio. Una prima generazione del controllo di versione ha rivelato la sua utilità pur senza fare uso della Rete. Ad esempio, rcs (Revisione Control System), nato negli anni Ottanta, permetteva di salvare le modifiche apportate ad un file in una cartella presente nella propria macchina ed estrarle al momento opportuno. Va da sé che ciò, per utile che potesse essere, non era particolarmente efficace né nel favorire gruppi di lavoro né nel mettersi al riparo da guasti. Con gli anni Novanta e la diffusione di Internet in ogni casa ed ufficio, è apparsa la generazione a lungo (ed in buona parte tuttora) dominante: quella basata su repository. Un unico file server svolgeva tale ruolo accumulando ogni versione dei file. Tutti coloro coinvolti nel progetto potevano collegarsi ad esso con i propri computer come client scaricando il materiale su cui lavorare nella versione appropriata. Al termine, le modifiche tornavano al repository. Software come CVS (Concurrent Versions System) hanno segnato la storia dello sviluppo informatico ma sono considerati ormai superati in quanto un unico repository rappresentava il collo di bottiglia del network risultando sottoposto a troppi accessi ed un punto critico in caso di suoi guasti o perdita di dati.
Per questo, i sistemi di controllo di versione distribuiti hanno conquistato il mondo e tra questi Git: ogni macchina coinvolta nel progetto scarica l’intero repository in modo che non ne esista mai un’unica copia disponibile.
Git è stato ideato da Linus Torvalds, lo stesso che ha inventato il sistema operativo Linux. In realtà, la storia di questi due grandi progetti è collegata infatti Git nacque proprio per facilitare la gestione dell’immensa mole di codice che componeva il kernel di Linux.
Abbiamo detto che Git lavora in maniera distribuita basandosi sullo scaricamento di un’immagine del progetto dal repository principale. Qui risiede il segreto della velocità di Git. Dopo esperienze con altri sistemi di controllo di versione ci si potrebbe stupire della rapidità con cui in Git vengono completate le operazioni. Il motivo sta proprio nella prassi di sincronizzare la cartella di lavoro corrente con un repository locale. Pertanto il grosso delle operazioni in Git verranno svolte localmente senza tempi di latenza e con la possibilità di lavorare off-line per buona parte del tempo.
La vita in Git sarà sempre suddivisa in due emisferi:
Questi sono i fondamenti di Git ma per iniziare a studiarlo è importante familiarizzare con il suo glossario di base. Termini tipici del controllo di versione sono checkout e commit. Hanno in genere un significato legato, rispettivamente, a recupero e salvataggio verso e da repository. In Git, sono entrambi intesi in senso locale infatti checkout indica il salvataggio nella working directory dal repository locale mentre commit indica il caricamento nel repository (locale, sempre) di tutto ciò che abbiamo segnalato nella staging area.
Git può essere usato in ogni condizione. E’ un sistema multipiattaforma infatti ne esistono versioni per Linux (sua terra di origine), Windows e Mac. Appena scaricato e installato può essere utilizzato da riga di comando e, nonostante tale modalità non riceva i favori di tutti, Git non pone grandi difficoltà. Tutti i comandi richiamati rispecchiano infatti le principali fasi del ciclo di vita dei file: una buona confidenza con i principi di base del sistema faciliterà molto l’apprendimento del suo utilizzo.
Comunque esistono molte modalità più comode per farne uso. Innanzitutto sono disponibili molti client con interfaccia grafica. In questo modo, qualsiasi utente riuscirà a trovarsi a suo agio, non dovrà imparare a memoria troppi comandi ed avrà a disposizione tutte le funzionalità di questo ottimo sistema.
Inoltre i programmatori possono sfruttare Git dai propri ambienti di sviluppo come Android Studio, Visual Studio, etc.. Tutto il necessario potrà essere trovato direttamente all’interno di questi programmi o potrà essere aggiunto con appositi plugin. Tuttavia, prima di usare Git in maniera, per così dire, “comoda” converrebbe farvi esperienza con la versione di base, nuda e cruda, che da riga di comando permette di apprezzare a pieno tutte le caratteristiche del sistema.
La fama di Git, già molto conosciuto, è stata incrementata da servizi on-line dedicati al mantenimento e alla condivisione del codice. Tra i più famosi ci sono GitHub, GitLab e Bitbucket, il primo, forse il più famoso tra i tre, è stato acquisito dalla Microsoft a metà 2018. Qualsiasi programmatore si sarà imbattuto in librerie, framework o progetti residenti in uno di questi servizi ed il motivo sta proprio nella facilità di distribuzione che essi garantiscono. Tipicamente su una pagina di progetto di Github si potrà trovare documentazione, informazioni, esempi ed il codice sorgente sempre aggiornato del progetto che ci interessa. Mediante Git e tutti i client messi a disposizione degli ambienti di sviluppo sarà molto facile iniziare da subito a trarne vantaggio. GitLab e BitBucket sono ottime alternative, rimandiamo ai rispettivi siti ufficiali per scoprire caratteristiche, vantaggi e svantaggi di una soluzione rispetto all’altra.
Qualsiasi sviluppatore che voglia cimentarsi in contesti professionali non potrà non imbattersi nel controllo di versione e ciò al giorno d’oggi significa, per lo più, comprendere e conoscere Git. Tale sistema è divenuto ormai una skill in grado di arricchire qualsiasi curriculum in quanto se non lo si conosce già, sarà comunque l’azienda di assunzione a dover formare il dipendente visto che senza Git ormai non si può portare avanti con successo progetti impegnativi. Inoltre, una buona conoscenza di questo strumento dimostrerà più di molto altro la partecipazione a progetti di ampio respiro e di caratura professionale.
Iniziare non è assolutamente complicato né proibitivo da nessun punto di vista. Esiste molto materiale on-line, documentazione e soprattutto le nostre preziose lezioni in materia.