In questo post proverò ad introdurre in modo molto gentile Git, lo strumento indispensabile per qualunque sviluppatore.
❓ Cosa è Git?
Git è un software di controllo di versione distribuito sviluppato da Linus Torvalds (si, il papà del kernel Linux).
Il suo scopo è quello di tenere traccia di tutte le modifiche apportate al codice e permettere la collaborazione decentralizzata tra sviluppatori.
📜 Concetti fondamentali
Elenchiamo alcuni concetti fondamentali riguardo a Git:
-
Repository: è il luogo dove è presente il codice e la relativa storia. Il repository può essere sia locale che remoto. Git permette di lavorare al proprio progetto localmente per poi sincronizzare modifiche con repository remoti (e viceversa). Questo permette la collaborazione tra gli svillupatori in modo davvero efficace. I repository remoti sono solitamente hostati su piattaforme dedicate come GitHub, GitLab o soluzioni on-premise. I file che permettono a Git di funzionare, risiedono nella cartella nascosta
.git
. -
Commit: un’istantanea del progetto in un determinato momento. Git permette di tenere traccia delle modifiche effettuando dei commit. In ogni commit è possibile visionare le modifiche apportate, la data e il relativo autore di tali modifiche.
-
Branch: utilizzato per ramificare il codice. È possibile iniziare ad apportare modifiche da un commit su un determinato branch per poi ramificare le successive modifiche in diversi branch. Questo permette sia di organizzare meglio gli sviluppi ma anche di lavorare contemporanemente in modo parallelo.
-
Merge: processo per fondere/unire un branch con un altro. In parole semplici, il concetto di merge è: permette di unire modifiche di diversi branch in un singolo branch. Git provvederà ad individuare le varie differenze per permettere un’integrazione corretta. Non sempre fila tutto liscio e delle volte è necessario l’intervento manuale.
-
Working directory: l’area contenente il nostro codice. Git monitora costantemente i file al suo interno.
-
Staging area: area virtuale predisposta a prepare i commit. I file vengono aggiunti alla staging area per poi permettere il commit.
-
Gli stati dei file: Git è un osservatore che controlla costantemente i file. I file presenti nella directory che git monitora, possono avere i seguenti stati:
- untracked: il file non sarà versionato, quindi non preso in considerazione da Git.
- modified: il file è cambiato rispetto al suo ultimo commit/salvataggio.
- staged: il file è stato segnalato per essere salvato nel prossimo commit.
- committed: il file sono stati congelati (in un commit) in un preciso istante.
🔄 Flusso di lavoro
Git ha un suo flusso di lavoro, come ben rappresentato nell’immagine sottostante:
Vediamolo nel dettaglio:
-
Inizializzazione di un repository
Prima di tutto, per poter lavorare con Git, occorre inizializzare il repository. Per farlo, occorre creare la directory dove abbiamo intenzione di lavorare, entrarci e lanciare il comando:
git init
Se invece il progetto è gia presente su un remote, occorrerà clonarlo, lanciando il comando:
git clone <url-repo-remoto>
-
Aggiungere un file alla staging area
Per aggiungere un file alla staging area, ovvero l’area temporanea predisposta a preparare il commit, occorrerà lanciare il comando:
git add <nome-del-file> # oppure si possono aggiungere tutti i file con: git add .
-
Effettuare il commit
Dopo che sono stati aggiunti i file alla staging area, è possibile effettuare il commit con il seguente comando:
git commit -m "<messaggio-del-commit>"
-
Sincronizzarsi con il remote
Dopo aver effettuato i commit, è necessario sincronizzare le modifiche dal locale al remote, mediante il comando:
git push -u origin <nome-branch>
Per sincronizzare le modifiche presenti sul remote nel repo locale, è possibile utilizzare:# per scaricare le sole modifiche dal remote: git fetch # per scaricarele e integrarle nella working directory: git pull
🍃 Ramificazioni
Git utilizza i branch per ramificare le modifiche. Questo permette di organizzare le modifiche e sviluppare in modo completamente parallelo.
Prendiamo come esempio l’immagine precedente. In essa sono presenti due branch, master
e new_feature
.
-
Creazione di un branch
Supponiamo che nel branch
master
ci sia codice attualmente in produzione e abbiamo la necessità di sviluppare nuove feature mantenedo intatta la codebase. In questo caso si procederà alla creazione di un branch partendo dal branchmaster
mediante il seguente comando:git checkout -b new_feature
Con questo comando, git procederà a creare un nuovo branch
new_feature
e si sposterà al suo interno. Tutti i commit successivi seguiranno una diramazione diversa mantendo intatto il codice presente sumaster
. Possiamo rivedere l’immagine precedente dove sul branchnew_feature
sono rappresentati due commit. -
Merge dei branch
Riprendedo sempre l’immagine precedente, dopo due commit viene effettuato il merge su
master
. Il merge non è nient’altro che una fusione tra due branch.Per effettuare il merge è necessario prima di tutto passare sul branch
master
con:git checkout master
e successivamente lanciare il comando di merge indicando il branch da fondere in
master
:git merge new_feature
🔚 Conclusioni
Git è uno strumento meraviglioso e super utile e merita di essere approfondito. Nel prossimo capitolo è possibile trovare diverse risorse utili per l’apprendimento e ulteriori approfondimento.
ℹ️ Risorse utili
-
Pro Git. Un ottimo libro molto completo consultabile online gratuitamente.
-
Oh My Git!. Un gioco opensource che permette di imparare Git divertendosi.
-
Learn Git Branching. Web app che permette di imparare il branching mediante delle sfide.
-
Git cheat sheet by Atlassian. Cheat sheet rilasciato da Atlassian.