Avviare un progetto con il sistema di versionamento Git

Git è il sistema di controllo delle sorgenti più usato per quanto riguarda i progetti software in PHP.

Pubblicato da ,
Ultima modifica

Per iniziare a usare il sistema di controllo delle versioni Git in un progetto bisogna inizializzare il progetto stesso tramite uno strumento a linea di comando git.

Questo tipo di comando di solito è già presente di default sui sistemi Linux, viceversa se tale comando non è presente sul nostro sistema è possibile installare git dal sito git-scm.com seguendo le istruzioni per sistemi Windows, Mac OS, GNU/Linux, in particolare se stiamo usando un sistema Ubuntu è possibile installare git direttamente da riga di comando

sudo apt-get install git

Se l'installazione di git è andata a buon fine possiamo inizializzare il nostro progetto, in particolare in questo articolo farò riferimanto a un sistema Windows.

Apriamo la cartella del progetto e clicchiamoci all'interno col tasto destro del mouse, e poi clic su Git Bash Here

 

Git Bash Here

 

si aprirà così un tool a linea di comando, digitiamo

git init

e poi invio, verrà creata una cartella .git all'interno della root del progetto, questa cartella conterrà tutte le informazioni relative al versionamento dei file.

Se si lavora in team è di fondamentale importanza identificare ogni persona che lavora sul progetto, è possibile configurare nome, cognome e indirizzo email tramite i seguenti comandi

git config --global user.name "<qui nome  e cognome>"
git congig --global user.email "<qui indirizzo email>"

con queste configurazioni è possibile stabilire quale utente ha effettuato una tale modifica alle sorgenti del progetto.

Git utilizza un sistema di staging area, che è un'area di memorizzazione temporanea dei file prima di inviarli al sistema di versionamento

 

Staging Area

 

per aggiungere un file alla staging area si usa il comando

git add <percorso e nome file>

specificando il nome del file compreso il percorso, in particolare se si vogliono aggiungere tutte le modifiche apportate ai file presenti nella root del progetto è possibile eseguire lo stesso comando col punto

git add .

ad esempio il comando

git add index.php

aggiunge alla staging area il file index.php che si trova nella cartella principale.

Per rimuovere un file dalla staging area si usa il seguente comando

git reset <nome file>

per visualizzare l'elenco dei file memorizzati nella staging area si usa il comando

git status

Per inviare tutti i file al repository si usa il comando commit, preferibilmente associato ad un messaggio descrittivo dell'azione

git commit -m "<qui messaggio commit>"

ad esempio se vogliamo eseguire il commit del file index.php usiamo il comando

git commit -m "add index.php"

tramite il comando

git log

è possibile visualizzare lo storico dei commit, ad esempio per l'azione precedente di commit del file index.php visualizzeremo un messaggio simile a questo

commit c698de09b8008e4f62f24dc0b358bb53a396378d (HEAD -> master)
Author: <nome e cognome autore> <email autore>
Date:   Sun May 24 14:44:07 2020 +0200

    add index.php

commit è il codice identificativo dell'azione (hash), Author nome, cognome e email dell'autore del commit, Date è la data in cui è avvenuta l'azione, e come si vede è specificato il messaggio associato al commit "add index.php", in paritcolare per annullare uno specifico commit si usa il comando

git revert -n <commit_hash>

-n applica le modifiche necessarie per ripristinare i commit denominati nell'albero di lavoro e nell'indice, ma non esegue i commit,  commit_hash è l'hash che identifica il commit, ad esempio per annullare il commit nell'esempio precedente si usa il comando

git revert c698de09b8008e4f62f24dc0b358bb53a396378d

Se il team di lavoro è composto da più sviluppatori, è utile creare un branch (detto anche ramo del progetto) per ognuno di essi, in modo che ogni sviluppatore ci memorizza le proprie modifiche fatte al progetto, oppure è possibile creare un branch per delle modifiche specifiche, associandogli un nome che identifica tali modifiche, per convenzione il repository principale si chiama master.

Per creare un branch si usa il comando

git branch <nome branch>

per passare da un branch all'altro si usa il comando

git checkout <nome branch>

in particolare si può usare un unico comando per creare e selezionare un branch, ad esempio

git checkout -b mybranch

eseguo contemporaneamente i comandi git branch mybranch e git checkout mybranch che creano e selezionano il branch denominato mybranch.

Per determinare su quale branch si sta lavorando si usa il seguente comando

git branch

in questo modo verrà visualizzato l'elenco completo di tutti i branch disponibili, quello selezionato è contrassegnato con un asterisco, in particolare per eliminare un branch si usa il comando 

git branch -d <branch name>

Ultimata l'operazione di commit è possibile pensare di condividere il progetto su github.com, per effettuare questa operazione si deve prima impostare il repositrory remoto con il seguente comando

git remote add origin https://github.com/<account>/<progetto>

dove account è il nome dell'account su github (ad esempio il mio è MicheleDeF) e progetto è il nome del repository creato su github, in particolare origin è il nome utilizzato per identificare il repository remoto.

Adesso possiamo inviare le modifiche al repository su github tramite il comando push

git push origin master

con questo comando si inviano le modifiche al repository origin utilizzando il branch master, in particolare lanciando il comando

git push

le modifiche verranno inviate allo stesso branch in remoto su cui si sta lavorando in locale, ad esempio se il mio branch locale su cui sto lavorando si chiama branch1 e lo stesso branch esiste anche sul repository remoto, allora eseguendo git push le modifiche verranno inviate a branch1.

Durante l'operazione di push viene richesto di effettuare il login al proprio account github per l'autenticazione, in particolare è possibile evitare di effettuare ognivolta il login usando la cache di Git

git config --global credential.helper cache

con questo comando viene impostato un periodo di 15 minuti (valore di default), se si vuole personalizzare la durata si può impostare un timeout

git config --global credential.helper 'cache --timeout=3600'

in questo caso la durata è di un'ora.

Esiste anche un'altro metodo per l'autenticazione con github, quello con la chiave SSH, per usare questa autenticazione bisogna impostare il repository remoto con l'indirizzo .git

git remote add origin git@github.com:<nome>/<progetto>.git

dove nome è il nome dell'account github, progetto è il nome del repository.

Il passo successivo è quello di generare una chiave SSH, senza la quale non è possibile effettuare operazioni di push, per generare una chiave SSH si usa il seguente comando

ssh-keygen -t rsa -b 4096 -C "<indirizzo email>"

dove indirizzo email è la email dell'account github, durante questa operazione verrà chiesto di specificare il percorso dove salvare la chiave SSH, oppure usare quello di default, ad esempio

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/username/.ssh/id_rsa):

premere invio per usare quello di default oppure specificare un'altro percorso

Enter file in which to save the key (/c/Users/username/.ssh/id_rsa): /c/Users/username/Desktop/Git/.ssh/id_rsa

in questo caso ho scelto un'altro percorso, premere invio e verrà chiesto di scegliere una password

Enter passphrase (empty for no passphrase):

invio e ripeti la password

Enter same passphrase again:

se la chiave è stata generata correttamente vedremo un messaggio simile a questo

Your identification has been saved in /c/Users/username/Desktop/Git/.ssh/id_rsa
Your public key has been saved in /c/Users/username/Desktop/Git/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:w4mz06/+qOz7xZfDFGHLPORIUADDFF4trrew <indirizzo email>
The key's randomart image is:
+---[RSA 4096]----+
|+*.              |
|=...             |
| oo. .   .       |
|... . .o...  .   |
|B.    o.S  .. .  |
|*o.    + o.  +   |
|.. E  o .+o B    |
|     . . +=X .   |
|     .===+=o=    |
+----[SHA256]-----+

Dopo aver generato la chiave SSH bisogna configurarla con il proprio ssh-agent, cioè il programma di autenticazione per connessioni SSH, per verificare che il proprio ssh-agent è in esecuzione si usa il comando

eval "$(ssh-agent -s)"

successivamente bisogna aggiungere la chiave SSH all'agent

ssh-add /c/Users/username/Desktop/Git/.ssh/id_rsa

specificando il percorso in cui abbiamo memorizzato la chiave SSH, premere invio e inserire la password che abbiamo creato durante il processo di generazione

Enter passphrase for /c/Users/username/Desktop/Git/.ssh/id_rsa:

se la chiave è stata aggiunta correttamente visualizzeremo un messaggio come questo

Identity added: /c/Users/username/Desktop/Git/.ssh/id_rsa (<indirizzo email>)

Infine l'ultimo passo è quello di aggiungere la chiave SSH all'account github, per farlo aprire la sezione Settings e poi SSH and GPG keys

 

SSH and GPG keys

 

in questa sezione è possibile aggiungere una chiave SSH usando il bottone New SSH key, inserire un titolo nel campo Title e la chiave SSH nel campo Key (il contenuto del file id_rsa.pub)

 

SSH keys / Add new

 

ogniqualvolta effettuiamo un'operazione di push verrà chiesto di digitare la password creata nel processo si generazione della chiave SSH.

L'ultimo argomento di questo articolo sono le Pull Request, ossia le operazioni di aggiornamento del proprio progetto locale con la versione remota.

Prima di inviare le modifiche ad un repository remoto è buona norma effettuare un aggiornamento della propria versione locale col comando fetch

git fetch origin

questo comando raccoglie tutti i commit dal repository remoto (origin) che non esistono nel nostro repository locale e li memorizza nel repository locale stesso.

Dopo aver scaricato gli aggiornamenti del repository è necessario procedere con l'operazione di merge ossia la sovrascrittura delle modifiche remote sul repository locale

git merge origin/master

in particolare è possibile usare un unico comando per le operazioni di fetch e merge

git pull origin master