Close

git blame

O comando git blame é um utilitário versátil de resolução de problemas que tem opções de uso extensas. A função geral do git blame é a exibição de metadados do autor anexados a linhas de commit específicas em um arquivo. Ele é 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 a 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 commits. Além do mais, a maioria dos IDEs com 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 alguns commits 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

Now that we have a copy of the example code we can start exploring it with git blame. The state of the example repo can be examined using git log. The commit history should look like the following:

$ git log
    commit 548dabed82e4e5f3734c219d5a742b1c259926b2
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:55:15 2018 +0000

        Another commit to help git blame track the who, the what, and the when

    commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:53:23 2018 +0000

        Creating the third commit, along with Kev and Albert, so that Kev can get git blame docs.

    commit 990c2b6a84464fee153253dbf02e845a4db372bb
    Merge: 82496ea 89feb84
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 05:33:01 2018 +0000

        Merged in albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)

        README.md edited online with Bitbucket

    commit 89feb84d885fe33d1182f2112885c2a64a4206ec
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 00:54:03 2018 +0000

        README.md edited online with Bitbucket
Logotipo do Git
Material relacionado

Folha de consulta do Git

Logotipo do Bitbucket
VER SOLUÇÃO

Aprenda a usar o Git com o Bitbucket Cloud

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) # Git Blame example
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  2)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  3) This repository is an example of a project with multiple contributors making commits.
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  4)
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  5) The repo use used elsewhere to demonstrate `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) Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Creating a line to support documentation needs for git blame.
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 13) Also, it is important to have a few of these commits to clearly reflect the who, the what and the when. This will help Kev get good screenshots when he runs the git blame on this 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

Carimbo de data e hora

Número da linha

Conteúdo da linha

89feb84d

Autor

Albert So

Carimbo de data e hora

2018-03-01 00:54:03 +0000

Número da linha

3

Conteúdo da linha

Este repositório é um exemplo de um projeto com múltiplos colaboradores fazendo commits.

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, o resultado de git blame vai ficar mais obscuro, mostrando essas mudanças.

git blame -M README.md

A opção -M detecta linhas que foram movidas ou copiadas dentro do mesmo arquivo. Assim o relatório traz 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. Assim o relatório traz o autor original das linhas, ao invés do último autor que moveu ou copiou as linhas.

Git blame vs git log


While git blame displays the last author that modified a line, often times you will want to know when a line was originally added. This can be cumbersome to achieve using git blame. It requires a combination of the -w, -C, and -M options. It can be far more convenient to use the git log command.

Para listar todos os commits originais nos 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 reverted README.md to original content
    509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Updated README
    cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

This output shows us that content from the README was added or modified 3 times by 3 different authors. It was originally added in commit cb20237cc by Mr.doob. In this example, git log has also been prepended with the --pretty-format option. This option converts the default output format of git log into one that matches the format of git log. For more information on usage and configuration options visit the git log page.

Resumo


The git blame command is used to examine the contents of a file line by line and see when each line was last modified and who the author of the modifications was. The output format of git blame can be altered with various command line options. Online Git hosting solutions like Bitbucket offer blame views, which offer a superior user experience to command line git blame usage. git blame and git log can be used in combination to help discover the history of a file's contents. The git log command has some similar blame functionality, to learn more visit the git log overview page.


Compartilhar este artigo
Próximo tópico

Leitura recomendada

Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.

Pessoas colaborando usando uma parede cheia de ferramentas

Blog do Bitbucket

Ilustração do DevOps

Caminho de aprendizagem de DevOps

Demonstrações de funções no Demo Den com parceiros da Atlassian

Como o Bitbucket Cloud funciona com o Atlassian Open DevOps

Inscreva-se para receber a newsletter de DevOps

Thank you for signing up