Jak obliczyć liczbę linii zmienionych między dwoma zatwierdzeniami w git?

746

Czy jest jakiś prosty sposób na obliczenie liczby linii zmienionych między dwoma zatwierdzeniami w git?

Wiem, że mogę to zrobić git diffi policzyć linie, ale wydaje się to nużące. Chciałbym również wiedzieć, jak to zrobić, w tym tylko moje własne zatwierdzenia na liniach.

Mikrofon
źródło
3
Patrzysz na BitBucket.
Alex78191

Odpowiedzi:

1112

Chcesz --statopcję git difflub, jeśli chcesz to przeanalizować w skrypcie, --numstatopcję.

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

--stattworzy czytelny dla człowieka wynik, który przyzwyczaiłeś się po scaleniu; --numstattworzy ładny układ tabeli, który skrypty mogą łatwo interpretować.

Jakoś tęskniłem za tym, że chciałeś to zrobić na wielu zatwierdzeniach jednocześnie - to jest zadanie git log. Ron DeVera dotyka tego, ale w rzeczywistości możesz zrobić znacznie więcej niż to, o czym wspomina. Ponieważ git logwewnętrznie wywołuje maszynę różnicową w celu wydrukowania żądanych informacji, możesz dać jej dowolną opcję statystyki różnicy - nie tylko --shortstat. Co prawdopodobnie chcesz użyć to:

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

ale możesz użyć --numstatlub --shortstat. git logmoże także wybierać zatwierdzenia na wiele innych sposobów - spójrz do dokumentacji . Być może zainteresują Cię takie rzeczy --since(zamiast określania zakresów zatwierdzeń, po prostu wybieraj zatwierdzenia od ostatniego tygodnia) i --no-merges(scalanie zatwierdzeń nie wprowadza zmian), a także ładne opcje wyjściowe ( --pretty=oneline, short, medium, full...).

Oto jeden linijka, aby uzyskać łączne zmiany zamiast zmian na zatwierdzenie z dziennika git (zmień opcje wyboru zatwierdzenia zgodnie z potrzebami - jest to zatwierdzane przez ciebie, od zatwierdzenia1 do zatwierdzenia2):

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

(musisz pozwolić git log wydrukować pewne informacje identyfikujące o zatwierdzeniu; arbitralnie wybrałem skrót, a następnie użyłem awk, aby wybrać tylko linie z trzema polami, które są tymi z danymi statystycznymi)

Cascabel
źródło
2
To nie odpowiada na pierwotne pytanie dotyczące „zmienionych linii”. Zmiana jednej linii jest obliczana jako linia wstawiona i usunięta. Obliczanie liczby zmienionych linii wymaga więcej pracy niż opisano tutaj.
Ville Laitila
12
@VilleLaitila: Jest tak blisko, jak to możliwe, bez absurdalnego wysiłku, i było wystarczająco dobre dla OP i 15 innych osób. (Jak zdefiniujesz, kiedy zmieniona linia staje się linią dodaną i usuniętą? Poprzez edycję odległości między liniami - i +, jako ułamek długości linii?) Wszyscy wiemy, że zmiany ulegają podwojeniu; możemy po prostu nazwać to użyteczną miarą ilości zmian i przejść do naszego życia.
Cascabel
188
git diff --shortstat <commit1> <commit2>był tym, którego chciałem.
Kim
9
Dla porównania, format data --sincei --untiljest coś takiego: yesterday, 1 month 2 weeks 3 days 1 hour 1 second agolub1979-02-26 18:30:00
juanmirocks
4
@Bryson Tak, dlatego ta linia mówi <commit-ish>- działa ze wszystkim, co reprezentuje zatwierdzenie, w tym dosłownie zatwierdzenia, gałęzie, znaczniki i odnośniki w ogóle. Zobacz także stackoverflow.com/questions/23303549/…
Cascabel
193

Dla leniwych użyj git log --stat.

Tomasz
źródło
14
Uznałem to za przydatne, dodałem a, -10aby pokazać poprzednie dziesięć zatwierdzeń.
Choylton B. Higginbottom
2
Po zakończeniu przeglądania historii zatwierdzeń wpisz, Qaby powrócić do terminala.
Stevoisiak
180
git diff --shortstat

daje tylko liczbę linii zmienionych i dodanych. Działa to tylko ze zmianami niestacjonarnymi. Aby porównać z oddziałem:

git diff --shortstat some-branch
orkoden
źródło
3
Fajne! ale ... pamiętaj, że działa to tylko ze zmianami
nieopartymi na scenach
3
Jeśli wprowadziłeś zmiany git add, upewnij się, że to zrobiszgit diff --shortstat --cached
TomNash
2463 pliki zmienione, 39745 wstawek (+), 21383 usunięć (-) W ciągu ostatniego miesiąca usunąłem około 5 000 do 10 000 plików. To prawie wszystko, co robiłem, oprócz przenoszenia rzeczy. Coś jest nie tak. Nie zawiera usuniętych plików czy coś?
jgmjgm
46
git diff --stat commit1 commit2

EDYCJA: Musisz także podać commits (bez parametrów porównuje katalog roboczy z indeksem). Na przykład

git diff --stat HEAD^ HEAD

porównać rodzica HEADz HEAD.

Matthew Flaschen
źródło
1
Tak naprawdę nigdy nie ma potrzeby używania diff-index- diffinterfejs może obsłużyć wszystko; przypadek diff-indexjest objęty --cached/--staged, jak sądzę. (I nie ma sposobu, aby diff-indexporównać dwa arbitralne zatwierdzenia, o które poprosił PO).
Cascabel
Wynik tego nie jest dla mnie niczym.
Mike
@Mike: Czy zostawiłeś karatę? Czy twoje ostatnie zatwierdzenie było scaleniem? Jeśli git mówi, że nie ma różnicy, to dlatego, że nie ma różnicy.
Cascabel
6
lub jeśli nie jest to zalecanegit diff --stat HEAD
wieczorek1990
1
Możesz także porównać dalej, niż tylko rodzic, używając HEAD~n, gdzie njest jak daleko chcesz wrócić. git diff --stat HEAD~5 HEADpokaże połączone statystyki z ostatnich 5 zatwierdzeń w stosunku do HEAD.
Nathan Beck
18

Zakładając, że chcesz porównać wszystkie swoje commity między abcd123 (pierwsze zatwierdzenie) i wxyz789 (ostatnie zatwierdzenie), w tym:

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

Daje to zwięzłą wydajność, taką jak:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)
Ron DeVera
źródło
Wynik tego nie jest dla mnie niczym (dokonałem zatwierdzeń i zweryfikowałem - autor jest poprawny, używając go z git log i bez innych argumentów).
Mike
To mi się też przydarzyło. Dwa zatwierdzenia były w niewłaściwej kolejności, zamieniając je, naprawiono.
Bob Esponja
1
Zaktualizowano kolejność zatwierdzeń i wyjaśniono, co reprezentują dwa SHA. Dzięki za złapanie :)
Ron DeVera,
3
--shortstatFlaga jest niesamowite, że działa ze git diffChoć (nie git log).
lucke84
Jak je podsumować?
xpto
13

Kolejny sposób na uzyskanie wszystkich dzienników zmian w określonym czasie

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

Wynik:

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

Dzięki dużej zawartości wyjściowej można eksportować do pliku, aby był bardziej czytelny

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt
nmtri
źródło
2

Chociaż wszystkie powyższe odpowiedzi są poprawne, poniżej jedna jest przydatna, jeśli potrzebujesz liczby ostatnich zatwierdzeń

poniżej jednego należy policzyć 5 ostatnich zatwierdzeń

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

aby policzyć ostatnie 10 zatwierdzeń

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

ogólna - zmień N z liczbą ostatnich wielu wymaganych zmian

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

aby policzyć wszystkie zatwierdzenia od początku

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


źródło
Dzięki temu „ogon” nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy. ”
Charles Roddie
2

git log - numstat podaje tylko liczby

nibinbhaskar
źródło
1

Właśnie rozwiązałem ten problem dla siebie, więc podzielę się tym, co wymyśliłem. Oto wynik końcowy:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

Podstawowe polecenie wygląda następująco:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

Zwróć uwagę na $@komendę log, aby przekazać argumenty, takie jak --author="Brian"lub --since=yesterday.

Ucieczka z awk i umieszczenie go w aliasie git była nieporządna, więc zamiast tego umieściłem go w skrypcie wykonywalnym na mojej ścieżce ( ~/bin/git-stat-sum), a następnie użyłem skryptu w aliasie w mojej.gitconfig :

[alias]
    summary = !git-stat-sum \"$@\"

I działa naprawdę dobrze. Ostatnią rzeczą do zapamiętania jest tofile changes jest liczba zmian w plikach, a nie liczba zmienionych unikatowych plików. Tego właśnie szukałem, ale może nie być to, czego oczekujesz.

Oto kolejny przykład lub dwa

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

Naprawdę powinieneś być w stanie zastąpić dowolne git logpolecenie git summary.

nieokreślony
źródło