Mas primeiro, vamos falar sobre ...

Depuração Delta

A depuração delta é o processo de concluir várias etapas de depuração e em cada uma delas seu objetivo é eliminar metade do "problema". Você pode pensar nisso como a pesquisa binária de depuração. Ou como Andreas Zeller (que cunhou o termo) disse:

A depuração delta automatiza o método científico de depuração. A idéia básica do método científico é estabelecer uma hipótese sobre por que algo não funciona. Você testa essa hipótese e a refina ou rejeita, dependendo do resultado do teste. Ao depurar, as pessoas fazem isso o tempo todo. Manualmente. A depuração delta automatiza esse processo.

Git bisect é assim que aplicamos a depuração delta com o Git.

Vamos supor que temos um bug e tentamos encontrar a causa raiz. Em todas as etapas de nossa investigação de uma solução, eliminamos metade do espaço da solução. Configuração, código, entrada ... qualquer coisa. Aqui está um exemplo para torná-lo mais claro.

Exemplo de Git bisect

Primeiro, precisamos inicializar um repositório para acompanhar nosso trabalho.

mkdir test_git_bisect && cd test_git_bisect && git init

Digamos que vamos criar um script que tenha uma época e a converta em

datetime

Fazemos isso usando um arquivo de entrada (chamado epochs.txt) que devemos contém apenas épocas.

Observe que, para executar um git bisect sem problemas, precisamos ter alguns commits.

O script python parse_epochs.py vamos usar aqui não é nada de especial.

from time import localtime, strftimewith open('epochs.txt', 'r') as handler:    epochs = handler.readlines()    for epoch in epochs:        current_datetime = strftime('%Y-%m-%d %H:%M:%S', localtime(int(epoch)))        print(current_datetime)

Vamos confirmar a primeira alteração:

git add . && git commit -m "Created epoch parser"

então crie a entrada:

for i in {1..100}; do   sleep 3;   date +%s >> epochs.txt; done

Isso é basicamente todas as épocas desde o início do script (mais 3 segundos) até cinco minutos depois, com uma etapa de 3 segundos.

Novamente confirmamos a mudança:

git add . && git commit -m "Generated the first version of input"

Se agora executarmos o script inicial, obteremos todas as entradas analisadas para datas:

$ python3 parse_epochs.py2020-07-21 16:08:392020-07-21 16:10:402020-07-21 16:10:432020-07-21 16:10:462020-07-21 16:10:492020-07-21 16:10:52...

Vamos alterar a entrada agora para torná-la defeituosa:

echo "random string" >> epochs.txt

e comprometa novamente:

git add . && git commit -m "Added faulty input"

Por uma questão de entropia, para tornar o exemplo mais complexo, vamos adicionar mais entradas defeituosas – confirma.

echo "This is not an epoch" >> epochs.txt && git add . && git commit -m "Added faulty input v2"

echo "Stop this, the script will break" >> epochs.txt&& git add . && git commit -m "Added faulty input v3"

Aqui está o log de confirmação que criamos:

$ git log --pretty=format:"%h - %an, %ar : %s"b811d35 - Periklis Gkolias, 2 minutes ago: Added faulty input v3dbf75cd - Periklis Gkolias, 2 minutes ago: Added faulty input v2cbfa2f5 - Periklis Gkolias, 8 minutes ago: Added faulty inputd02eae8 - Periklis Gkolias, 20 minutes ago: Generated first version of inputa969f3d - Periklis Gkolias, 26 minutes ago: Created epoch parser

Se executarmos o script novamente, ele obviamente falhará com o seguinte erro:

Traceback (most recent call last):  File "parse_epochs.py", line 6, in <module>    current_datetime = strftime('%Y-%m-%d %H:%M:%S', localtime(int(epoch)))ValueError: invalid literal for int() with base 10: 'random stringn'

Parece que precisamos git bisect para corrigir isso. Para fazer isso, precisamos iniciar a investigação:

git bisect start

e marque um commit como ruim (geralmente o último) e um commit como bom. Este seria o segundo commit quando geramos a entrada:

git bisect bad b811d35 && git bisect good d02eae8

Depois disso, o git bisect dividirá a história entre o commit bom e o ruim em dois. Você pode ver isso fazendo git bisect visualize para ver os commits considerados culpados, e

git show

para imprimir o que foi retirado no momento, no nosso caso este:

dbf75cd

Se executarmos o script, ele ainda falhará. Então, marcamos o commit atual como ruim:

git bisect bad dbf75cd

Vale mencionar a saída do Git nesse caso:

git bisect bad dbf75cdBisecting: 0 revisions left to test after this (roughly 0 steps)[cbfa2f5f52b7e8a0c3a510a151ac7653377cfae1] Added faulty input

Git sabe que estamos quase lá. Yay!

Se executarmos o script novamente, é claro que falhará. E se a marcarmos como ruim, o Git diz:

git bisect bad cbfa2f5cbfa2f5f52b7e8a0c3a510a151ac7653377cfae1 is the first bad commit

Até então, você pode corrigir o erro ou entrar em contato com quem cometeu o código / entrada / configuração incorreto. Aqui está como obter os detalhes:

$ git show -s --format="%an, %ae" cbfa2f5Periklis Gkolias, [email protected]

Conclusão

Obrigado por ler este artigo. Sinta-se livre para compartilhar seus pensamentos sobre essa ótima ferramenta.