W3docs

git blame

Información útil sobre el comando git blame, cómo funciona con ejemplos y las opciones más comunes.

Descripción

El comando git blame anota cada línea de un archivo con información sobre el último commit que la modificó — el hash del commit, el autor y la marca de tiempo. En otras palabras, por cada línea responde a la pregunta "¿quién escribió esto y cuándo?".

Es un comando de inspección de solo lectura. No cambia el historial ni los archivos; únicamente muestra metadatos que ya existen en el repositorio. Los desarrolladores recurren a git blame para:

  • Encontrar al autor de una línea confusa o con errores y poder preguntar sobre la intención detrás de ella.
  • Localizar el commit que introdujo un cambio y luego leer su mensaje completo con git show.
  • Entender cómo evolucionó un archivo cuando el historial de commits solo no es suficientemente preciso para señalar una línea concreta.

git blame

Información

git blame muestra solo el commit más reciente que modificó cada línea. Si una línea fue editada varias veces, los autores anteriores quedan ocultos. Para rastrear una línea más atrás en el tiempo, vuelve a ejecutar blame en una revisión más antigua (consulta Seguir una línea a través del historial más abajo).

Cómo funciona

Para mostrar claramente cómo funciona git blame, consideremos un ejemplo con un archivo README.md y varios commits de distintos autores.

En el siguiente ejemplo usamos git blame. El estado del repositorio de ejemplo puede explorarse con git log. El historial de commits tiene este aspecto:

git log y 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 Bitbucket

El comando git blame trabaja sobre archivos individuales. La ejecución predeterminada de git blame muestra la información de blame para el archivo especificado.

La siguiente salida es un subconjunto de la salida completa de blame del archivo 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 laborum

Lectura de la salida

Cada línea de blame se compone de cuatro 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 hash

Las líneas que comparten el mismo hash de commit fueron modificadas juntas por última vez. Para inspeccionar lo que hizo ese commit, copia el hash y ejecuta git show 83253a1b.

Opciones comunes

git blame acepta varias opciones que limitan la salida o cambian la forma en que se atribuye la autoría. Las más útiles se resumen a continuación.

ComandoQué hace
git blame -L 1,3 README.mdLimita la salida al rango de líneas indicado — en este caso, las líneas 1 a 3. También puedes usar -L 5,+10 para empezar en la línea 5 y mostrar 10 líneas.
git blame -e README.mdMuestra la dirección de correo electrónico de cada autor en lugar de su nombre de usuario.
git blame -w README.mdIgnora los cambios que solo afectan a espacios en blanco. Si un autor anterior solo reindentó una línea (por ejemplo, de tabulaciones a espacios), git blame normalmente le atribuiría ese cambio; -w lo omite y apunta al cambio de contenido real.
git blame -M README.mdDetecta líneas que fueron movidas o copiadas dentro del mismo archivo y reporta al autor original en lugar de quien las movió.
git blame -C README.mdDetecta líneas que fueron movidas o copiadas desde otros archivos y reporta al autor original. Pasa -C dos o tres veces para una búsqueda más exhaustiva.
git blame -L :functionName README.mdLimita blame a una sola función por nombre (usa la expresión regular funcname de Git) en lugar de un rango de líneas numérico.

Seguir una línea a través del historial

Dado que blame se detiene en el commit más reciente por línea, a veces es necesario profundizar un paso más. Una vez que tienes el hash del commit en la salida de blame, puedes volver a ejecutar blame en el commit anterior a ese para ver cómo era la línea — y quién la escribió — antes.

# Blame the file as it was just before commit 73a0b1c2 touched it
git blame 73a0b1c2^ -- README.md

El ^ (acento circunflejo) significa "el padre de este commit". Repetir esto permite recorrer una línea hacia atrás a través de todo su historial, una revisión a la vez.

También puedes restringir blame a un rango de revisiones para ver solo la autoría de una parte concreta del historial:

# Blame README.md considering only commits between v1.0 and v2.0
git blame v1.0..v2.0 -- README.md

Git Blame vs Git Log

El comando git blame muestra el último autor que modificó una línea, pero a veces puede que necesites saber cuándo se añadió una línea por primera vez. Esto es complicado con git blame solo — incluso combinando las opciones -w, -C y -M. Para rastrear cuándo apareció (o se eliminó) un fragmento de texto por primera vez, git log es la herramienta más adecuada.

Usa git log con la opción -S (el "pickaxe") para mostrar los commits en los que se añadió o eliminó una cadena específica.

Ejemplo: encontrar cuándo cambió una cadena

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.

La salida muestra que el archivo README.md fue añadido y modificado 3 veces por tres autores. La opción --pretty=format:'...' personaliza la salida de git log para mostrar campos específicos como el hash del commit, el autor, la fecha y el asunto.

Comandos relacionados

git blame es más útil junto con otros comandos de inspección:

  • git log — navega por el historial completo de commits y búscalo con -S/-G.
  • git show — muestra el mensaje completo y el diff de un commit encontrado mediante blame.
  • git diff — compara el estado actual de la línea con una revisión anterior.

Práctica

Práctica
¿Cuáles son las funciones y opciones del comando 'git blame' en Git?
¿Cuáles son las funciones y opciones del comando 'git blame' en Git?
Was this page helpful?