git blame
Saiba tudo sobre o comando git blame, como ele funciona com exemplos práticos e veja as opções mais comuns disponíveis.
Descrição
O comando git blame anota cada linha de um arquivo com informações sobre o último commit que a modificou — o hash do commit, o autor e o timestamp. Em outras palavras, para cada linha ele responde à pergunta "quem escreveu isso, e quando?".
É um comando de inspeção somente leitura. Ele não altera o histórico nem os arquivos; apenas exibe metadados que já existem no repositório. Os desenvolvedores recorrem ao git blame para:
- Encontrar o autor de uma linha confusa ou com bug para perguntar sobre a intenção por trás dela.
- Localizar o commit que introduziu uma mudança e, em seguida, ler sua mensagem completa com git show.
- Entender como um arquivo evoluiu quando o histórico de commits por si só é muito abrangente para apontar uma única linha.

git blame mostra apenas o commit mais recente que tocou cada linha. Se uma linha foi editada várias vezes, os autores anteriores ficam ocultos. Para rastrear uma linha mais atrás no tempo, execute o blame novamente em uma revisão mais antiga (veja Seguindo uma linha pelo histórico abaixo).
Como funciona
Para demonstrar claramente como o git blame funciona, vamos considerar um exemplo com um arquivo README.md com alguns commits de diferentes autores.
No exemplo a seguir, usamos git blame. O estado do repositório de exemplo pode ser explorado com git log. O histórico de commits tem esta aparência:
git log e git blame
git log
commit 745a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a
Author: Bob Smith <[email protected]m>
Date: Fri Apr 1 19:55:15 2019 +0000
Another commit to help git blame track the who, the what, and the when
commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
Author: Bob Smith <[email protected]m>
Date: Fri Apr 1 19:53:23 2019 +0000
Creating the third commit, along with Nick and Robert, so that Nick can get git blame docs.
commit 990c2b6a84464fee153253dbf02e845a4db372bb
Merge: 82496ea 89feb84
Author: Tom Brown <[email protected]m>
Date: Fri Apr 1 05:33:01 2019 +0000
Merged in tom-brown/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)
README.md edited online with Bitbucket
commit 73a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8
Author: Tom Brown <[email protected]m>
Date: Fri Apr 1 00:54:03 +0000
README.md edited online with BitbucketO comando git blame funciona em arquivos individuais. A execução padrão do git blame exibe as informações de blame para o arquivo especificado.
A saída a seguir é um subconjunto da saída completa de blame do arquivo README:
git blame
git blame README.md
83253a1b (marioswift 2019-02-28 13:37:02 -0800 1) # Git Blame example
83253a1b (marioswift 2019-02-28 13:37:02 -0800 2)
73a0b1c2 (Tom Brown 2019-04-01 00:54:03 +0000 3) Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.
83253a1b (marioswift 2019-02-28 13:37:02 -0800 4)
83253a1b (marioswift 2019-02-28 13:37:02 -0800 5) There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
83253a1b (marioswift 2019-02-28 13:37:02 -0800 6)
73a0b1c2 (Tom Brown 2019-04-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 laborum 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 laborumLendo a saída
Cada linha de blame é composta por quatro partes:
83253a1b (marioswift 2019-02-28 13:37:02 -0800 1) # Git Blame example
└──┬───┘ └───┬────┘ └────────┬─────────────┘ │ └──────────┬──────────┘
│ │ │ │ └─ the line's content
│ │ │ └─ line number in the file
│ │ └─ commit timestamp
│ └─ author of that commit
└─ abbreviated commit hashLinhas que compartilham o mesmo hash de commit foram modificadas juntas pela última vez. Para inspecionar o que esse commit realmente fez, copie o hash e execute git show 83253a1b.
Opções Comuns
O git blame aceita diversas opções que limitam a saída ou alteram a forma como a autoria é atribuída. As mais úteis estão resumidas abaixo.
| Comando | O que faz |
|---|---|
git blame -L 1,3 README.md | Limita a saída ao intervalo de linhas solicitado — aqui, linhas 1 a 3. Você também pode usar -L 5,+10 para começar na linha 5 e mostrar 10 linhas. |
git blame -e README.md | Exibe o endereço de e-mail de cada autor em vez do nome de usuário. |
git blame -w README.md | Ignora alterações somente de espaço em branco. Se um autor anterior apenas reindentou uma linha (por exemplo, tabs para espaços), o git blame creditaria a ele; -w ignora isso e olha para a mudança real de conteúdo. |
git blame -M README.md | Detecta linhas que foram movidas ou copiadas dentro do mesmo arquivo, e reporta o autor original em vez de quem as moveu. |
git blame -C README.md | Detecta linhas que foram movidas ou copiadas de outros arquivos, e reporta o autor original. Passe -C duas ou três vezes para uma busca mais agressiva. |
git blame -L :functionName README.md | Limita o blame a uma única função pelo nome (usa a regex funcname do Git), em vez de um intervalo numérico de linhas. |
Seguindo uma linha pelo histórico
Como o blame para no commit mais recente por linha, às vezes é necessário aprofundar um nível a mais. Assim que você tiver o hash do commit a partir da saída do blame, pode executar o blame novamente no commit anterior para ver como a linha era — e quem a escreveu — antes.
# Blame the file as it was just before commit 73a0b1c2 touched it
git blame 73a0b1c2^ -- README.mdO ^ (circunflexo) significa "o pai deste commit". Repetindo isso, você pode percorrer uma linha de volta por todo o histórico, uma revisão por vez.
Você também pode restringir o blame a um intervalo de revisões para ver apenas a autoria de uma parte específica do histórico:
# Blame README.md considering only commits between v1.0 and v2.0
git blame v1.0..v2.0 -- README.mdGit Blame vs Git Log
O comando git blame mostra o último autor que modificou uma linha, mas às vezes você pode precisar ver quando uma linha foi inicialmente adicionada. Isso é complicado usando apenas git blame — mesmo com uma combinação das opções -w, -C e -M. Para rastrear quando um trecho de texto apareceu pela primeira vez (ou foi removido), o git log é a ferramenta mais adequada.
Use git log com a opção -S (o "pickaxe") para exibir commits onde uma string específica foi adicionada ou removida.
Exemplo: encontrando quando uma string mudou
git log -S example
git log -S "CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
e339d3c85a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d John Carter Fri Jun 13 16:51:06 2015 +0200 reverted README.md to original content
509c2cc35a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d Max Fri Jul 8 13:56:14 2015 +0200 Updated README
cb20237cc1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6 Leo Sat Aug 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.A saída mostra que o arquivo README.md foi adicionado e modificado 3 vezes por três autores. A opção --pretty=format:'...' personaliza a saída do git log para exibir campos específicos como hash do commit, autor, data e assunto.
Comandos relacionados
O git blame é mais útil em conjunto com outros comandos de inspeção:
- git log — navega pelo histórico completo de commits e permite buscas com
-S/-G. - git show — exibe a mensagem completa e o diff de um commit encontrado via blame.
- git diff — compara o estado atual de uma linha com uma revisão anterior.