Branch in Git


Lezione 12 / 53

Branch in Git

Di Luca Ferretti


git guida git guida git italiano

Abbiamo detto, poco sopra, che Git confronta i file presenti nella working copy rispetto al commit da cui sono stati estratti per capire in che stato si trovano. Più frequentemente, però, sentiremo dire (e inizieremo a dire anche noi) che le eventuali modifiche presenti nella working copy sono rispetto a un branch su cui sto lavorando.

Proviamo a fare chiarezza.

Sappiamo che un commit è per Git uno snapshot del contenuto del repository in un dato momento. Sappiamo che ogni commit ha un riferimento al commit che lo ha preceduto. In questo modo, la sequenza di commit collegati l’uno all’altro ci permette di conoscere e ricostruire l’intera cronologia del progetto.

Supponiamo di aver portato avanti un progetto fino al rilascio della sua versione 1.0. Siamo pronti a lavorare a nuove fantastiche funzioni in vista della versione 2.0 tra qualche mese, ma, nel frattempo, magari potremmo dover fare dei rilasci “di fix” della versione 1 (1.1, 1.2, …). Come può facilitarci la vita Git



Fig - Commit su branch main fino alla versione 1.0

Fig - Commit su branch main fino alla versione 1.0

 

Quando abbiamo creato nel nostro progetto un repository con git init, Git ha anche creato un branch di default (il cui nome solitamente è main o master).

Man mano che abbiamo salvato i vari snapshot, ci è sembrato di “aggiungere” nuovi commit a questo branch, come se il branch main fosse composto dalla sequenza di commit.

In realtà, un branch in Git è un puntatore a uno specifico commit, un puntatore con un super potere: nel momento in cui viene effettuato un nuovo commit, il puntatore si sposta dal commit precedente all’ultimo.

Nel nostro esempio, potremmo creare un nuovo branch che punta al commit con cui abbiamo contrassegnato la versione 1.0 - notare che più branch possono puntare allo stesso commit - per le versioni di manutenzione 1.x
 

Fig - Nuovo branch punta a stesso commit

Fig - Nuovo branch punta a stesso commit


 

Poiché ogni branch punta a un commit - tale commit è indicato come “tip” o “head” del branch stesso - e, poiché Git sa il commit e il branch da cui è stata estratto l’attuale contenuto della working copy, nel momento in cui si aggiunge un commit, questo diventa la nuova “head” del branch.

In pratica, nel nostro progetto di esempio, potremo avere due commit “figli” dello stesso commit che contrassegna la versione 1.0, ognuno nei rispettivi branch, dando vita a due history separate.
 

Fig - Due branch, due history

Fig - Due branch, due history

 

Ciò che è importante è, quindi, avere sempre chiara la distinzione tra ciò che facciamo nel pratico con Git (“estrarre un branch nella working copy” oppure “vedere la cronologia di un branch” oppure “vedere le modifiche dell’ultimo commit”) e ciò che internamente fa Git (“estrarre nella working copy il commit (snapshot) che è la HEAD di un branch” oppure “partire dalla HEAD di un branch e ricostruire tutti i commit genitori” oppure “mostrare le differenza tra l’ultimo commit (snapshot) e il suo genitore (snapshot)”).

È importante annotare che Git non è prescrittivo sulle modalità d’uso dei branch, sta quindi ai team scegliere se e come sfruttare i branch per le proprie necessità. Nel tempo sono state promosse e definite alcune “branch strategies” più comuni, basate sull’uso di branch e sulla possibilità offerta da Git di “spostare” da un branch a un altro i commit.


Fig - Feature branch

Fig - Feature branch

Guida Git in italiano 1 Che cos'è Git? 2 Nascita di Git 3 Principali caratteristiche di Git 4 Riga di comando e UI in Git 5 Come Installare Git 6 5 comandi Git per sviluppatori singoli 7 5 comandi Git per sviluppare collaborando 8 Repository in Git 9 Commit in Git 10 Working Copy in Git 11 Staging Area in Git 12 Branch in Git 13 Remote in Git 14 Inizializzare un nuovo repository con git init 15 Creare una copia di un repository remoto in Git con git clone 16 Configurare le opzioni di Git con git config 17 Il comando Git add in Git 18 Il comando Git commit in Git 19 Il comando Git diff in Git 20 Il comando Git stash in Git 21 .gitignore : i file ignored in Git 22 Il comando Git status in Git 23 il comando Git log in Git 24 Il comando Git tag in Git 25 Il comando Git blame in Git 26 Il comando Git checkout in Git 27 Il comando Git revert in Git 28 Il comando Git reset in Git 29 Il comando Git rm in Git 30 L'opzione Git commit –amend in Git 31 Git rebase –interactive in Git 32 Scorciatoie per comandi frequenti in Git 33 Repository condiviso in Git 34 Il modello Fork & pull 35 Il comando Git remote in Git 36 I principali repository remote di Git: Github, Gitlab e Bitbucket 37 Il comando Git fetch in Git 38 Il comando Git push in Git 39 Il comando Git pull in Git 40 Il comando Git branch in Git 41 Il comando Git checkout in Git 42 Il comando Git merge in Git 43 Risolvere un merge conflict in Git 44 Capire meglio il contenuto dei commit durante un conflitto di merge in Git 45 Workflow Git centralizzato 46 Workflow Git feature branching 47 Workflow Git trunk-based 48 Approccio “forking” in Git 49 Gitflow in Git 50 Messaggi di commit in Git 51 Tagging & Versioning in Git 52 L’opzione merge in Git 53 L’opzione rebase in Git
Scopri i corsi

Le nostre guide possono essere molto utili per muovere i primi passi nel mondo della programmazione, ma se vuoi iniziare una nuova carriera in ambito digital & tech con il supporto costante dei docenti e tantissime esercitazioni pratiche, ti consigliamo di frequentare uno dei corsi della nostra Hackademy!

Scopri i corsi