Git bisect: Como identificar um bug em seu código?



Neste artigo sobre git bisect, aprenda como o comando ‘git bisect’ ajuda a detectar o primeiro commit inválido que introduz um bug usando o algoritmo de pesquisa binária.

Meu código estava funcionando bem até ontem, mas não até que um recente pull do repositório remoto quebrou o código !!!

Se você está em uma situação semelhante e não sabe que mudança quebrou o código ou Who de muitos contribuidores possui isto bug / recurso , então git bisect é a sua saída. Portanto, neste artigo sobre git bisect, você aprenderá como ogit bisect'O comando vem para resgate na detecção do primeiro commit incorreto que introduz o bug usando o algoritmo de pesquisa binária.

Os tópicos abordados neste artigo são os seguintes:





Por que usar git bisect?

Não há dúvida no fato de que você tende a criar uma série de commits para cada pequena mudança em . Nesse cenário, depurar o código se torna uma tarefa tediosa, pois você tem que voltar manualmente no tempo para cada revisão do instantâneo do projeto a fim de testar o código de trabalho e detectar o bug. Agora, isso fica ainda mais complexo quando você tem o trabalho de outro para inspecionar sem um ponto de liderança, também pedir a cada um para limpar seus próprios erros também não parece muito viável.
Ao longo do caminho, você também pode criar e descartar uma série de branches de 'recursos' (ou hotfix) no processo e acabar perdendo tempo e esforço enquanto se desvia da linha principal de desenvolvimento.



Portanto, para evitar tais cenários, você pode usar ogit bisectcomando para encontrar a revisão do projeto ruim (ou instantâneo) e, eventualmente, corrigi-lo com ogit revertcomando.

Como 'git bisect' pesquisa?



java convertendo binário em decimal

Este comando bissectos (divide) sua história entre o Boa e a ruim comprometer alcance. Aponta o seu atual projeto Estado para um intervalo médio comprometer instantâneo. O comando git bisect então se move através cada identificação de commit entre este intervalo enquanto pausando em cada instantâneo para permitir que você teste o código . Se o bug existe, você declara o commit como ruim, se não como Boa a menos que a pesquisa termine.

Sintaxe

git bisect

Para entender melhor o git bisect, vamos criar um projeto que desenvolva o código de um aplicativo de navegação simples para ser usado em um carro.

Configuração inicial do projeto

Para criar um projeto que desenvolve o código de um aplicativo de navegação simples para ser usado em um carro, você pode seguir as etapas abaixo:

Passo 1: Crie um novo diretório em sua pasta $ HOME:

cd $ HOME mkdir my_nav_app

Passo 2: Navegue até o novo diretório:

cd $ my_nav_app

Etapa 3: Clone para baixar o projeto da minha página GitHub:

git clone https://github.com/divyabhushan/my_nav_app.git

Agora, vamos entender os diretórios do projeto e o layout dos arquivos, conforme impresso pelo comando:ls -lTR

Layout do código-fonte - Git Bisect - Edureka

A seguir, vamos ver o diário do histórico do projeto para ver os commits que fiz para gerar este código-

Por exemplo, um comando git log simples imprime o histórico em detalhes, no entanto, eu gosto de formatar e personalizar o histórico de forma bastante. Assim, vamos definir um nome alternativo - ‘hist’ usando o git alias comando conforme mostrado abaixo:

git alias.hist 'log --pretty = format:'% C (amarelo)% h% Creset% ad | % C (verde)% s% Creset% C (vermelho)% d% Creset% C (azul) [% an] '--graph --decorate --date = short'

Agora, vou realizar esse recurso de correção de bug em um branch separado, para não interferir com o desenvolvimento principal no branch ‘master’. Para fazer isso, siga o conjunto de comandos abaixo:

  • Crie o branch ‘dev’: [mestre] $git branch dev
  • Mude para o branch ‘dev’: $git checkout dev
  • Liste os registros do histórico: [dev] $vai hist[Nota: comando ‘alias’ usado aqui]

Além disso, destaquei o último commit válido conhecido que eu conheço, no qual meu script funcionou bem com os resultados esperados do caso de teste, este instantâneo de commit é marcado como v1.0.

Então, agora que sabemos nosso último bom commit, vamos prosseguir neste artigo sobre ‘git bisect’ e testar o aplicativo.

Teste o aplicativo

Execute o script como - $./scripts/myApplication.sh[testando pela primeira vez]



Claramente, meu atual estado de projeto está em erro , e não tenho certeza de qual alteração fiz em qual commit que introduziu essa alteração. Então, a seguir neste artigo sobre git bisect, vamos ver como identificar o commit inválido.

Identificação do mau commit

Para começar a inspecionar o commit incorreto, você deve seguir as etapas abaixo:

  • Inicie o comando bisect :git bisect start
  • Mencione o ID de commit inválido: git bisect bad HEADougit bisect c5b3ca8
  • Mencione o id do last-known-good-commit: git bisect good v1.0ougit bisect 93859d8

Isso divide o intervalo de histórico de commits aproximadamente a meio caminho entre os commits bons e ruins que nos levam ao ID do commit: f61a7e8

Portanto, o comando fez o check-out da versão do projeto como estava neste ID de commit. Agora, vamos testar nosso aplicativo novamente.

Comando para executar o aplicativo : $./scripts/myApplication.sh[testando pela segunda vez]


Desde a aplicação passado neste commit, este commit certamente não é um commit ruim. Então, em seguida, você deve informar ao comando bisect como - $git bisect bom


Agora, isso irá restringir ainda mais o resultado da pesquisa na primeira metade do intervalo, conforme mostrado -


Teste seu aplicativo novamente - Comando: $./scripts/myApplication.sh[testando pela terceira vez]


Portanto, visto que vemos um erro como acima, este é um commit ruim.

Informe o comando bisect, execute $git bisect bad


Isso restringe ainda mais a pesquisa e leva você à última revisão do meio dentro do círculo azul: a6ac769

Então, eu testo meu aplicativo uma última vez usando o mesmo comando: $./scripts/myApplication.sh[testando pela quarta vez]

Agora, como o aplicativo falhou novamente, ainda é um commit incorreto. Então, vamos executar o seguinte comando:

Execute o comando: git bisect bad

Bad commit encontrado

Isso conclui o único último commit restante que é ruim-


Então você sabe que foi aqui que o código foi quebrado. Qual o proximo?

Entenda qual arquivo tinha o bug

Neste caso, a saída fornece informações mínimas sobre o comprometer id , nome do autor , e as data de autoria juntamente com o enviar mensagem e a caminho que foi modificado.

Se você deseja depurar mais, você precisa ler a comprometer objeto de id .

Comando: git show a6ac76994b3f6c7519204f910fc787b7928cf8ef

Isso lerá o objeto de confirmação e imprimirá a mensagem de log e a comparação textual.

Você também pode usar o comando ‘git blame’ para analisar como e em qual confirmação cada linha foi alterada por qual autor, execute o comando como:git blame code / developers_nav.sh

Pare a busca

Para interromper a pesquisa, use o seguinte comando:

Comando: git bisect reset


Assim, o processo de bissecção é interrompido e você está de volta ao ramo de onde iniciou a pesquisa. Agora, a próxima etapa é corrigir ou depurar o código.

Como corrigir / depurar o código?

Bem, existem algumas soluções alternativas que você pode fazer para corrigir o estado atual do projeto agora que identificou o commit que trouxe o bug em primeiro lugar.
No entanto, se você estiver alterando um commit em um repositório compartilhado é melhor reverter a mudança usando o ‘ git revert ‘Comando.

Tarefa: Reverter as mudanças feitas pelo mau commit mencionado

Comando: git revert a6ac769

Como resultado, reverter as alterações feitas por este commit resultou em 2 coisas:

  • Ele excluiu as últimas 3 linhas adicionadas (indicadas em verde) e adicionou a linha excluída (indicada em vermelho) de volta. (reverso de a6ac769)
  • Criou um commit extra com as informações da mensagem de reversão

“O comando Reverter também torna mais fácil rastrear a mudança que você reverteu do commit original”

Use o 'mostrar' comando novamente para ler o id do objeto, assim -

Comando: git show 801f029

Agora, vá em frente e teste o aplicativo. Ele será executado corretamente.

Comando: $./scripts/myApplication.sh

Em contraste, se você deseja remover o commit inválido do histórico:

  • Você poderia usar o ' git reset ‘Comando com o“--Difícil”Opção (embora não seja recomendado em um repositório compartilhado).

  • Confira uma versão anterior de um único arquivo usando o 'git checkout‘Com o comando‘-'Opção.

Deve-se observar que isso só fará alterações em seu repositório local até que você envie as alterações para um repositório remoto. Uma vez que algumas mudanças criam um novo ID de objeto de confirmação como em nosso caso acima, em tais casos, um envio normal para o repositório remoto é rejeitado, pois o histórico teria divergido. Você deve usar o ‘ git push ‘Com o comando‘--força'Opção.

Atualizar branch ‘master’

Enquanto eu corrigia o bug no meu branch ‘dev’, agora posso mesclar essa alteração com o branch ‘master’ também -

  • mude para 'mestre', comando:git checkout master
  • puxar atualizações recentes de 'origem / mestre' para 'mestre', comando:origem git pull
  • mesclar alterações ‘dev’, comando:git merge gigante

No entanto, sua fusão pode gerar conflitos se houver mais commits do repositório remoto. Resolva os conflitos e continue com a fusão.
Finalmente, envie apenas os commits de branch 'master' estáveis ​​para o repositório remoto enquanto você faz o seu trabalho sujo (bug, recursos, melhorias) feito apenas nos branches de recursos como 'dev' neste exemplo.
Além disso, é melhor adotar uma lógica estratégia de ramificação para agilizar e proteger seu processo de fluxo de trabalho git.

Para resumir, ‘git bisect’ é um comando prático e útil que rapidamente identificar a comprometer id este introduzido para culpa em seu código em execução com a ajuda de uma extensa busca binária por logicamente divisão os logs de commit a meio caminho entre Boa e ruim comprometer alcance . Para concluir, você aprendeu a detectar o commit defeituoso e reverter a mudança feita por ele.

Além disso, para os subcomandos 'bom' e 'ruim', você também pode usar termos como novo e antigo para descrever o estado de revisão. Você pode executar o comando várias vezes passando diferentes subcomandos e ids de revisão / commit para identificar diferentes ids de commit (she-1). Como alternativa, um script de teste automatizado também pode ser executado para construir o código quebrado usando este comando. Além disso, encontre uma descrição detalhada deste comando executandogit bisect --helpno terminal. Então, pessoal com isso, chegamos ao fim deste artigo no Git Bisect.

diferença entre mutável e imutável

A intenção do DevOps é criar software de melhor qualidade com mais rapidez e confiabilidade, ao mesmo tempo em que estimula maior comunicação e colaboração entre as equipes. Se você está intrigado com este artigo, c que diabo pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. O curso Edureka DevOps Certification Training ajuda os alunos a entender o que é DevOps e ganhar experiência em vários processos e ferramentas DevOps, como Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack e GIT para automatizar várias etapas no SDLC.

Tem alguma questão para nós? Mencione isso na seção de comentários do artigo ”Git Bisect” e entraremos em contato com você o mais rápido possível.