O comando git blame é um utilitário versátil de resolução de problemas que tem opções de uso extensas. A função git blame de alto nível é a exibição de metadados do autor anexados a linhas de comando específicas em um arquivo. Isto é usado para examinar os pontos específicos do histórico de um arquivo e obter contexto sobre quem foi o último autor que modificou a linha. É usado para explorar o histórico de código específico e responder dúvidas sobre o que, como e por que o código foi adicionado ao repositório.

O git blame costuma ser usado com uma exibição de GUI. Os sites de hospedagem de Git on-line, como o Bitbucket, oferecem visualizações de blame, que são invólucros de UI do git blame. Estas visualizações são referenciadas em discussões colaborativas sobre solicitações pull e confirmações. Além disso, a maioria dos IDEs que tem integração de Git, também tem visualizações dinâmicas de blame.

Como funciona

Para poder demonstrar o git blame, a gente precisa de um repositório com algum histórico. A gente vai usar o projeto de código aberto git-blame-example. Este projeto de código aberto é um repositório simples que contém um arquivo README.md, que tem algumas confirmações de diferentes autores. A primeira etapa do uso de git blame é realizar git clone do repositório de exemplo.

git clone https://kevzettler@bitbucket.org/kevzettler/git-blame-example.git && cd git-blame-example

Agora que temos uma cópia do código de exemplo, podemos começar a explorar com o git blame. O estado do repositório de exemplo pode ser examinado usando git log. O histórico de confirmações deve ser parecido com o seguinte:

$ git log
commit 548dabed82e4e5f3734c219d5a742b1c259926b2
Autor: Juni Mukherjee <jmukherjee@atlassian.com>
Data: Thu Mar 1 19:55:15 2018 +0000
Outra confirmação para ajudar o git blame rastrear quem, o que e quando
commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
Autor: Juni Mukherjee <jmukherjee@atlassian.com>
Data: Thu Mar 1 19:53:23 2018 +0000
Criando a terceira confirmação, junto com Kev e Albert, para que Kev possa obter os docs de git blame.
commit 990c2b6a84464fee153253dbf02e845a4db372bb
Merge: 82496ea 89feb84
Autor: Albert So <aso@atlassian.com>
Data: Thu Mar 1 05:33:01 2018 +0000
Mesclado em albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)
README.md editado on-line com Bitbucket
commit 89feb84d885fe33d1182f2112885c2a64a4206ec
Autor: Albert So <aso@atlassian.com>
Data: Thu Mar 1 00:54:03 2018 +0000
README.md editado on-line com Bitbucket

O git blame apenas opera em arquivos individuais. Um caminho de arquivo é necessário para qualquer resultado útil. A execução padrão do git blame apenas vai resultar no menu de ajuda de comandos. Para este exemplo, vamos operar no arquivo README.MD. É uma prática comum do software de código aberto incluir um arquivo README na raiz de um repositório do Git como uma fonte de documentação do projeto.

git blame README.MD

A execução do comando acima vai dar a primeira amostra do resultado de blame. O resultado a seguir é um subconjunto do resultado completo de blame do README. Além disso, este resultado é estático e reflete o estado do repositório no momento da gravação.

$ git blame README.md
82496ea3 (kevzettler 2018-02-28 13:37:02 -0800 1) # Exemplo de Git Blame
82496ea3 (kevzettler 2018-02-28 13:37:02 -0800 2)
89feb84d (Albert So 2018-03-01 00:54:03 +0000 3) Este repositório é exemplo de um projeto com diversos colaboradores de confirmações.
82496ea3 (kevzettler 2018-02-28 13:37:02 -0800 4)
82496ea3 (kevzettler 2018-02-28 13:37:02 -0800 5) O repositório usou elsewhere para demonstrar `git blame`
82496ea3 (kevzettler 2018-02-28 13:37:02 -0800 6)
89feb84d (Albert So 2018-03-01 00:54:03 +0000 7) Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod TEMPOR incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
89feb84d (Albert So 2018-03-01 00:54:03 +0000 8)
eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 9) Anota cada linha no arquivo fornecido com as informações da revisão fornecida.
eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Criando uma linha para apoiar a necessidade de documentação para git blame.
548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)
548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 13) Além disso, é importante ter algumas dessas confirmações para refletir quem, o que e quando. Isto vai ajudar Kev a ter boas capturas de tela quando ele executar git blame neste README.

Esta é uma amostra das primeiras 13 linhas do arquivo README.md. Para entender melhor este resultado, vamos analisar uma linha. A tabela a seguir exibe o conteúdo da linha 3 e as colunas da tabela indicam o conteúdo da coluna.

Id Autor Data e hora Número da linha Conteúdo da linha
89feb84d Albert So 2018-03-01 00:54:03 +0000 3 Este repositório é exemplo de um projeto com diversos colaboradores de confirmações.

Se a gente revisar a lista de resultados de blame, vai conseguir fazer algumas observações. São listados três autores. Além do proprietário do projeto, são listados também Kev Zettler, Albert So e Juni Mukherjee. Os autores costumam ser a parte mais valiosa do resultado de git blame. A coluna de data e hora também é muito útil. A coluna do conteúdo da linha indica qual foi a mudança.

Opções comuns

git blame -L 1,5 README.md

A opção -L vai restringir o resultado para o intervalo de linha solicitado. Aqui, a gente restringiu o resultado às linhas de 1 a 5.

git blame -e README.md

A opção -e exibe o endereço de e-mail dos autores, em vez do nome de usuário.

git blame -w README.md

A opção -w ignora as mudanças de espaço em branco. Se um autor anterior modificou o espaçamento de um arquivo, mudando de parágrafos para espaços ou adicionando novas linhas, isso vai obscurecer o resultado de git blame, mostrando essas mudanças.

git blame -M README.md

A opção -M detecta linhas que foram movidas ou copiadas dentro do mesmo arquivo. Isto vai exibir o autor original das linhas, ao invés do último autor que moveu ou copiou as linhas.

git blame -C README.md

A opção -C detecta linhas que foram movidas ou copiadas de outros arquivos. Isto vai exibir o autor original das linhas, ao invés do último autor que moveu ou copiou as linhas.

Git Blame vs. Git Log

Embora o git blame exiba o último autor que modificou uma linha, às vezes você quer saber quando uma linha foi adicionada. Isto pode ser complicado usando o git blame, pois requer uma combinação das opções -w, -C e -M. Pode ser muito mais fácil usar o comando git log .

Para listar todas as confirmações originais nas quais uma parte específica de código foi adicionada ou modificada, execute git log com a opção -S. Anexe a opção -S com o código que você está procurando. Vamos usar uma das linhas do resultado do README acima como exemplo, o texto "CSS3D and WebGL renderers" da linha 12 do resultado do README.

$ git log -S"CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
e339d3c85 Mario Schuettel Tue Oct 13 16:51:06 2015 +0200 reverteu README.md ao conteúdo original
509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Atualizou README
cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removeu DOMRenderer. Agora com CSS3DRenderer se tornou irrelevante.

Este resultado mostra que o conteúdo de README foi adicionado ou modificado 3 vezes, por 3 autores diferentes. Ele foi adicionado na confirmação cb20237cc by Mr.doob. Neste exemplo, git log também foi anexado com a opção --pretty-format. Esta opção converte o formato do resultado padrão de git log em um correspondente ao formato de git log. Para mais informações sobre as opções de uso e configuração, visite a página git log.

Resumo

O comando git blame é usado para examinar o conteúdo de um arquivo, linha por linha, e ver quando cada linha foi modificada pela última vez e quem foi o autor das modificações. O formato do resultado de git blame pode ser alterado com diversas opções da linha de comando. As soluções on-line de hospedagem do Git, como o Bitbucket, oferecem visualizações de blame, que oferecem uma experiência superior do usuário para o uso de git blame na linha de comandos. O git blame e o git log podem ser usados combinados para ajudar a descobrir o histórico do conteúdo de um arquivo. O comando git log tem algumas funcionalidades semelhantes às do blame, para saber mais visite a página de visão geral do git log.

Pronto para aprender sobre o Git?

Experimente este tutorial interativo.

Comece agora mesmo