¿Qué hace 'git blame'?

314

Vi muchas preguntas sobre los métodos de uso git blame, pero realmente no las entiendo.

Veo un Blamebotón en la parte superior de los archivos en la interfaz de GitHub. Al hacer clic, muestra algunas diferencias con los nombres de usuario en la barra izquierda. ¿Qué indica eso?

¿Por qué se git blameusa realmente, aparte de GitHub?

Himanshu Mishra
fuente
67
Si también suena "culpa", bueno, culpa tuya, puedes instalar este script y usar git praiseen su lugar :) github.com/ansman/git-praise
Jon Kiparsky
77
No debe ser ni culpa ni alabanza; es inherentemente supuesta y debería haber sido objetiva.
pdvries
41
git objectively-determine-contributersimplemente no tiene el mismo timbre.
Ritwik Bose
27
@RitwikBose o simplementegit who
aktivb

Respuestas:

238

De git-culpa :

Anota cada línea en el archivo dado con información de la revisión que modificó la última línea. Opcionalmente, comience a anotar desde la revisión dada.

Cuando se especifica una o más veces, -L restringe la anotación a las líneas solicitadas.

Ejemplo:

[email protected]:~# git blame .htaccess
...
^e1fb2d7 (John Doe 2015-07-03 06:30:25 -0300  4) allow from all
^72fgsdl (Arthur King 2015-07-03 06:34:12 -0300  5)
^e1fb2d7 (John Doe 2015-07-03 06:30:25 -0300  6) <IfModule mod_rewrite.c>
^72fgsdl (Arthur King 2015-07-03 06:34:12 -0300  7)     RewriteEngine On
...

Tenga en cuenta que git blameno muestra el historial de modificaciones por línea en sentido cronológico. Solo muestra quién fue la última persona que cambió una línea en un documento hasta la última confirmación HEAD.

Es decir, para ver el historial / registro completo de una línea de documento, necesitará ejecutar un git blame path/to/filepara cada confirmación en su git log.

marca
fuente
1
entonces es solo para ver a la última persona?
Rıfat Erdem Sahin
2
Sí, le permite ver a la última persona que cambió la línea.
Mark
@ Mark Entonces, cuando hacemos anotaciones en un IDE, ¿internamente hace un comando git blame?
Nagarajan Shanmuganathan
2
@NagarajanShanmuganathan sí, si usas git, eso es lo que sucede detrás de escena.
Marque el
153

El comando se explica bastante bien. Es averiguar qué compañero de trabajo escribió la línea específica o arruinó el proyecto, para que pueda culparlos :)

Radiografía
fuente
105
El comando en realidad parece que culparás a alguien al ejecutarlo. Al menos así es como me sonó antes de saber lo que hizo en esta publicación.
Francisco C.
12
@FranciscoC. estás buscando esto: github.com/jayphelps/git-blame-someone-else
DustWolf
2
@FranciscoC. espera, ¿no hace exactamente eso, es decir, te permite culpar a alguien más?
IanDess
16
@IanDess Quizás sea solo semántica, pero git blamesuena como si tuviera algún efecto persistente, similar a git commit, donde, de hecho, solo te informa sobre los cambios realizados por quién. Eso y la connotación negativa que conlleva la palabra "culpa", hacen que el comando suene como algo de lo que debe mantenerse alejado y lleva a preguntas como esta que buscan aclaración.
Francisco C.
20
Claramente, debería llamarse git praise.
pfnuesel
75

De GitHub :

El comando blame es una característica de Git, diseñada para ayudarlo a determinar quién realizó cambios en un archivo.

A pesar de su nombre que suena negativo, la culpa de git es en realidad bastante inocuo; su función principal es señalar quién cambió qué líneas en un archivo y por qué. Puede ser una herramienta útil para identificar cambios en su código.

Básicamente, git-blamese usa para mostrar qué revisión y autor modificaron por última vez cada línea de un archivo. Es como verificar el historial del desarrollo de un archivo.

Himanshu Mishra
fuente
2
Esto me parece redundante, puede ver una diferencia entre confirmaciones e ID del usuario desde el registro de confirmaciones. Si estoy entendiendo todo aquí, tiene menos persistencia que el historial de confirmación. Tal vez me estoy perdiendo algo, pero parece que los estándares de codificación se aplican a través de la humillación pública.
user1431356
8
Supongo que el nombre del comando fue el resultado del sentido del humor específico de Linus :) No estaba destinado a humillar a nadie :) era solo una elección divertida (o no) para el nombre de un comando útil :)
Mladen B.
2
@ user1431356: el punto es que desea la primera línea de registro que afecta a una línea en particular . De lo contrario, deberá buscar en los registros una cadena en particular. (Lo cual es un enfoque viable; busque en las páginas del manual "git log -S".)
azernik
1
El título de "culpa" es algo que ha existido durante años antes de git. Solo mira la implementación de svn . No era un nombre dado por Linus Torvalds.
JackAce
"Supongo que el nombre del comando fue el resultado del sentido del humor específico de Linus :) No estaba destinado a ser usado para humillar a nadie :)" jajaja ... Más como si fuera la personalidad de Linus y SINO que fuera humillar a alguien.
Sinaesthetic
34

El git blamecomando se utiliza para saber quién / qué commit es responsable de los últimos cambios realizados en un archivo. También se puede ver el autor / commit de cada línea.

git blame filename (se compromete responsable de los cambios para todas las líneas en el código)

git blame filename -L 0,10 (se compromete responsable de los cambios de la línea "0" a la línea "10")

Hay muchas otras opciones para culpar, pero en general estas podrían ayudar.

Bharath TS
fuente
2

El git blamecomando anota líneas con información de la revisión que modificó la última línea, y ... con Git 2.22 (Q2 2019), lo hará más rápido , debido a una corrección de rendimiento alrededor de " git blame", especialmente en un historial lineal (que es el norma para la que deberíamos optimizar).

Ver commit f892014 (02 abr 2019) por David Kastrup ( fedelibre) . (Fusionada por Junio ​​C Hamano - gitster- en commit 4d8c4da , 25 abr 2019)

blame.c: no sueltes los blobs de origen tan ansiosamente

Cuando un blob principal ya tiene trozos en cola para culpar, dejar caer el blob al final de un paso de culpa hará que se vuelva a cargar de inmediato, duplicando la cantidad de E / S y desempacando al procesar un historial lineal.

Mantener tales blobs principales en la memoria parece una optimización razonable que debería generar una presión de memoria adicional principalmente al procesar las fusiones de ramas antiguas.

VonC
fuente
1

El git blamecomando se usa para examinar el contenido de un archivo línea por línea y ver cuándo se modificó por última vez cada línea y quién fue el autor de las modificaciones.

Si hubo un error en el código, úselo para identificar quién lo recuperó, entonces puede culparlo. Culpar a Git es culpar (d).

Si necesita conocer el historial de un código de línea, use git log -S"code here", más simple que git blame.

git log vs culpa git

JackChouMine
fuente