¿Hay alguna forma de que git le proporcione un registro de confirmación solo para las confirmaciones que tocaron una línea particular en un archivo?
Me gusta git blame
, pero git blame
le mostrará la ÚLTIMA confirmación que tocó una línea en particular.
Realmente me gustaría obtener un registro similar, no la lista de confirmaciones en cualquier parte del archivo, sino solo las confirmaciones que tocaron una línea en particular.
Respuestas:
Ver también Git: descubre qué commits alguna vez tocaron un rango de líneas .
Desde Git 1.8.4 ,
git log
tiene-L
que ver la evolución de una gama de líneas.Por ejemplo, suponga que mira
git blame
la salida de. Aquí-L 150,+11
significa "solo mirar las líneas 150 a 150 + 11":Y quieres saber la historia de lo que ahora es la línea 155.
Entonces, use
git log
. Aquí,-L 155,155:git-web--browse.sh
significa "rastrear la evolución de las líneas 155 a 155 en el archivo llamadogit-web--browse.sh
".fuente
git log commitA-hash -L 155,155:file-name
?Puede obtener un conjunto de confirmaciones utilizando pick-ax.
Esto le dará todas las confirmaciones que afectaron ese texto en ese archivo. Si se cambió el nombre del archivo en algún momento, puede agregar --follow-parent.
Si desea inspeccionar las confirmaciones en cada una de estas ediciones, puede canalizar ese resultado a git show:
fuente
git log -S'the previous version of the line'
y demás, exactamente como terminarías haciendogit blame -L
. Y será mucho más lento quegit blame
, ya que tiene que buscar el texto en todas partes, no solo en el lugar dado.Intente usar el siguiente comando implementado en Git 1.8.4.
Entonces, en tu caso
upperLimit
ylowerLimit
es el tocadoline_number
Más información: https://www.techpurohit.com/list-some-useful-git-commands
fuente
--pretty=short
se ignora cuando se usa-L
. Por favor corrijaUna manera extremadamente fácil de hacer esto es usando vim-fugitive . Simplemente abra el archivo en vim, seleccione las líneas que le interese usar
V
, luego ingreseAhora puede usar
:cnext
y:cprev
para ver todas las revisiones del archivo donde se modifica esa línea. En cualquier momento, ingrese:Gblame
para ver la información de sha, autor y fecha.fuente
Simplificando la respuesta de @ matt -
git blame -L14,15 -- <file_path>
Aquí tendrás la culpa de las líneas
14 to 15
.Como la
-L
opción se esperaRange
como un parámetro, no podemos obtener unaBlame
para una sola línea usando la-L
opción ' .Referencia
fuente
No creo que haya nada incorporado para esto. Se vuelve complicado por el hecho de que es raro que una sola línea cambie varias veces sin que el resto del archivo cambie sustancialmente también, por lo que tenderá a terminar con los números de línea cambiando mucho.
Si tiene la suerte de que la línea siempre tenga alguna característica de identificación, por ejemplo, una asignación a una variable cuyo nombre nunca cambió, puede usar la opción regex para
git blame -L
. Por ejemplo:Pero esto solo encuentra la primera coincidencia para esa expresión regular, por lo que si no tiene una buena manera de hacer coincidir la línea, no es demasiado útil.
Podrías hackear algo, supongo. No tengo tiempo para escribir código en este momento, pero ... algo en este sentido. Ejecutar
git blame -n -L $n,$n $file
. El primer campo es el commit anterior tocado, y el segundo campo es el número de línea en ese commit, ya que podría haber cambiado. Agárrelos y ejecútelosgit blame -n $n,$n $commit^ $file
, es decir, lo mismo a partir de la confirmación antes de la última vez que se modificó el archivo.(Tenga en cuenta que esto le fallará si la última confirmación que cambió la línea fue una confirmación de fusión. La forma principal en que esto podría suceder si la línea se cambia como parte de una resolución de conflicto de fusión).
Editar: Me encontré con esta publicación de la lista de correo de marzo de 2011 hoy, que menciona eso
tig
ygit gui
tiene una función que lo ayudará a hacer esto. Parece que la característica se ha considerado, pero no está terminada, para git en sí.fuente
Esto requerirá
git blame
que cada revisión significativa muestre una línea$LINE
de archivo$FILE
:Como de costumbre, la culpa muestra el número de revisión al comienzo de cada línea. Puedes agregar
para obtener resultados agregados, algo así como una lista de confirmaciones que cambiaron esta línea. (No del todo, si el código solo se ha movido, esto podría mostrar la misma ID de confirmación dos veces para diferentes contenidos de la línea. Para un análisis más detallado, tendría que hacer una comparación retrasada de los
git blame
resultados de las confirmaciones adyacentes. ¿Alguien? )fuente
Aquí hay una solución que define un alias git, por lo que podrá usarlo así:
Ejemplo de salida:
Puede definir el alias en su .gitconfig o simplemente ejecutar el siguiente comando
Esta es una línea fea, así que aquí hay una función de bash equivalente ofuscada:
La solución pickaxe ( git log --pickaxe-regex -S'REGEX ' ) solo le dará adiciones / eliminaciones de línea, no las otras alteraciones de la línea que contiene la expresión regular.
Una limitación de esta solución es que git blame solo devuelve la primera coincidencia REGEX, por lo que si existen varias coincidencias, la recursión puede "saltar" para seguir otra línea. Asegúrese de verificar la salida del historial completo para detectar esos "saltos" y luego arregle su REGEX para ignorar las líneas de parásitos.
Finalmente, aquí hay una versión alternativa que ejecuta git show en cada confirmación para obtener la diferencia completa:
fuente
Puede mezclar
git blame
ygit log
comandos para recuperar el resumen de cada confirmación en el comando git blame y agregarlos. Algo así como el siguiente script bash + awk. Agrega el resumen de confirmación como comentario de código en línea.En una linea:
fuente
En mi caso, el número de línea había cambiado mucho con el tiempo. También estaba en git 1.8.3 que no admite expresiones regulares en "git blame -L". (RHEL7 todavía tiene 1.8.3)
Un trazador de líneas:
Por supuesto, esto se puede convertir en un script o una función.
fuente