Full Stack

Come creare una branch in Git

Autore

Manuel Ricci

Dopo diciassette lezioni ci siamo arrivati, finalmente approfondiamo una volta per tutte le branch, quella che viene definita come la “killer feature” di Git. Non è una funzione esclusiva di Git, ma il modo in cui gestisce la ramificazione è qualcosa di straordinariamente performante.

La creazione di una branch e lo spostamento tra di esse è praticamente istantaneo, non importa quanto sia grande la codebase sulla quale stiamo lavorando. La funzionalità è così ben pensata e veloce che Git stesso incoraggia l’uso frequente di branch e merging.

Per però poter comprendere a pieno le branch, facciamo un piccolo ripasso.

Il salvataggio in Git

A differenza di altre VCS, Git non memorizza una serie di changesets (ne ho parlato durante il confronto con Mercurial) o differenze, ma degli snapshots.

Quando viene eseguita una commit, Git memorizza un oggetto commit (uno dei tre tipi presenti in Git) che contiene un puntatore allo snapshot del contenuto messo in staging.

L’oggetto in questione contiene l’autore, l’indirizzo email, il messaggio e il puntatore o puntatori alla commit precedente (come abbiamo visto durante l’esplorazione del database di Git)

I puntatori possono essere:

  • 0 se si tratta della prima commit
  • 1 se si tratta di una normale commit
  • 2 o più se si tratta di un merge di due o più branch

Facciamo un esempio per poter comprendere meglio da qui in poi. Abbiamo tre file inseriti nella staging area e successivamente salvati nel database di versionamento. Ci troveremo davanti ad una situazione simile a quella riportata nell’immagine qui sotto.

oggetti aggiunti alla repo dopo commit

La repository avrà 5 nuovi oggetti:

  • 3 blobs (file)
  • 1 tree (cartella)
  • 1 commit

Se procediamo con delle modifiche e con le relative azioni di salvataggio (le commit) gli oggetti commit avranno un puntatore alla commit precedente.

commit che puntano tra loro

Qui spero stiate apprezzando tutta la teoria fatta finora :)

Cosa sono le branch?

Una branch in Git non è altro che un puntatore ad una delle commit viste negli esempi precedenti. La branch principale si chiama master (o main) e ogni volta che verrà fatta una nuova commit, il puntatore della branch si sposterà avanti.

Va precisato che la branch master non è speciale è solo la branch che viene creata in fase di inizializzazione.

la referenza HEAD punta a master

Con la creazione della branch succede che un nuovo puntatore viene creato a sua volta e punterà alla commit dove abbiamo deciso di crearlo.

due branch

Ma come fa Git a sapere su quale branch siamo? Ti dice niente HEAD? L’abbiamo visto in più occasioni, in particolar modo quando abbiamo approfondito il concetto di detached HEAD.

HEAD è una referenza il cui scopo è quello di tenere traccia del dove ci troviamo. Quindi anche in questo caso è la referenza HEAD che permette a Git di sapere su quale branch ci troviamo.

head punta alla branch master

Se dovessimo spostarci in un’altra branch con git checkout il puntatore HEAD si sposterebbe a sua volta.

head punta alla branch testing

Dal momento che ci troviamo nella branch creata poco fa, proviamo a fare una modifica e a fare la commit, cosa succede? Il puntatore della branch che abbiamo creato andrà più avanti rispetto a quello della master branch.

ritorno a branch master con checkout

Se ci dovessimo spostare di nuovo sulla master branch, cosa accadrebbe? Il puntatore HEAD punta a master e file verranno ripristinati alla snapshot alla quale punta a sua volta master. E se dovessimo fare un’altra commit?

ritorno a branch master con checkout

La nostra storia a questo punto diverge, le modifiche sono isolate in due branch distinte e separate. Possiamo spostarci tra loro in qualunque momento ed effettuare il merge non appena saremo pronti.

branch divergenti dopo la commit su master

Quindi… la branch rappresenta una linea indipendnete di sviluppo e per quanto possa sembrare che ci vengano fornite nuove working directory, staging area e cronologia, in realtà si tratta solo di un sapiente uso dei puntatori.

Le branch in pratica

Il comando git branch è sempre accompagnato da git checkout e git merge, dato che da solo ci permetterebbe solo di creare, elencare, rinominare o cancellare delle branch.

git checkout è il comando che si usa per navigare tra branch, mentre git merge è quello che si usa per unificarle.

Creare una branch

Per creare una branch basta eseguire il comando:

1$ git branch <nome-branch>

Eventualmente possiamo creare una branch anche con git checkout, in questo modo:

1$ git checkout -b <nome-branch>

In questo modo, non solo creeremo la branch, ma ci sposteremo anche.

Vedere le branch create

Per elencare le branch si usa semplicemente git branch o git branch --list. Easy.

Mentre se vogliamo vedere in quale branch ci troviamo possiamo sempre usare le flag --show-current.

Eliminare una branch

Per eliminare una branch in Git, abbiamo due opzioni:

1$ git branch -d <nome-branch>

Dove -d o --delete è la cancellazione “sicura” che previene la cancellazione delle branch non unificate.

Oppure possiamo usare -D che forza la cancellazione. Si tratta di una scorciatoia per evitare di scrivere --delete --force.

1$ git branch -D <nome-branch>

Rinominare una branch

Per rinominare una branch possiamo usare la flag -m.

1$ git branch -m <nuovo-nome-branch>

Una parolina in più su checkout

Ormai siamo affezionati a git checkout, ma dovete sapere che dalla versione 2.23 e successive c’è anche il comando git switch che può essere usato al posto di checkout.

1$ git switch <nome-branch>

Equivale

1$ git checkout <nome-branch>

Mentre per la creazione della branch e il conseguente spostamento:

1git switch -c <nome-branch>

Equivale

1$ git checkout -b <nome-branch>

Infine, per tornare alla branch precedente

1$ git switch -

Equivale

1$ git checkout -

Conclusioni

Nella prossima lezione vedremo come visualizzare le differenze tra branch, prima di procedere poi nella lezione successiva al merging.

Caricamento...

Diventiamo amici di penna? ✒️

Iscriviti alla newsletter per ricevere una mail ogni paio di settimane con le ultime novità, gli ultimi approfondimenti e gli ultimi corsi gratuiti puubblicati. Ogni tanto potrei scrivere qualcosa di commerciale, ma solo se mi autorizzi, altrimenti non ti disturberò oltre.

Se non ti piace la newsletter ti ricordo la community su Discord, dove puoi chiedere aiuto, fare domande e condividere le tue esperienze (ma soprattutto scambiare due meme con me). Ti aspetto!

Ho in previsione di mandarti una newsletter ogni due settimane e una commerciale quando capita.