Pregunta ¿Cómo puedo calcular el número de líneas cambiadas entre dos commits en git?


¿Hay alguna manera fácil de calcular el número de líneas cambiadas entre dos commits en git? Sé que puedo hacer un git diffy cuente las líneas, pero esto parece tedioso. También me gustaría saber cómo puedo hacer esto, incluyendo solo mis propios compromisos en los recuentos de líneas.


530
2018-03-27 04:02


origen


Respuestas:


Quiere que el --stat opción de git diff, o si está buscando analizar esto en un script, --numstat opción.

git diff --stat <commit-ish> <commit-ish>

--stat produce la salida legible para humanos que está acostumbrado a ver después de las fusiones; --numstat produce un buen diseño de tabla que los scripts pueden interpretar fácilmente.

De alguna manera me perdí de que estabas buscando hacer esto en múltiples compromisos al mismo tiempo, esa es una tarea para git log. Ron DeVera toca esto, pero en realidad puedes hacer mucho más de lo que él menciona. Ya que git log internamente llama a la maquinaria de diff para imprimir la información solicitada, puede darle cualquiera de las opciones de estadísticas de diff, no solo --shortstat. Lo que probablemente quieras usar es:

git log --author="Your name" --stat <commit1>..<commit2>

pero puedes usar --numstat o --shortstat también. git log también puede seleccionar commits de muchas otras formas, eche un vistazo a documentación. Puede que te interesen cosas como --since (en lugar de especificar intervalos de compromiso, solo seleccione confirmaciones desde la semana pasada) y --no-merges (las asignaciones de fusión en realidad no introducen cambios), así como las opciones de salida bonitas (--pretty=oneline, short, medium, full...)

Aquí hay una línea para obtener los cambios totales en lugar de los cambios por commit del registro de git (cambie las opciones de selección de confirmación como desee; esto es confirmado por usted, de commit1 a commit2):

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(tienes que dejar que git log imprima alguna información de identificación sobre el commit; escogí arbitrariamente el hash, luego usé awk para seleccionar solo las líneas con tres campos, que son los que tienen la información estadística)


810
2018-03-27 04:14



Para los perezosos, usa git log --stat.


141
2017-10-26 21:59



git diff --shortstat

le da solo el número de líneas cambiadas y agregadas.


68
2017-12-23 21:17



git diff --stat commit1 commit2

EDITAR: También debe especificar los commits (sin parámetros, compara el directorio de trabajo con el índice). P.ej.

git diff --stat HEAD^ HEAD

para comparar el padre de HEAD con HEAD.


38
2018-03-27 04:14



Suponiendo que desea comparar todas sus confirmaciones entre abcd123 (la primera confirmación) y wxyz789 (la última confirmación), inclusive:

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

Esto proporciona resultados breves como:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

15
2018-03-27 04:21



Otra forma de obtener todo el registro de cambios en un período de tiempo especificado

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

Salida:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

Con un contenido de salida largo, puede exportar a un archivo para leer más

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

7
2018-03-17 07:58