Czy jest jakiś prosty sposób na obliczenie liczby linii zmienionych między dwoma zatwierdzeniami w git?
Wiem, że mogę to zrobić git diff
i 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.
Odpowiedzi:
Chcesz
--stat
opcjęgit diff
lub, jeśli chcesz to przeanalizować w skrypcie,--numstat
opcję.--stat
tworzy czytelny dla człowieka wynik, który przyzwyczaiłeś się po scaleniu;--numstat
tworzy ł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 log
wewnę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:ale możesz użyć
--numstat
lub--shortstat
.git log
moż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):
(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)
źródło
git diff --shortstat <commit1> <commit2>
był tym, którego chciałem.--since
i--until
jest coś takiego:yesterday
,1 month 2 weeks 3 days 1 hour 1 second ago
lub1979-02-26 18:30:00
<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/…Dla leniwych użyj
git log --stat
.źródło
-10
aby pokazać poprzednie dziesięć zatwierdzeń.Q
aby powrócić do terminala.daje tylko liczbę linii zmienionych i dodanych. Działa to tylko ze zmianami niestacjonarnymi. Aby porównać z oddziałem:
źródło
git add
, upewnij się, że to zrobiszgit diff --shortstat --cached
EDYCJA: Musisz także podać commits (bez parametrów porównuje katalog roboczy z indeksem). Na przykład
porównać rodzica
HEAD
zHEAD
.źródło
diff-index
-diff
interfejs może obsłużyć wszystko; przypadekdiff-index
jest objęty--cached/--staged
, jak sądzę. (I nie ma sposobu, abydiff-index
porównać dwa arbitralne zatwierdzenia, o które poprosił PO).git diff --stat HEAD
HEAD~n
, gdzien
jest jak daleko chcesz wrócić.git diff --stat HEAD~5 HEAD
pokaże połączone statystyki z ostatnich 5 zatwierdzeń w stosunku do HEAD.Zakładając, że chcesz porównać wszystkie swoje commity między abcd123 (pierwsze zatwierdzenie) i wxyz789 (ostatnie zatwierdzenie), w tym:
Daje to zwięzłą wydajność, taką jak:
źródło
--shortstat
Flaga jest niesamowite, że działa zegit diff
Choć (niegit log
).Kolejny sposób na uzyskanie wszystkich dzienników zmian w określonym czasie
Wynik:
Dzięki dużej zawartości wyjściowej można eksportować do pliku, aby był bardziej czytelny
źródło
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
git log - numstat podaje tylko liczby
źródło
Właśnie rozwiązałem ten problem dla siebie, więc podzielę się tym, co wymyśliłem. Oto wynik końcowy:
Podstawowe polecenie wygląda następująco:
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
:I działa naprawdę dobrze. Ostatnią rzeczą do zapamiętania jest to
file 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
Naprawdę powinieneś być w stanie zastąpić dowolne
git log
poleceniegit summary
.źródło