Tutorial get -bisect Git

Tutorial get -bisect Git
Commentare i tuoi commit è una parte essenziale del mantenimento del codice tracciabile. Ti aiuta a tenere traccia dei problemi. Tuttavia, trovare un bug basato solo sui commenti è un compito noioso. Può essere necessario molto tempo per risolvere tutta la storia e capire quale commit è il colpevole.

Il comando Bisect Git fornisce un modo per accelerare il processo di rilevamento dei bug. Ti consente di individuare il problema più velocemente. Con Git Bisect, è possibile definire una serie di commit che sospettate abbia il codice problematico e quindi utilizza metodi di eliminazione binaria per trovare l'inizio del problema. Trovare bug diventa più veloce e più facile.

Imposiamo un esempio ed eseguiamo alcuni casi di test per vedere come funziona.

Setup di esempio

Nel nostro esempio, creeremo un test.file txt e aggiungere una nuova riga al file con ogni commit. Dopo 16 impegni, lo stato finale del file sembrerà così:

Ecco il mio buon codice 1
Ecco il mio buon codice 2
Ecco il mio buon codice 3
Ecco il mio buon codice 4
Ecco il mio buon codice 5
Ecco il mio buon codice 6
Ecco il mio buon codice 7
Ecco il mio buon codice 8
Ecco il mio cattivo codice 1 <-- BUG INTRODUCED HERE
Ecco il mio cattivo codice 2
Ecco il mio cattivo codice 3
Ecco il mio cattivo codice 4
Ecco il mio cattivo codice 5
Ecco il mio cattivo codice 6
Ecco il mio cattivo codice 7
Ecco il mio cattivo codice 8
Ecco il mio cattivo codice 9

Nell'esempio sopra, il bug è entrato nel codice dopo 8 commetti. Abbiamo continuato a sviluppare il codice anche dopo aver introdotto il bug.

È possibile creare una cartella chiamata my_bisect_test e utilizzare i seguenti comandi dall'interno della cartella per creare la situazione di esempio:

git init
Echo "Ecco il mio buon codice 1"> Test.TXT
git add -a && git commit -m "il mio commit 1"
Echo "Ecco il mio buon codice 2" >> test.TXT
git add -a && git commit -m "il mio commit 2 (v1.0.0) "
Echo "Ecco il mio buon codice 3" >> test.TXT
git add -a && git commit -m "il mio commit 3"
echo "Ecco il mio buon codice 4" >> test.TXT
git add -a && git commit -m "il mio commit 4"
Echo "Ecco il mio buon codice 5" >> test.TXT
git add -a && git commit -m "il mio commit 5 (v1.0.1) "
Echo "Ecco il mio buon codice 6" >> test.TXT
git add -a && git commit -m "il mio commit 6"
Echo "Ecco il mio buon codice 7" >> test.TXT
git add -a && git commit -m "il mio commit 7 (v1.0.2) "
Echo "Ecco il mio buon codice 8" >> test.TXT
git add -a && git commit -m "il mio commit 8"
Echo "Ecco il mio Bad Code 1"> Test.TXT
git add -a && git commit -m "il mio commit 9"
Echo "Ecco il mio Bad Code 2" >> Test.TXT
git add -a && git commit -m "il mio commit 10"
Echo "Ecco il mio Bad Code 3" >> Test.TXT
git add -a && git commit -m "il mio commit 11"
Echo "Ecco il mio Bad Code 4" >> Test.TXT
git add -a && git commit -m "il mio commit 12 (v1.0.3) "
Echo "Ecco il mio Bad Code 5" >> Test.TXT
git add -a && git commit -m "il mio commit 13"
Echo "Ecco il mio Bad Code 6" >> Test.TXT
git add -a && git commit -m "il mio commit 14"
Echo "Ecco il mio Bad Code 7" >> Test.TXT
git add -a && git commit -m "il mio commit 15 (v1.0.4) "
Echo "Ecco il mio Bad Code 8" >> Test.TXT
git add -a && git commit -m "il mio commit 16"

Controllo della storia

Se guardi la storia degli commit, vedi quanto segue:

$ git log
commit 3023B63EB42C7FADC93C2DD18B532A44A0A0A6888A
Autore: Zak H
Data: Sun 31 dicembre 23:07:27 2017 -0800
Il mio commit 17
commit 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Autore: Zak H
Data: Sun 31 dicembre 23:07:25 2017 -0800
Il mio commit 16
commit 598D4C4ACAB14CDA0552B6A92AA975C436D337A
Autore: Zak H
Data: Sun 31 dicembre 23:07:23 2017 -0800
Il mio commit 15 (V1.0.4)
Commit B9678B75AC93D532EED22C2C6617E5A9D70Fe7B
Autore: Zak H
Data: Sun 31 dicembre 23:07:21 2017 -0800
Il mio commit 14
commettere EB3F2F7B0EBEDB732ECB5F18BEE786CD3CBBBB521
Autore: Zak H
Data: Sun 31 dicembre 23:07:19 2017 -0800
Il mio commit 13
commit 3cb475a4693b704793946a878007b40a1ff67cd1
Autore: Zak H
Data: Sun 31 dicembre 23:07:17 2017 -0800
Il mio commit 12 (V1.0.3)
commit 0419a38d898e28c4db69064478ecab7736700310
Autore: Zak H
Data: Sun 31 dicembre 23:07:15 2017 -0800
Il mio commit 11
commit 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Autore: Zak H
Data: Sun 31 dicembre 23:07:13 2017 -0800
Il mio commit 10
commit A33E366AD9F6004A61A468B48B36E0C0C802A815
Autore: Zak H
Data: Sun 31 dicembre 23:07:11 2017 -0800
Il mio commit 9
commit ead472d61f516067983d7e29d548fc856d6e6868
Autore: Zak H
Data: Sun 31 dicembre 23:07:09 2017 -0800
Il mio commit 8
commit 8995d427668768af88266f1e78213506586b0157
Autore: Zak H
Data: Sun 31 dicembre 23:07:07 2017 -0800
Il mio commit 7 (V1.0.2)
commit be3b341559752e733c6392a16d6e87b5af52e701
Autore: Zak H
Data: Sun 31 dicembre 23:07:05 2017 -0800
Il mio commit 6
Commit C54B58BA8F73FB464222F30C90AA72F60B99BDA9
Autore: Zak H
Data: Sun 31 dicembre 23:07:03 2017 -0800
Il mio commit 5 (V1.0.1)
commit 264267111643ef5014e92e23fd2f306a10e93a64
Autore: Zak H
Data: Sun 31 dicembre 23:07:01 2017 -0800
Il mio commit 4
Commit CFD7127CD35F3C1A55EB7C6608ECAB75BE30B208
Autore: Zak H
Data: Sun 31 dicembre 23:06:59 2017 -0800
Il mio commit 3
commit 3f90793b631ddce7be509c36b0244606a2c0e8ad
Autore: Zak H
Data: Sun 31 dicembre 23:06:57 2017 -0800
Il mio commit 2 (V1.0.0)
commettere CC163ADB8A3F7B7B52411DB2B3D8BAB9B7FB191E
Autore: Zak H
Data: Sun 31 dicembre 23:06:55 2017 -0800
Il mio commit 1

Anche con solo una manciata di commit, puoi vedere che è difficile individuare il commit che ha iniziato il bug.


Trovare il bug

Usiamo il registro git -online per vedere una versione più pulita della cronologia del commit.

$ git log --oneline
3023b63 Il mio commit 17
10ef028 il mio commit 16
598d4c4 il mio commit 15 (V1.0.4)
B9678B7 Il mio commit 14
eb3f2f7 il mio commit 13
3CB475A Il mio commit 12 (V1.0.3)
0419a38 il mio commit 11
15bc592 il mio commit 10
a33e366 il mio commit 9
ead472d il mio commit 8
8995d42 il mio commit 7 (V1.0.2)
be3b341 il mio commit 6
c54b58b il mio commit 5 (v1.0.1)
2642671 il mio commit 4
CFD7127 Il mio commit 3
3f90793 il mio commit 2 (v1.0.0)
cc163ad il mio commit 1

Vogliamo trovare la situazione in cui la linea “Ecco il mio cattivo codice 1 <- BUG INTRODUCED HERE” entered the picture.

Situazione 1

Supponiamo di ricordare che il nostro codice era buono fino a V1.0.2 e vogliamo controllare da quel momento fino all'ultimo commit. Iniziamo per la prima volta il comando bisetto:

$ git bisect inizio

Forniamo il buon confine e il confine cattivo (nessun hash significa il codice più recente):

$ git bisect buono 8995d42
$ git bisect cattivi

Produzione:

Bisecting: 4 revisioni lasciate per testare dopo questo (circa 2 passaggi)
[3CB475A4693B704793946A878007B40A1FF67CD1] Il mio commit 12 (V1.0.3)

Il comando Bisect ha trovato il punto centrale nella nostra gamma definita e spostato automaticamente il codice per commettere 12. Possiamo testare il nostro codice ora. Nel nostro caso, produrremo il contenuto del test.TXT:

$ cat test.TXT

Produzione:

Ecco il mio buon codice 1
Ecco il mio buon codice 2
Ecco il mio buon codice 3
Ecco il mio buon codice 4
Ecco il mio buon codice 5
Ecco il mio buon codice 6
Ecco il mio buon codice 7
Ecco il mio buon codice 8
Ecco il mio cattivo codice 1 <-- BUG INTRODUCED HERE
Ecco il mio cattivo codice 2
Ecco il mio cattivo codice 3
Ecco il mio cattivo codice 4

Vediamo che lo stato del test.txt è nello stato post-boug. Quindi è in cattivo stato. Quindi abbiamo fatto sapere al comando bisetto:

$ git bisect cattivi

Produzione:

Bisecting: 2 revisioni lasciate per testare dopo questo (circa 1 passaggio)
[A33E366AD9F6004A61A468B48B36E0C0C802A815] Il mio commit 9

Sposta il nostro codice per impegnare 9. Testiamo di nuovo:

$ cat test.TXT

Produzione:

Ecco il mio buon codice 1
Ecco il mio buon codice 2
Ecco il mio buon codice 3
Ecco il mio buon codice 4
Ecco il mio buon codice 5
Ecco il mio buon codice 6
Ecco il mio buon codice 7
Ecco il mio buon codice 8
Ecco il mio cattivo codice 1 <-- BUG INTRODUCED HERE

Vediamo di aver trovato il punto di partenza del bug. Il commit "A33E366 il mio commit 9" è il colpevole.

Infine, rimettiamo tutto alla normalità da:

RESETTO BISETTO $ GIT

Produzione:

La posizione di testa precedente era A33E366 ... il mio commit 9
Passato a Branch 'Master'

Situazione 2

Nello stesso esempio, proviamo una situazione in cui un altro sviluppatore inizia con la premessa che il bug è stato introdotto tra V1.0.0 e v1.0.3. Possiamo ricominciare il processo:

$ git bisect inizio
$ git bisect buono 3f90793
$ git bisect bad 3cb475a

Produzione:

Bisecting: 4 revisioni lasciate per testare dopo questo (circa 2 passaggi)
[8995D427668768AF88266F1E78213506586B0157] Il mio commit 7 (V1.0.2)

Bisect ha spostato il nostro codice per commettere 7 o V1.0.2. Eseguiamo il nostro test:

$ cat test.TXT

Produzione:

Ecco il mio buon codice 1
Ecco il mio buon codice 2
Ecco il mio buon codice 3
Ecco il mio buon codice 4
Ecco il mio buon codice 5
Ecco il mio buon codice 6
Ecco il mio buon codice 7

Non vediamo alcun codice cattivo. Quindi, fai sapere a Git Bisect:

$ git bisect bene

Produzione:

Bisecting: 2 revisioni lasciate per testare dopo questo (circa 1 passaggio)
[A33E366AD9F6004A61A468B48B36E0C0C802A815] Il mio commit 9

Ci ha spinto a impegnarci 9. Testiamo di nuovo:

$ cat test.TXT

Produzione:

Ecco il mio buon codice 1
Ecco il mio buon codice 2
Ecco il mio buon codice 3
Ecco il mio buon codice 4
Ecco il mio buon codice 5
Ecco il mio buon codice 6
Ecco il mio buon codice 7
Ecco il mio buon codice 8
Ecco il mio cattivo codice 1 <-- BUG INTRODUCED HERE

Abbiamo nuovamente trovato il commit che ha introdotto il bug. È stato il commit "A33E366 il mio commit 9". Anche se abbiamo iniziato con la diversa gamma di sospetti, abbiamo trovato lo stesso bug in pochi passi.

Ripristina:

RESETTO BISETTO $ GIT

Produzione:

La posizione di testa precedente era A33E366 ... il mio commit 9
Passato a Branch 'Master'

Conclusione

Come puoi vedere dall'esempio, Git Bisect ci consente di individuare un problema più velocemente. È un ottimo strumento per migliorare la tua produttività. Invece di attraversare tutta la storia degli commit, puoi adottare un approccio più sistematico al debug.

Ulteriori studi:

https: // git-scm.com/docs/git-bisect
https: // git-scm.com/book/en/v2/git-tools-debugging-with-git