In questa lezione mostreremo un breve esempio in cui useremo il comando git bisect che consente di individuare un commit del repository in cui è stato introdotto un bug o è stato commesso qualche errore o sono state apportate delle modifiche non volute a uno o più file di un progetto. L’esempio che vedremo è piuttosto semplice e ha lo scopo di illustrare il funzionamento del comando git bisect. In situazioni reali può risultare complicato individuare quale commit ha introdotto un bug e nonostante il messaggio associato a ciascun commit dovrebbe aiutare, ci si può ritrovare a dover usare il comando git checkout per spostarsi su un commit precedente, controllare se tutto funziona correttamente e ripetere la stessa azione più volte finché non viene individuato il commit desiderato. Con il comando git bisect, che usa un algoritmo di ricerca binaria, possiamo velocizzare tale processo.
Come usare il comando git bisect
Il comando git bisect permette di definire una sequenza di commit all’interno della quale pensiamo sia contenuto il commit che ha introdotto l’errore. Dovremo quindi indicare quali commit vanno bene (git bisect good) e quali sono i commit in cui il problema che vogliamo risolvere si è già manifestato (git bisect bad).
Vediamo quindi un esempio in cui vogliamo inserire all’interno del file configurazione_pc.txt un elenco di componenti. Alla fine il file dovrebbe essere come il seguente.
# Configurazione PC
AMD Ryzen 3 1200 - 110€
Asrock A320M - 52€
Ballistix Sport LT 8 GB Kit DDR4 - 98€
Drevo X1 240GB - 68€
Sapphire Radeon RX 560 2GB GDDR5 - 100€
Corsair VS450 - 39€
DeepCool Tesseract Black - 49€
In realtà, andando a visualizzare il contenuto del file configurazione_pc.txt visualizziamo solo i seguenti componenti.
Asrock A320M - 52€
Ballistix Sport LT 8 GB Kit DDR4 - 98€
Drevo X1 240GB - 68€
Sapphire Radeon RX 560 2GB GDDR5 - 100€
Corsair VS450 - 39€
DeepCool Tesseract Black - 49€
Per ogni componente, abbiamo aggiunto il suo nome e prezzo nel file ed eseguito un nuovo commit come mostrato sotto
$ git init
$ touch configurazione_pc.txt
$ git add .
$ git commit -m 'first commit'
# il carattere '>' inserisce una stringa nel file
$ echo '# Configurazione PC' > configurazione_pc.txt
$ git add .
$ git commit -m "aggiunge l'intestazione al file configurazione_pc.txt"
# il carattere '>>' appende una nuova riga al file
$ echo 'AMD Ryzen 3 1200 - 110€' >> configurazione_pc.txt
$ git commit -am "aggiunge il processore al file configurazione_pc.txt"
$ echo 'Asrock A320M - 52€' > configurazione_pc.txt
$ git commit -am "aggiunge la scheda madre al file configurazione_pc.txt"
$ echo 'Ballistix Sport LT 8 GB Kit DDR4 - 98€' >> configurazione_pc.txt
$ git commit -am "aggiunge i moduli RAM al file configurazione_pc.txt"
$ echo 'Drevo X1 240GB - 68€' >> configurazione_pc.txt
$ git commit -am "aggiunge un'unità SSD al file configurazione_pc.txt"
$ echo 'Sapphire Radeon RX 560 2GB GDDR5 - 100€' >> configurazione_pc.txt
$ git commit -am "aggiunge la scheda video al file configurazione_pc.txt"
$ echo 'Corsair VS450 - 39€' >> configurazione_pc.txt
$ git commit -am "aggiunge l'alimentatore al file configurazione_pc.txt"
$ echo 'DeepCool Tesseract Black - 49€' >> configurazione_pc.txt
$ git commit -am "aggiunge il case al file configurazione_pc.txt"
Possiamo ora lanciare il comando git log per avere un quadro più completo dello stato del repository dopo aver eseguito i comandi riportati sopra.
$ git log --oneline --decorate
e81e187 (HEAD -> master) aggiunge il case al file configurazione_pc.txt
b4097f8 aggiunge l'alimentatore al file configurazione_pc.txt
32404c1 aggiunge la scheda video al file configurazione_pc.txt
094271f aggiunge un'unità SSD al file configurazione_pc.txt
67c4c77 aggiunge i moduli RAM al file configurazione_pc.txt
e98befe aggiunge la scheda madre al file configurazione_pc.txt
5a0da72 aggiunge il processore al file configurazione_pc.txt
ac48ec1 aggiunge l'intestazione al file configurazione_pc.txt
89fb98f first commit
Siamo sicuri che nel primo commit non sono stati commessi errori, per cui possiamo usare l’identificatore 89fb98f come valore iniziale della sequenza di commit all’interno della quale andare a cercare il commit problematico. Usiamo inoltre l’ultimo commit come altro estremo. Avviamo quindi la ricerca col seguente comando:
(master) $ git bisect start
Nell’ultimo commit, l’elenco dei componenti è incompleto per cui lo segnaliamo come ‘bad commit’.
(master|BISECTING)$ git bisect bad HEAD
Nel primo commit siamo sicuri che non ci siano problemi, per cui lanciamo il seguente comando:
(master|BISECTING)$ git bisect good 89fb98f
Bisecting: 3 revisions left to test after this (roughly 2 steps)
[67c4c77b591ead929e523ad366baa109e5a22995] aggiunge i moduli RAM al file configurazione_pc.txt
Git ha quindi spostato l’attenzione sul commit 67c4c77b59. A questo punto possiamo visualizzare il contenuto del file configurazione_pc.txt.
((67c4c77...)|BISECTING) $ cat configurazione_pc.txt
Asrock A320M - 52€
Ballistix Sport LT 8 GB Kit DDR4 - 98€
In questo commit sono già state eliminate le prime righe del file, per cui possiamo segnarlo come ‘bad commit’.
((67c4c77...)|BISECTING) $ git bisect bad
Bisecting: 1 revision left to test after this (roughly 1 step)
[5a0da722ce531a3d9334848c79bac7ed55037463] aggiunge il processore al file configurazione_pc.txt
Siamo ora al commit 5a0da722ce. Visualizziamo nuovamente l’elenco dei componenti.
((5a0da72...)|BISECTING) $ cat configurazione_pc.txt
# Configurazione PC
AMD Ryzen 3 1200 - 110€
In questo commit, le prime due righe erano ancora presenti per cui lo segnamo come ‘good commit’.
((5a0da72...)|BISECTING) $ git bisect good
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[e98befe8ab1d2b8c28950bb9db284ecbf598a6d1] aggiunge la scheda madre al file configurazione_pc.txt
A questo punto dobbiamo analizzare il commit e98befe. Possiamo visualizzare nuovamente l’elenco dei componenti e accorgerci che è esattamente questo il commit in cui le prime due righe sono state eliminate.
((e98befe...)|BISECTING) $ cat configurazione_pc.txt
Asrock A320M - 52€
Possiamo ora uscire dalla procedura, eseguendo il comando git bisect reset.
git bisect reset
Previous HEAD position was e98befe... aggiunge la scheda madre al file configurazione_pc.txt
Switched to branch 'master'
Conclusioni
In questa lezione abbiamo visto come usare il comando git bisect per individuare un commit del repository in cui è stato commesso un errore. Dopo aver illustrato i concetti base di Git e aver lavorato su repository locali, nella prossima lezione vedremo finalmente come usare Git con repository remoti.