git blame
Mostrar quién cambió por última vez cada línea de un archivo
El comando 'git blame' imprime un archivo con, para cada línea, el commit que la cambió por última vez, su autor y su fecha. Es la forma más rápida de saber por qué una línea es así: toma el hash y luego lee el commit completo con git show. Las líneas que aún no confirmaste aparecen como «Not Committed Yet». Usa -L para mirar solo unas líneas.
Sinopsis
git blame [<options>] [<rev>] [--] <file>Opciones
Elegir la opción adecuada
Encontrar de dónde vino un cambio
Tres herramientas, tres preguntas
| Comando | Responde |
|---|---|
git blame file | ¿Qué commit tocó cada línea por última vez? |
git log -p file | Cada cambio hecho alguna vez al archivo |
git log -S "text" | ¿Qué commit añadió o quitó este texto? |
Ejemplos
Blame de un archivo
git blame app.jsCada línea con su último commit, autor y fecha.
Un rango de líneas
git blame -L 10,20 app.jsSolo las líneas 10 a 20.
Una versión anterior
git blame v1.0 -- app.jsBlame del archivo tal como estaba en el tag v1.0.
Ejemplos de flujos de trabajo
git blame -L 40,45 app.jsEncontrar el commit de la línea
git show a1b2c3dLeer el commit completo y su mensaje
Solución de problemas
fatal: no such path 'x' in HEAD
Causa: El archivo no tiene seguimiento, o la ruta es incorrecta
Confirma primero el archivo, o revisa la ruta
Todas las líneas apuntan a un commit de reformateo
Causa: Blame muestra el ÚLTIMO cambio
Usa --ignore-rev <commit>, o haz blame del commit anterior
Consejos y trampas
Buenas prácticas
- ✓Lee el commit (git show) antes de sacar conclusiones de blame.
- ✓Mantén un archivo .git-blame-ignore-revs con los commits de solo formato.
Errores comunes
- ✗Tomar blame como culpa: la última persona que tocó una línea quizá solo la reformateó.
- ✗Detenerse en un commit de formato en lugar de hacer blame de su padre (git blame <hash>^ -- file).
- ✗Olvidar -L en archivos grandes y desplazarse por miles de líneas.
Preguntas frecuentes
La línea viene del primer commit del historial: blame no pudo ir más atrás.
Una línea que cambiaste en tu copia de trabajo pero aún no confirmaste.