Esiste un modo semplice per calcolare il numero di righe modificate tra due commit in git?
So che posso fare un git diff
, e contare le linee, ma questo sembra noioso. Vorrei anche sapere come posso farlo, compresi solo i miei commit nei conteggi.
Esiste un modo semplice per calcolare il numero di righe modificate tra due commit in git?
So che posso fare un git diff
, e contare le linee, ma questo sembra noioso. Vorrei anche sapere come posso farlo, compresi solo i miei commit nei conteggi.
Risposte:
Vuoi l' --stat
opzione di git diff
, o se stai cercando di analizzarla in uno script, l' --numstat
opzione.
git diff --stat <commit-ish> <commit-ish>
--stat
produce l'output leggibile dall'uomo che sei abituato a vedere dopo le fusioni; --numstat
produce un bel layout di tabella che gli script possono interpretare facilmente.
In qualche modo mi mancava che stavi cercando di farlo su più commit contemporaneamente - questo è un compito per git log
. Ron DeVera ci tocca, ma in realtà puoi fare molto di più di quello che menziona. Dato che git log
chiama internamente il macchinario diff per stampare le informazioni richieste, puoi fornirle una qualsiasi delle opzioni stat stat - non solo --shortstat
. Quello che probabilmente vuoi usare è:
git log --author="Your name" --stat <commit1>..<commit2>
ma puoi usare --numstat
o --shortstat
pure. git log
può anche selezionare commit in vari altri modi - dai un'occhiata alla documentazione . Potresti essere interessato a cose come --since
(piuttosto che specificare intervalli di commit, seleziona i commit solo dalla scorsa settimana) e --no-merges
(i commit di unione non introducono effettivamente modifiche), così come le graziose opzioni di output ( --pretty=oneline, short, medium, full...
).
Ecco un one-liner per ottenere le modifiche totali invece delle modifiche per commit dal registro git (cambia le opzioni di selezione del commit come desiderato - questo è il tuo commit, da 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)}'
(devi lasciare che git log stampi alcune informazioni identificative sul commit; ho scelto arbitrariamente l'hash, quindi ho usato awk per selezionare solo le linee con tre campi, che sono quelli con le informazioni stat)
git diff --shortstat <commit1> <commit2>
era quello che volevo.
--since
e --until
è qualcosa di simile: yesterday
, 1 month 2 weeks 3 days 1 hour 1 second ago
, o1979-02-26 18:30:00
<commit-ish>
funziona con tutto ciò che rappresenta un commit, inclusi commit letterali, branch, tag e ref in generale. Vedi anche stackoverflow.com/questions/23303549/…
Per i più pigri, usa git log --stat
.
-10
per mostrare i dieci commit precedenti.
Q
per tornare al terminale.
git diff --shortstat
ti dà solo il numero di righe modificate e aggiunte. Funziona solo con modifiche non messe in scena. Per confrontare un ramo:
git diff --shortstat some-branch
git add
, assicurati di farlogit diff --shortstat --cached
git diff --stat commit1 commit2
EDIT: devi specificare anche i commit (senza parametri confronta la directory di lavoro con l'indice). Per esempio
git diff --stat HEAD^ HEAD
per confrontare il genitore di HEAD
con HEAD
.
diff-index
- il diff
frontend può gestire tutto; il caso di diff-index
è coperto dal --cached/--staged
, credo. (E non c'è modo di usare diff-index
per confrontare due commit arbitrari come richiesto dal PO.)
git diff --stat HEAD
HEAD~n
, dove n
è quanto vuoi tornare indietro. git diff --stat HEAD~5 HEAD
mostrerà le statistiche combinate per gli ultimi 5 commit relativi a HEAD.
Supponendo che si desideri confrontare tutti i commit tra abcd123 (il primo commit) e wxyz789 (l'ultimo commit), inclusi:
git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"
Questo dà un output succinto come:
abcd123 Made things better
3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
26 files changed, 53 insertions(+), 58 deletions(-)
--shortstat
bandiera è fantastica, funziona git diff
anche se (non git log
).
Un altro modo per ottenere tutto il registro delle modifiche in un periodo di tempo specificato
git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"
Produzione:
2637cc736 Revert changed code
1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
2 files changed, 4 insertions(+), 11 deletions(-)
Con un contenuto di output lungo, è possibile esportare in file per una maggiore leggibilità
git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt
Sebbene tutte le risposte di cui sopra siano corrette, di seguito una è utile da usare se è necessario contare gli ultimi molti commit
sotto uno c'è il conteggio degli ultimi 5 commit
git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat
per contare gli ultimi 10 commit
git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat
generico: cambia N con il conteggio degli ultimi numerosi commit necessari
git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat
per contare tutti i commit dall'inizio
git diff $(git log --pretty=format:"%h" | tail -1) --shortstat
git log --numstat ti dà solo i numeri
Ho appena risolto questo problema da solo, quindi condividerò quello che mi è venuto in mente. Ecco il risultato finale:
> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)
Il comando sottostante è simile al seguente:
git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'
Nota il $@
comando nel registro per passare argomenti come --author="Brian"
o --since=yesterday
.
Fuggire dal awk per inserirlo in un alias git era disordinato, quindi invece l'ho inserito in uno script eseguibile sul mio percorso ( ~/bin/git-stat-sum
), quindi ho usato lo script nell'alias nel mio .gitconfig
:
[alias]
summary = !git-stat-sum \"$@\"
E funziona davvero bene. Un'ultima cosa da notare è che file changes
è il numero di modifiche ai file, non il numero di file univoci modificati. Questo è quello che stavo cercando, ma potrebbe non essere quello che ti aspetti.
Ecco un altro esempio o due
git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all
Davvero, dovresti essere in grado di sostituire qualsiasi git log
comando con git summary
.