Git

Tutorial Git Bisect

Tutorial Git Bisect
Comentar seus commits é uma parte essencial da manutenção de código rastreável. Ajuda a rastrear problemas. No entanto, encontrar um bug com base apenas em comentários é uma tarefa tediosa. Pode levar muito tempo para classificar toda a história e descobrir qual commit é o culpado.

O comando git bisect fornece uma maneira de acelerar o processo de detecção de bug. Ele permite que você localize o problema mais rapidamente. Com git bisect, você pode definir um intervalo de commits que você suspeita ter o código problemático e então usar métodos de eliminação binários para encontrar o início do problema. Encontrar bugs fica mais rápido e fácil.

Vamos configurar um exemplo e executar alguns casos de teste para ver como funciona.

Exemplo de configuração

Em nosso exemplo, vamos criar um teste.arquivo txt e adiciona uma nova linha ao arquivo a cada confirmação. Depois de 16 confirmações, o estado final do arquivo ficará assim:

Aqui está meu bom código 1
Aqui está meu bom código 2
Aqui está meu bom código 3
Aqui está meu bom código 4
Aqui está meu bom código 5
Aqui está meu bom código 6
Aqui está meu bom código 7
Aqui está meu bom código 8
Aqui está meu código inválido 1 <-- BUG INTRODUCED HERE
Aqui está meu código ruim 2
Aqui está meu código ruim 3
Aqui está meu código ruim 4
Aqui está meu código ruim 5
Aqui está meu código ruim 6
Aqui está meu código ruim 7
Aqui está meu código ruim 8
Aqui está meu código ruim 9

No exemplo acima, o bug entrou no código após 8 commits. Continuamos desenvolvendo o código mesmo depois de introduzir o bug.

Você pode criar uma pasta chamada my_bisect_test e usar os seguintes comandos de dentro da pasta para criar a situação de exemplo:

git init
echo "Aqui está meu bom código 1"> teste.TXT
git add -A && git commit -m "Meu commit 1"
echo "Aqui está meu bom código 2" >> teste.TXT
git add -A && git commit -m "Meu commit 2 (v1.0.0) "
echo "Aqui está meu bom código 3" >> teste.TXT
git add -A && git commit -m "Meu commit 3"
echo "Aqui está meu bom código 4" >> teste.TXT
git add -A && git commit -m "Meu commit 4"
echo "Aqui está meu bom código 5" >> teste.TXT
git add -A && git commit -m "Meu commit 5 (v1.0.1) "
echo "Aqui está meu bom código 6" >> teste.TXT
git add -A && git commit -m "Meu commit 6"
echo "Aqui está meu bom código 7" >> teste.TXT
git add -A && git commit -m "Meu commit 7 (v1.0.2) "
echo "Aqui está meu bom código 8" >> teste.TXT
git add -A && git commit -m "Meu commit 8"
echo "Aqui está meu código inválido 1"> teste.TXT
git add -A && git commit -m "Meu commit 9"
echo "Aqui está meu código inválido 2" >> teste.TXT
git add -A && git commit -m "Meu commit 10"
echo "Aqui está meu código inválido 3" >> teste.TXT
git add -A && git commit -m "Meu commit 11"
echo "Aqui está meu código incorreto 4" >> teste.TXT
git add -A && git commit -m "Meu commit 12 (v1.0.3) "
echo "Aqui está meu código inválido 5" >> teste.TXT
git add -A && git commit -m "Meu commit 13"
echo "Aqui está meu código ruim 6" >> teste.TXT
git add -A && git commit -m "Meu commit 14"
echo "Aqui está meu código inválido 7" >> teste.TXT
git add -A && git commit -m "Meu commit 15 (v1.0.4) "
echo "Aqui está meu código ruim 8" >> teste.TXT
git add -A && git commit -m "Meu commit 16"

Verificando o histórico

Se você olhar o histórico dos commits, verá o seguinte:

$ git log
commit 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Autor: Zak H
Data: Dom 31 de dezembro 23:07:27 2017 -0800
Meu commit 17
comprometer 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Autor: Zak H
Data: Dom 31 de dezembro 23:07:25 2017 -0800
Meu commit 16
commit 598d4c4acaeb14cda0552b6a92aa975c436d337a
Autor: Zak H
Data: Dom 31 de dezembro 23:07:23 2017 -0800
Meu commit 15 (v1.0.4)
commit b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Autor: Zak H
Data: Dom 31 de dezembro 23:07:21 2017 -0800
Meu commit 14
commit eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Autor: Zak H
Data: Dom 31 de dezembro 23:07:19 2017 -0800
Meu commit 13
commit 3cb475a4693b704793946a878007b40a1ff67cd1
Autor: Zak H
Data: Dom 31 de dezembro 23:07:17 2017 -0800
Meu commit 12 (v1.0.3)
commit 0419a38d898e28c4db69064478ecab7736700310
Autor: Zak H
Data: Dom 31 de dezembro 23:07:15 2017 -0800
Meu commit 11
commit 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Autor: Zak H
Data: Dom 31 de dezembro 23:07:13 2017 -0800
Meu commit 10
commit a33e366ad9f6004a61a468b48b36e0c0c802a815
Autor: Zak H
Data: Dom 31 de dezembro 23:07:11 2017 -0800
Meu commit 9
commit ead472d61f516067983d7e29d548fc856d6e6868
Autor: Zak H
Data: Dom 31 de dezembro 23:07:09 2017 -0800
Meu commit 8
commit 8995d427668768af88266f1e78213506586b0157
Autor: Zak H
Data: Dom 31 de dezembro 23:07:07 2017 -0800
Meu commit 7 (v1.0.2)
commit be3b341559752e733c6392a16d6e87b5af52e701
Autor: Zak H
Data: Dom 31 de dezembro 23:07:05 2017 -0800
Meu commit 6
commit c54b58ba8f73fb464222f30c90aa72f60b99bda9
Autor: Zak H
Data: Dom 31 de dezembro 23:07:03 2017 -0800
Meu commit 5 (v1.0.1)
commit 264267111643ef5014e92e23fd2f306a10e93a64
Autor: Zak H
Data: Dom 31 de dezembro 23:07:01 2017 -0800
Meu commit 4
commit cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Autor: Zak H
Data: Dom 31 de dezembro 23:06:59 2017 -0800
Meu commit 3
commit 3f90793b631ddce7be509c36b0244606a2c0e8ad
Autor: Zak H
Data: Dom 31 de dezembro 23:06:57 2017 -0800
Meu commit 2 (v1.0.0)
commit cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Autor: Zak H
Data: Dom 31 de dezembro 23:06:55 2017 -0800
Meu commit 1

Mesmo com apenas um punhado de commits, você pode ver que é difícil identificar o commit que iniciou o bug.


Encontrando o Bug

Vamos usar git log -online para ver uma versão mais limpa do histórico de commits.

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

Queremos encontrar a situação em que a linha “Aqui está meu código inválido 1 <- BUG INTRODUCED HERE” entered the picture.

Situação 1

Suponha que lembremos que nosso código era bom até v1.0.2 e queremos verificar a partir desse momento até o último commit. Primeiro iniciamos o comando bisect:

$ git bisect start

Fornecemos o limite bom e o limite ruim (sem hash significa o código mais recente):

$ git bisect good 8995d42
$ git bisect ruim

Resultado:

Divisão: 4 revisões restantes para teste depois disso (cerca de 2 etapas)
[3cb475a4693b704793946a878007b40a1ff67cd1] Meu commit 12 (v1.0.3)

O comando bisect encontrou o ponto médio em nosso intervalo definido e moveu automaticamente o código para o commit 12. Podemos testar nosso código agora. Em nosso caso, vamos gerar o conteúdo do teste.TXT:

teste $ cat.TXT

Resultado:

Aqui está meu bom código 1
Aqui está meu bom código 2
Aqui está meu bom código 3
Aqui está meu bom código 4
Aqui está meu bom código 5
Aqui está meu bom código 6
Aqui está meu bom código 7
Aqui está meu bom código 8
Aqui está meu código inválido 1 <-- BUG INTRODUCED HERE
Aqui está meu código ruim 2
Aqui está meu código ruim 3
Aqui está meu código ruim 4

Vemos que o estado de teste.txt está no estado pós-bug. Então está em mau estado. Então, deixamos o comando bisect saber:

$ git bisect ruim

Resultado:

Divisão: 2 revisões restantes para teste depois disso (aproximadamente 1 etapa)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Meu commit 9

Ele move nosso código para o commit 9. Testamos novamente:

teste $ cat.TXT

Resultado:

Aqui está meu bom código 1
Aqui está meu bom código 2
Aqui está meu bom código 3
Aqui está meu bom código 4
Aqui está meu bom código 5
Aqui está meu bom código 6
Aqui está meu bom código 7
Aqui está meu bom código 8
Aqui está meu código inválido 1 <-- BUG INTRODUCED HERE

Vemos que encontramos o ponto de partida do bug. O commit “a33e366 My commit 9” é o culpado.

Finalmente, colocamos tudo de volta ao normal:

$ git bisect reset

Resultado:

A posição HEAD anterior era a33e366 ... Meu commit 9
Mudou para branch 'master'

Situação 2

No mesmo exemplo, vamos tentar uma situação em que outro desenvolvedor começa com a premissa de que o bug foi introduzido entre v1.0.0 e v1.0.3. Podemos iniciar o processo novamente:

$ git bisect start
$ git bisect good 3f90793
$ git bisect bad 3cb475a

Resultado:

Divisão: 4 revisões restantes para testar depois disso (cerca de 2 etapas)
[8995d427668768af88266f1e78213506586b0157] Meu commit 7 (v1.0.2)

Bisect moveu nosso código para commit 7 ou v1.0.2. Vamos fazer nosso teste:

teste $ cat.TXT

Resultado:

Aqui está meu bom código 1
Aqui está meu bom código 2
Aqui está meu bom código 3
Aqui está meu bom código 4
Aqui está meu bom código 5
Aqui está meu bom código 6
Aqui está meu bom código 7

Não vemos nenhum código ruim. Então, deixe o git bisect saber:

$ git bisect bom

Resultado:

Divisão: 2 revisões restantes para teste depois disso (aproximadamente 1 etapa)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Meu commit 9

Isso nos levou a comprometer 9. Testamos novamente:

teste $ cat.TXT

Resultado:

Aqui está meu bom código 1
Aqui está meu bom código 2
Aqui está meu bom código 3
Aqui está meu bom código 4
Aqui está meu bom código 5
Aqui está meu bom código 6
Aqui está meu bom código 7
Aqui está meu bom código 8
Aqui está meu código inválido 1 <-- BUG INTRODUCED HERE

Encontramos novamente o commit que introduziu o bug. Foi o commit “a33e366 My commit 9”. Embora tenhamos começado com o intervalo de suspeita diferente, encontramos o mesmo bug em algumas etapas.

Vamos reiniciar:

$ git bisect reset

Resultado:

A posição HEAD anterior era a33e366 ... Meu commit 9
Mudou para branch 'master'

Conclusão

Como você pode ver no exemplo, git bisect nos permite localizar um problema mais rápido. É uma ótima ferramenta para aumentar sua produtividade. Em vez de passar por todo o histórico de commits, você pode adotar uma abordagem mais sistemática para depurar.

Um estudo mais aprofundado:

https: // git-scm.com / docs / git-bisect
https: // git-scm.com / book / en / v2 / Git-Tools-Debugging-with-Git

Emular cliques do mouse passando o mouse usando o mouse sem cliques no Windows 10
Usar um mouse ou teclado na postura errada de uso excessivo pode resultar em muitos problemas de saúde, incluindo tensão, síndrome do túnel do carpo e...
Adicione gestos do mouse ao Windows 10 usando essas ferramentas gratuitas
Nos últimos anos, os computadores e sistemas operacionais evoluíram muito. Houve um tempo em que os usuários tinham que usar comandos para navegar pel...
Controle e gerencie o movimento do mouse entre vários monitores no Windows 10
Gerenciador de mouse com tela dupla permite que você controle e configure o movimento do mouse entre vários monitores, diminuindo seus movimentos pert...