Por qué blame
Blame responde "¿quién escribió esta línea y por qué?" — la puerta de entrada para excavar la historia cuando algo parece mal, sospechoso o sorprendentemente inteligente.
Lo básico
git blame src/checkout.js
git blame -L 40,60 src/checkout.js
Seguir código movido
git blame -M src/checkout.js # seguir movimientos en el archivo
git blame -C src/checkout.js # seguir movimientos entre archivos
git blame -CCC src/checkout.js # detección agresiva entre archivos
Ignorar commits ruidosos
# .git-blame-ignore-revs
abc1234567890 # Aplicar prettier al codebase
def4567890123 # Aplicar black a todo Python
git blame --ignore-revs-file=.git-blame-ignore-revs src/checkout.js
git config blame.ignoreRevsFile .git-blame-ignore-revs
Blame por contenido
git log -S 'EMAIL_REGEX' -- src/
git log -G 'email.*regex' --pickaxe-regex -- src/
Buscar una regresión
git blame -L 40,60 src/checkout.js
git show <sha>
git log --follow -p src/checkout.js
git bisect start
git bisect bad HEAD
git bisect good <earlier-sha>
Vistas anotadas en editores
GitLens de VS Code, annotate integrado de JetBrains y fugitive.vim de Vim ofrecen blame interactivo.
Blame inverso
git log --reverse --follow -p -L 40,60:src/checkout.js
Blame sin historia
git blame --line-porcelain src/checkout.js | \
sed -n 's/^author //p' | sort | uniq -c | sort -rn
Etiqueta
Blame es para entender, no para señalar con el dedo.