Branch in Git

Partiamo dal presupposto che il lettore di questo articolo abbia familiarità con almeno un sistema di controllo di versione, come ad esempio CVS, SVN o GIT ed in particolare conosca già i comandi di base per l’utilizzo di un repository GIT. Si veda per questo anche l’altro articolo: “Collaborare su un repository Git“.

Una delle caratteristiche che troviamo nei sistemi di Controllo di Versione più diffusi è la possibilità di creare dei “branch”, ovvero delle “ramificazioni” dei sorgenti a partire dal “tronco” principale di sviluppo (appunto il “trunk”). Un branch ci permette ad esempio:

  • Di effettuare delle implementazioni corpose su un progetto da parte di uno o più sviluppatori, mentre un’altra parte del team si occupa di portare avanti la versione principale. In tal caso alla fine del lavoro le implementazioni presenti nel branch dovranno essere fuse di nuovo nel tronco principale.
  • Di marcare una versione del software rilasciata ad un cliente, di modo da “isolarla” storicamente dal resto del sistema che da lì si evolverà con nuove funzionalità. Il branch permetterà ad esempio di intervenire in futuro su un nuovo bug segnalato dal cliente che verrà così corretto sul branch stesso.

Un altro utilizzo utile in cui mi sono da poco imbattuto è anche quello di marcare gli step successivi di un tutorial, in modo da poter velocemente passare da uno step al successivo e poter evidenziare le differenze del codice semplicemente sfruttando due branch diversi (si veda per questo il tutorial di angularjs).

In questo articolo vedremo proprio come replicare quest’ultimo caso. Supponiamo di avere già un repository locale sincronizzato con uno remoto (negli esempi faccio riferimento a bitbucket).

Partiamo da un repository git di nome “testbranch”, contenente un unico file README.TXT con il seguente testo (o qualunque altro testo che vi venga in mente):

Test branch con git
1. Situazione iniziale

[learn_more caption=”Come creare un nuovo repo Git”]

Registrarsi (se non lo avete già fatto) su bitbucket.com (https://bitbucket.org) ed effettuate il login.
Dalla dashboard accedete al menu “Repositories->Create Repository”, indicate il nome che volete assegnare (ad esempio “testbranch”), quindi confermate premendo il pulsante “Create repository”.
Nella pagina successiva dovreste trovare un “Get Started” e scegliendo il link “I’m starting from scratch” trovate indicate le istruzioni da seguire per creare lo stesso repository in locale sul vostro pc:

mkdir /path/to/your/project
cd /path/to/your/project
git init
git remote add origin https://@bitbucket.org//testbranch.git

Questi comandi creano il repository locale (git init) e lo collegano a quello remoto (https://@bitbucket.org//testbranch.git). Con “origin” si fa riferimento di solito al repository remoto collegato a quello locale.

Create quindi il file README.TXT con il testo indicato. Quindi committate ed effettuate la sincronizzazione con il repository remoto:

git add README.TXT
git commit -m "Stato iniziale"
git push

[/learn_more]

Per visualizzare la lista dei branch e il branch attualmente in uso basta scrivere:

$ git branch
* master

In questo caso vediamo che esiste solo il main trunk che è attualmente quello attivo (l’asterisco a sinistra del nome ce lo indica).

Per “fotografare” questa versione iniziale creiamo un branch chiamato “v00” e sincronizziamo il nostro repo locale con quello remoto:

git branch v00
git push origin v00

Il secondo comando effettua un push “particolare”: rispetto a quello usato in precedenza qui si indica anche il repository da usare (origin) e il branch “v00”: se in remoto tale branch non esiste (come è questo il caso), verrà creato.

Se in locale visualizziamo l’elenco dei branch, dovrebbe comparire il nuovo branch v00 nella lista, con il master sempre selezionato:

$ git branch
 * master
 v00

In bitbucket, dalla pagina del repository, nella sezione “source” espandendo “master” è possibile selezionare anche il nuovo branch, visibile anche cliccando nella sezione “Branches”:

bitbucket-first-branchContinuando a rimanere nel main trunk “master”, modifichiamo il file README.TXT aggiungendo un nuovo punto:

Test branch con git
1. Situazione iniziale
2. Versione aggiornata v01

Quindi committiamo questa modifica nel repository locale e inviamo (push) al repository remoto:

git add README.TXT
git commit -m "Verso la versione v01"
git push

Se vogliamo quindi “ricordare” questa nuova modifica creiamo il nuovo branch v01:

git branch v01
git push origin v01

Visualizzando l’elenco dei branch comparirà il nuovo branch v01 nella lista, con il master sempre selezionato:

$ git branch
 * master
 v00
 v01

Capito il procedimento, lo possiamo iterare creando tutte le versioni del nostro progetto che riteniamo utili.
Rimane da vedere come poter “selezionare” un particolare branch in modo da riportare il nostro progetto esattamente nello stato in cui si trovava.

Se ad esempio vogliamo ritornare alla situazione iniziale:

$ git checkout v00
Switched to branch 'v00'
$ git branch
 master
*v00
 v01

Così il nostro file conterrà solo le prime due righe:

Test branch con git
1. Situazione iniziale

Un’opzione del comando git checkout utile in alcuni casi ma molto pericolosa è “-f”, con la quale si chiede a git di switchare sulla versione richiesta perdendo tutte le modifiche eventualmente in corso sui nostri files:

$ git checkout -f v00
Switched to branch 'v00'

Questa opzione risulta comunque utile quando appunto stiamo lavorando su un tutorial a vari step e ci divertiamo a fare esperimenti che poi non ci interessa salvare, oppure in un caso di progetto reale se vogliamo provare una soluzione implementativa in un branch che poi non ci soddisfa.