Saltar al contenido

git blame

Descripción

El comando git blame es una herramienta flexible con varias opciones de uso. La función más importante del comando git blame es mostrar los metadatos del autor asociados a una línea concreta confirmada en un archivo. Se utiliza para explorar el historial del archivo y averiguar cuál fue el último autor que cambió la línea.

git blame

Cómo funciona

Para mostrar claramente cómo funciona git blame, consideremos un ejemplo en el que tenemos un archivo README.md con algunos commits de distintos autores.

En el siguiente ejemplo, usamos git blame. El estado del repositorio de ejemplo se puede explorar con un git log. El historial de commits se ve así:

git log and git blame

bash
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 funciona 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

bash
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

Opciones comunes

También puedes limitar la salida a líneas específicas usando la opción -L, como se muestra en la tabla de abajo.

git blame -L 1,3 README.mdLimita la salida al rango de líneas solicitado. Aquí hemos limitado la salida a las líneas 1 a 3.
git blame -e README.mdMuestra la dirección de correo electrónico del autor en lugar del nombre de usuario.
git blame -w README.mdIgnora los cambios de espacios en blanco. Si un autor anterior modificó el espaciado (por ejemplo, cambiando tabulaciones por espacios), puede ocultar los cambios reales de contenido en la salida.
git blame -M README.mdLa opción -M detecta líneas movidas o copiadas dentro del mismo archivo. Esto informará del autor original de las líneas en lugar del último autor que las movió o copió.
git blame -C README.mdLa opción -C detecta líneas que se movieron o copiaron desde otros archivos. Esto informará del autor original de las líneas en lugar del último autor que las movió o copió.
git blame -p README.mdMuestra la salida completa del diff para cada línea, lo que facilita ver exactamente qué se cambió.

Git Blame vs Git Log

El comando git blame muestra el último autor que cambió una línea, pero a veces puede que necesites ver cuándo se añadió inicialmente una línea. Esto puede ser difícil de hacer con git blame. Para este propósito, se puede usar una combinación de las opciones -w, -C y -M. Pero será más fácil usar git log.

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

Tomemos el siguiente ejemplo:

git log -S example

bash
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
509c2cc35a1b2c3d4e5f6a7b8c9c0d1e2f3a4b5c6 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 se añadió y modificó 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.

Práctica

What are the functions and options of the 'git blame' command in Git?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.