C'è un modo per avere git show righe aggiunte, righe modificate e righe rimosse?


110

"git diff --stat" e "git log --stat" mostrano l'output come:

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

Ma ciò che è realmente accaduto in quel commit è stato che 4 righe sono state modificate e 26 righe sono state eliminate, il che è diverso dall'aggiunta di 4 righe e dalla cancellazione di 30.

C'è un modo per ottenere le LOC delta (26 in questo caso)? Non mi interessa davvero distinguere tra le linee aggiunte o rimosse.

Risposte:


127

Puoi usare:

git diff --numstat

per ottenere informazioni sulle differenze numeriche.

Per quanto riguarda la separazione della modifica da una coppia di aggiunta e rimozione, --word-diffpotrebbe essere d'aiuto. Potresti provare qualcosa di simile:

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

È un po 'prolisso, quindi potresti volerlo analizzare nel tuo script.


2
Grazie quornian ma numstat fornisce esattamente le stesse informazioni di statistiche, aggiunte e cancellazioni.
Juan Alonso

Aggiornata la mia risposta per includere un esempio di utilizzo di --word-diff. Potrebbe essere più utile.
quorniano

14
L'output di git diff --numstatè suddiviso per file. Per vedere il totale aggiunto / rimosso per il diff, puoi collegarlo a awk:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
hughes

15
@hughes Sarebbe un modo più semplice per ottenere le stesse informazioni git diff --shortstat. Nella mia esperienza equivale ad accumulare l'output di git diff --numstat.
klaus triendl

1
Anche FWIW per vedere le statistiche per i cambiamenti in scena, aggiungi semplicemente--cached
xlm

65
  1. Se vuoi conoscere le righe aggiunte / modificate / eliminate da un commit con id commit-id, puoi usare

    git show commit-id --stat
    

    o

    git diff commit-id-before commit-id --stat
    
  2. Se vuoi conoscere le righe aggiunte / modificate / eliminate da un intervallo di commit, puoi usare

    git diff commit-id1 commit-id2 --stat
    
  3. Se vuoi conoscere le righe aggiunte / modificate / eliminate da ogni commit, puoi usare

    git log --stat
    

Quella soluzione non risponde alla domanda, "git --stat" conta una singola riga modificata come "1 inserimento e 1 eliminazione". La domanda chiede come ottenere "1 cambiato".
Juan Alonso

6

Se tutti i tuoi file sono predisposti per il commit, per vedere --numstatcome procedere:

git diff --numstat HEAD~

4

git usa diff "unificato", che ha solo aggiunto ed eliminato righe, come formato diff. Devi fare qualcosa di esterno per ottenere un diff che mostri l'aggiunta, l'eliminazione e la modifica delle informazioni.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git fornisce collegamenti a uno script che consente di eseguire il vecchio "diff" regolare - e da questo è possibile generare un output di diff "contestuale" . La differenza di contesto mostra le righe aggiunte, rimosse e modificate, il che dovrebbe consentire di ottenere i dati desiderati.


3

È possibile utilizzare diffstatper mostrare il numero di righe modificate. Per esempio:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

L' -Copzione è per ottenere l'output colorato; l' -mopzione è per mostrare il numero di righe modificate. Output di esempio:

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

Il conteggio del numero di righe modificate è approssimativo, come man diffstatdice:

-m unisci i conteggi di inserimento / eliminazione da ogni "blocco" del file di patch per approssimare un conteggio delle righe modificate.

Una delle principali differenze tra git diff --state diffstat: diffstatnon mostra gli spostamenti / rinomina dei file (ad esempio app/{a.rb => b.rb}).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.