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
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
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
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)
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