¿Hay alguna forma de agregar líneas de git show, cambiar líneas y eliminar líneas?

110

"git diff --stat" y "git log --stat" muestran resultados como:

$ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07
 app/controllers/application_controller.rb |   34 +++-------------------------
 1 files changed, 4 insertions(+), 30 deletions(-)

Pero lo que realmente sucedió en ese compromiso fue que se cambiaron 4 líneas y se eliminaron 26 líneas, lo que es diferente a agregar 4 líneas y eliminar 30.

¿Hay alguna forma de obtener los LOC delta (26 en este caso)? Realmente no me importa diferenciar entre líneas agregadas o eliminadas.

Juan Alonso
fuente

Respuestas:

127

Puedes usar:

git diff --numstat

para obtener información numérica de diferencias.

En cuanto a separar la modificación de un par de agregar y quitar, --word-diffpodría ayudar. Podrías probar algo como esto:

MOD_PATTERN='^.+(\[-|\{\+).*$' \
ADD_PATTERN='^\{\+.*\+\}$' \
REM_PATTERN='^\[-.*-\]$' \
git diff --word-diff --unified=0 | sed -nr \
    -e "s/$MOD_PATTERN/modified/p" \
    -e "s/$ADD_PATTERN/added/p" \
    -e "s/$REM_PATTERN/removed/p" \
    | sort | uniq -c

Es un poco largo, por lo que es posible que desee analizarlo en su propio script.

quornian
fuente
2
Gracias quornian, pero numstat da exactamente la misma información que estadísticas, adiciones y eliminaciones.
Juan Alonso
Actualicé mi respuesta para incluir un uso de ejemplo de --word-diff. Eso podría ser más útil.
quornian
14
La salida de git diff --numstatse desglosa por archivo. Para ver el total agregado / eliminado para la diferencia, puede canalizarlo a awk:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
hughes
15
@hughes Una forma más sencilla de obtener la misma información sería git diff --shortstat. En mi experiencia, es equivalente a acumular la salida de git diff --numstat.
Klaus Triendl
1
También FWIW para ver las estadísticas de los cambios por etapas, simplemente agregue--cached
xlm
65
  1. Si desea conocer las líneas agregadas / cambiadas / eliminadas por una confirmación con id commit-id, puede usar

    git show commit-id --stat
    

    o

    git diff commit-id-before commit-id --stat
    
  2. Si desea conocer las líneas agregadas / cambiadas / eliminadas por un rango de confirmaciones, puede usar

    git diff commit-id1 commit-id2 --stat
    
  3. Si desea conocer las líneas agregadas / cambiadas / eliminadas por cada confirmación, puede usar

    git log --stat
    
yhluo
fuente
Esa solución no responde a la pregunta, "git --stat" cuenta una sola línea modificada como "1 inserción y 1 eliminación". La pregunta pregunta cómo conseguir "1 cambio".
Juan Alonso
6

Si todos sus archivos están preparados para su confirmación, vea el proceso de --numstatesta manera:

git diff --numstat HEAD~
Falieson
fuente
4

git usa diff "unificado", que solo ha agregado y eliminado líneas, como formato diff. Tienes que hacer algo externo para obtener una diferencia que muestre agregar, eliminar y cambiar información.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git da enlaces a una secuencia de comandos que permite ejecutar viejo "diff" regular - y de que se puede generar un "contexto" diff de salida. La diferencia de contexto muestra líneas agregadas, eliminadas y modificadas, lo que debería permitirle obtener los datos que desea.

Daniel Pittman
fuente
3

Puede utilizar diffstatpara mostrar el número de líneas modificadas. Por ejemplo:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

La -Copción es para obtener resultados coloreados; la -mopción es para mostrar el número de líneas modificadas. Salida de muestra:

 app/controllers/application_controller.rb |   30 -------------------!!!
 1 files changed, 0 insertions(+), 26 deletions(-), 4 modifications(!)

El recuento del número de líneas modificadas es aproximado, como man diffstatdice:

-m fusionar recuentos de inserción / eliminación de cada "fragmento" del archivo de parche para aproximar un recuento de las líneas modificadas.

Una diferencia importante entre git diff --staty diffstat: diffstatno muestra movimientos / cambios de nombre de archivos (por ejemplo app/{a.rb => b.rb}).

Flujo
fuente