Descubra todos los cambios GIT en una cierta línea en un file

Tengo una línea de código que se cambió recientemente a un estado que no funciona.

¿Cómo puedo averiguar quién y en qué compromiso se modificó esta línea en particular?

Lo intenté

git log -Sone_distinct_string_from_that_line --pretty=format:'%h %an -- %s -- %ad' 

Que muestra todas las confirmaciones con comentarios y autores que cambiaron cualquier cosa donde una línea contenía "one_distinct_string_from_that_line", pero ¿cómo puedo ver los cambios reales que realizaron?

EDITAR:
También instalé git-gui y miré la línea con el git gui blame filename pero solo hay un cambio de compromiso para esa línea, aunque definitivamente ha habido más cambios.

Comprobé con el guion gráfico inteligente para ver todos los cambios realizados en ese file a mano y encontré 3 confirmaciones, donde definitivamente se editó esa línea (primero se eliminó un # y luego se volvió a agregar otro compromiso)

¿Hay alguna otra manera que no se transmita en la funcionalidad de culpa de git, y no retransmite en el supuesto de que la línea está en el commit-diff?

git blame . La opción -L toma un range de líneas y puede seleccionar un file como para el logging de git. Así que git blame -L 10,20 -- my/file.txt mostrará la última confirmación de git que tocó cada una de las líneas en ese file. git gui blame my/file.txt hace el mismo trabajo pero con una interfaz de usuario para permitirle navegar hacia atrás en el time.

Puede agregar la siguiente línea en su file .git/config en la sección [alias] :

findchange = !sh -c \"git log --pretty=format:'COMMIT %C(yellow)%h %an -- %s -- %ad%C(reset)' -G'$1' -p --word-diff-regex='[A-Za-z0-9]+|[^A-Za-z0-9]|$1' --color=always ${@:2} | egrep '$1|^COMMIT|-{3} a\\/|\\+{3} b\\/' \"

Luego, solo ejecuta el siguiente command en la línea de command:

 git findchange 'yourText' 

Explicación:

  • Modifiqué ligeramente tu bonito formatting para que puedas ver el comienzo de cada commit.
  • Usando las opciones -p para log, que muestra un parche, de ahí el p, para cada commit.
  • Usar la --word-diff-regex para definir una palabra. Esto mostrará los cambios en línea agrupados por palabras enteras o caracteres únicos sin palabras.
    • Incluido el text de búsqueda como parte de la expresión regular; de lo contrario, no detecta los casos donde el cambio abarca palabras
  • --color=always conserva el color incluso cuando se egrep a egrep .
  • egrep encuentra todas las líneas que son una de las siguientes:
    • el post de compromiso
    • el text que está buscando (eliminado o agregado)
    • el nombre original del file cambiado
    • el nuevo nombre del file cambiado

usando gitk , podrías hacer algo como eso:

 gitk -Sone_distinct_string_from_that_line -- /some_sub_dir/containing/the/file 

Obtendrá un historial parcial que contiene solo los commits donde one_distinct_string_from_that_line estaba en el diff. Para cada confirmación, puede ver el autor, los comentarios, el context y verificar qué cambió exactamente.

La parte posterior -- es opcional, restringe la búsqueda a un subdirectory de su repository.