Introduzione

I programmatori hanno sempre avuto bisogno di un software per gestire e condividere il proprio codice in modo rapido ed efficace. Per questo motivo sono nati i programmi di versionamento, ovvero delle applicazioni che permettono di controllare e tracciare le versioni del codice sorgente di un progetto. In questa guida al Versioning andremo a vedere Git, una delle applicazioni più famose e utilizzate al mondo.

Indice

Come funzionano i programmi di versioning?

Di base i sistemi di versioning sono composti da due agenti principali, che sono:

  • Repository: un database che contiene le informazioni delle modifiche e le versioni del progetto;
  • Working copy: la copia del progetto che uno sviluppatore avrà la possibilità di modificare localmente.

Ciò che lega queste due entità sono le operazioni fondamentali che l’utente sfrutterá per fruire del servizio: commit e update.

Le commit sono le operazioni di modifica che partono dalla working copy e vanno verso la repository. Le update sono tutte le richieste di aggiornamento che vengono fatte alle working copy non allineate all’ultimo cambiamento registrato.

La repository, oltre a contenere le varie modifiche al progetto, salva i parametri temporali (come data e ora del caricamento) utili alla ricostruzione di un’ordine cronologico delle versioni esistenti.

C’è da far presente che a seconda del tipo di controllo del sistema in questione, le cose possono essere leggermente diverse. Infatti noi abbiamo analizzato quello che viene definito “Centralized Version Control” (Gestione delle versioni centralizzato) dove c’è una sola repository che viene interrogata per avere aggiornamenti. La variante della “Centralized Version Control” è la “Distributed Version Control” (Gestione delle versioni distribuito). In questo tipo di sistema le repository dipendono dal numero di utenti che si vogliono interfacciare con il database principale. Dall’immagine rappresentativa, si può evincere che per operare sull’archivio principale si eseguiranno altri due comandi: push (per caricare le modifiche) e pull (per richiedere aggiornamenti).

Immagine guida del versioning control system distribuito

Git: I comandi

Avendo definito i concetti di base, passiamo alla guida su come sfruttare al meglio lo strumento di versioning, conosciuto come Git.

Installazione

Per prima cosa, vediamo come scaricare e installare questo strumento di lavoro formidabile. La procedura è molto semplice:

  • Windows e MacOS: è possibile scaricare il programma di installazione guidata direttamente dal loro sito. Al termine del download, si può procedere con l’installazione guidata;
  • Linux/Unix: nella pagina qui indicata, sono presenti tutte le istruzioni.

Configurazione

Dopo aver aperto il programma possiamo procedere alla fase di configurazione. Qui di seguito andremo a spiegare alcuni comandi spesso usati per la configurazione di Git.

Come posso cambiare le mie credenziali d’accesso?

Se si volesse accedere a Git dall’applicazione sul proprio PC, è necessario digitare i seguenti comandi compilandoli con le proprie credenziali:

git config --global user.name "Nuovo Account"
git config --global user.email nuova.email@example.com
git config --global user.password "1234321"

Nel caso non ci si fosse mai registrati prima, è possibile farlo su questo sito.

Come posso cambiare l’editor di testo di default?

Per cambiare l’editor di testo con un altro installato sul proprio computer, è possibile digitare il seguente comando:

git config --global core.editor "code --wait"

In questo caso, come editor verrà impostato Visual Studio Code. Il parametro opzionale “–wait”, serve per permettere a Git di attendere la chiusura dell’editor in modo da poter riprendere l’ascolto da terminale.

Come cambiare il nome del branch di default?

I “branch”, nei sistemi di versionamento, sono dei puntatori ad una versione specifica di partenza, in cui è possibile fare delle modifiche precise al fine di evitare la presenza di codice instabile nel branch principale.

Per cambiare il nome del branch principale, ovvero quello che viene generato automaticamente alla creazione del repository, è necessario digitare il seguente comando:

git config --global init.defaultBranch base

In questo caso il branch creato automaticamente sarà “base”.

Guida al Versioning con Git

Al termine della configurazione del nostro ambiente di lavoro, possiamo iniziare ad usare Git e le sue funzionalità. Qui di seguito, illustreremo le varie possibilità con le spiegazioni annesse.

Come posso creare una repository?

Per creare una repository occorre piazzarsi sulla cartella desiderata usando i comandi per la navigazione delle directory. Dopodichè, sarà possibile richiamare Git per segnalare che la cartella nella quale ci troviamo dovrà diventare una repository. Per farlo, è necessario digitare il comando:

git init

Per poter procedere con la creazione del repository, dovremmo innanzitutto selezionare tutti gli elementi presenti nella cartella e infine salvarli. Qui di seguito illustriamo i comandi da utilizzare:

git add .
git commit -m "Prima commit"

Il parametro “-m” serve per poter aggiungere un messaggio alla commit. In questo caso il messaggio è “Prima commit”.

Come posso clonare una repository già esistente?

Per clonare una repository sul tuo dispositivo, basta semplicemente digitare il seguente comando:

git clone <CLONE_URL> <NOME_CARTELLA>

Il “CLONE_URL” è la URL dalla quale si vuole clonare il progetto. Il “NOME_CARTELLA“, invece, è un parametro utile per definire il nome della cartella nella quale verrà inserito il progetto che si sta cercando di copiare.

Come posso vedere quali file risultano modificati e come posso eseguire una commit solo su alcuni di essi?

Per avere una lista completa e dettagliata delle modifiche è sufficiente digitare “git status” o, nella sua versione contratta, “git status -s”. In questo modo sarà possibile visualizzare la lista completa di tutte le modifiche, aggiunte e/o rimozioni di file rispetto a ciò che risulta sulla repository.

Per quanto riguarda invece delle commit mirate a file specifici, è sufficiente eseguire un “git add”, aggiungendo come parametro il file name. Di seguito mostriamo l’esempio per il file di nome “esempio.txt”:

git add esempio.txt

N.B. Per riferirsi a più file contemporaneamente, è possibile usare delle wildcards o delle regex. Per saperne di più controlla la pagina qui indicata.

Come posso escludere dei file dal tracciamento automatico delle modifiche?

In questo caso viene in vostro aiuto il “.gitignore”. Il “.gitignore” è un file che, generalmente, viene creato automaticamente alla creazione di un repository. Se ne doveste avere bisogno, nonostante ne notate l’assenza nella working copy, abilitate la visualizzazione dei file nascosti e, nel caso, createne uno voi. Per farlo, è sufficiente creare un file con nome “.gitignore”. Nel momento in cui avete la possibilità di modificare il file, sarà possibile definire, per ogni riga, le regole di esclusione dei file indesiderati. Di seguito mostriamo un esempio di regola di esonero:

esempio/*.txt

In questo caso, tutti i file con estensione “.txt” nella cartella “esempio”, verranno ignorati.

Come faccio a vedere lo storico delle commit?

Per visualizzare lo storico delle varie commit eseguite è necessario digitare il seguente comando:

git log

Nel caso si volesse filtrare secondo dei criteri particolari, a questo link qui è possibile trovare le informazioni utili alla compilazione della stringa di comando.

Ho dimenticato dei file nella commit e ho sbagliato il titolo. Come posso correggerlo?

Se l’ultima commit è stata fatta in modo errato, è possibile tornare indietro per correggerla. Basta digitare il comando:

git commit --amend

In questo modo si potrà aggiungere, rimuovere e/o modificare i file e le informazioni della commit. Per salvare questi cambiamenti, sarà poi necessario eseguire una commit.

Come posso annullare le modifiche apportate ad un file?

Per annullare delle modifiche apportate ad un file, è necessario digitare il seguente comando:

git restore example.txt

Nel caso illustrato, verranno annullate le modifiche apportate al file “example.txt”.

Come faccio a creare e usare un nuovo branch?

In questa guida sui sistemi di versioning come Git, non abbiamo ancora spiegato bene a cosa possono essere utili i “branch“. Sono degli strumenti molto utili nella fase di sviluppo di un progetto, in quanto permettono, a chi lavora, di fare modifiche per riparare o aggiungere delle funzionalità, in modo tale da non rendere instabile il codice sorgente sul ramo principale. Facendo ciò, sarà possibile ridurre il rischio che si presentino dei bug non considerati durante la fase di analisi e scrittura.

Per poter creare un nuovo branch su Git, è necessario digitare il seguente comando:

git branch NuovoBranch

In questo caso, il branch che verrà creato avrà il nome “NuovoBranch”. Per poter usare il branch appena creato, tutto ciò che bisogna fare è digitare:

git checkout NuovoBranch

Per poter fare questi due passaggi in una sola volta, bisogna digitare il comando:

git checkout -b NuovoBranch

Che cos’è una merge e come posso eseguirne una?

Quando ci si trova in una situazione in cui si sta lavorando su due branch diversi, prima o poi si dovrà tornare sul branch principale. Quando si è pronti a portare il codice del nuovo branch su quello padre, allora sarà necessaria una merge.

Per eseguire una merge, bisogna prima di tutto navigare sul branch principale, o qualsiasi sia il branch di partenza, facendo un checkout. Dopodichè, si digita il seguente comando:

git merge BranchDestinazione

Nel caso illustrato, “BranchDestinazione” sarà il nome del branch alla quale si vuole arrivare.

Attenzione però! E’ possibile che, in alcuni casi, si possano verificare degli errori durante questa fase se ci sono delle modifiche sui due branch nello stesso punto. Per risolvere questo problema è necessario risolvere i conflitti.

Che cos’è il rebase e quando può servire?

Nel caso in cui ci servisse portare delle modifiche da un ramo all’altro, è possibile prendere in considerazione il rebase. Il rebase serve a portare tutte le modifiche di un branch ad un altro, riscrivendo la cronologia delle commit. Di solito il rebase viene usato soprattutto nel caso in cui fosse necessario eliminare alcune delle commit passate. Per procedere, è necessario digitare:

git rebase ramoBase ramoAggiunte

Per finalizzare l’operazione, si esegue:

git checkout ramoBase
git merge ramoAggiunte

Conclusioni

In questa guida abbiamo presentato i comandi e le funzioni principali del sistema di Git. Vi suggeriamo, laddove ce ne fosse la necessità, di consultare la documentazione dal sito ufficiale. Speriamo che questo piccolo manuale introduttivo vi sia tornato utile.