git blame
Mostrar quem alterou por último cada linha de um arquivo
O comando 'git blame' imprime um arquivo com, para cada linha, o commit que a alterou por último, o autor e a data. É o jeito mais rápido de descobrir por que uma linha está assim: pegue o hash e leia o commit completo com git show. Linhas ainda não commitadas aparecem como «Not Committed Yet». Use -L para ver só algumas linhas.
Sinopse
git blame [<options>] [<rev>] [--] <file>Opções
Escolhendo a opção certa
Descobrir de onde veio uma alteração
Três ferramentas, três perguntas
| Comando | Responde |
|---|---|
git blame file | Qual commit tocou cada linha por último? |
git log -p file | Cada alteração já feita no arquivo |
git log -S "text" | Qual commit adicionou ou removeu este texto? |
Exemplos
Blame de um arquivo
git blame app.jsCada linha com seu último commit, autor e data.
Um intervalo de linhas
git blame -L 10,20 app.jsSó as linhas 10 a 20.
Uma versão mais antiga
git blame v1.0 -- app.jsBlame do arquivo como estava na tag v1.0.
Exemplos de fluxos de trabalho
git blame -L 40,45 app.jsEncontrar o commit da linha
git show a1b2c3dLer o commit inteiro e a mensagem
Solução de problemas
fatal: no such path 'x' in HEAD
Causa: O arquivo não é rastreado, ou o caminho está errado
Faça o commit do arquivo antes, ou confira o caminho
Toda linha aponta para um commit de reformatação
Causa: O blame mostra a ÚLTIMA alteração
Use --ignore-rev <commit>, ou faça blame do commit anterior
Dicas e armadilhas
Boas práticas
- ✓Leia o commit (git show) antes de tirar conclusões do blame.
- ✓Mantenha um arquivo .git-blame-ignore-revs listando commits só de formatação.
Erros comuns
- ✗Levar o blame como culpa: a última pessoa a tocar uma linha pode só tê-la reformatado.
- ✗Parar num commit de formatação em vez de fazer blame do pai dele (git blame <hash>^ -- file).
- ✗Esquecer o -L em arquivos grandes e rolar milhares de linhas.
Perguntas frequentes
A linha vem do primeiro commit do histórico: o blame não pôde voltar mais.
Uma linha que você alterou na cópia de trabalho mas ainda não commitou.