1125 Stimmen

Wie kann ich die Anzahl der geänderten Zeilen zwischen zwei Commits in Git berechnen?

Gibt es eine einfache Möglichkeit, die Anzahl der geänderten Zeilen zwischen zwei Commits in Git zu berechnen?

Ich weiß, ich kann eine git diff und die Zeilen zu zählen, aber das scheint mühsam zu sein. Ich würde auch gerne wissen, wie ich das machen kann, indem ich nur meine eigenen Commits in die Zeilenzählung einbeziehe.

1556voto

Cascabel Punkte 449595

Sie wollen die --stat Option von git diff oder, wenn Sie dies in einem Skript auswerten wollen, die --numstat Option.

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

--stat erzeugt die für den Menschen lesbare Ausgabe, die Sie nach Zusammenführungen gewohnt sind; --numstat erzeugt ein schönes Tabellenlayout, das Skripte leicht interpretieren können.

Ich habe irgendwie übersehen, dass Sie dies für mehrere Commits gleichzeitig tun wollten - das ist eine Aufgabe für git log . Ron DeVera geht darauf ein, aber man kann noch viel mehr tun als das, was er erwähnt. Seit git log intern die diff-Maschinerie aufruft, um die angeforderten Informationen zu drucken, können Sie ihr jede der diff stat-Optionen geben - nicht nur --shortstat . Was Sie wahrscheinlich verwenden möchten, ist:

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

aber Sie können --numstat o --shortstat auch. git log kann Commits auch auf andere Weise auswählen - sehen Sie sich die Dokumentation . Sie könnten an folgenden Dingen interessiert sein --since (anstatt Commit-Bereiche anzugeben, wählen Sie einfach Commits seit letzter Woche aus) und --no-merges (Merge-Commits führen eigentlich keine Änderungen ein), sowie die hübschen Ausgabeoptionen ( --pretty=oneline, short, medium, full... ).

Hier ist ein Einzeiler, um die gesamten Änderungen anstelle der Änderungen pro Commit aus dem Git-Protokoll zu erhalten (ändern Sie die Optionen für die Commit-Auswahl wie gewünscht - dies sind die Commits von Ihnen, von Commit1 bis 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)}'

(Sie müssen git log einige identifizierende Informationen über die Übergabe ausgeben lassen; ich habe den Hash willkürlich gewählt und dann awk benutzt, um nur die Zeilen mit drei Feldern herauszufiltern, die die Statistikinformationen enthalten)

8 Stimmen

Dies ist keine Antwort auf die ursprüngliche Frage nach "geänderten Zeilen". Eine Zeilenänderung wird sowohl als eingefügte als auch als gelöschte Zeile berechnet. Die Berechnung der Anzahl der geänderten Zeilen erfordert mehr Arbeit als hier beschrieben.

18 Stimmen

@VilleLaitila: Das ist so nahe dran, wie man es ohne absurden Aufwand erreichen kann, und es war gut genug für den OP und 15 andere. (Wie definiert man, wann eine geänderte Zeile zu einer hinzugefügten Zeile und wann zu einer gelöschten Zeile wird? Durch den Bearbeitungsabstand zwischen der - und der +-Zeile, als Bruchteil der Zeilenlänge?) Wir alle wissen, dass sich Änderungen verdoppeln; wir können das einfach als nützliches Maß für den Umfang der Änderungen bezeichnen und mit unserem Leben weitermachen.

318 Stimmen

git diff --shortstat <commit1> <commit2> war derjenige, den ich wollte.

393voto

orkoden Punkte 17328
git diff --shortstat

gibt Ihnen nur die Anzahl der geänderten und hinzugefügten Zeilen an. Dies funktioniert nur bei nicht zeitversetzten Änderungen. Zum Vergleich mit einem Zweig:

git diff --shortstat some-branch

6 Stimmen

Cool! Aber bedenken Sie, dass dies nur mit ungetakteten Änderungen funktioniert.

22 Stimmen

Wenn Sie die Änderungen mit git add tun, stellen Sie sicher, dass git diff --shortstat --cached

0 Stimmen

2463 geänderte Dateien, 39745 Einfügungen (+), 21383 Löschungen (-) Ich habe im letzten Monat etwa 5k bis 10k gelöscht. Das ist fast alles, was ich gemacht habe, abgesehen vom Verschieben von Dingen. Irgendetwas ist falsch. Werden entfernte Dateien nicht mitgezählt oder so?

260voto

Thomas Punkte 7636

Für Faule, verwenden Sie git log --stat .

22 Stimmen

Ich fand dies nützlich und fügte eine -10 um die letzten zehn Übertragungen anzuzeigen.

8 Stimmen

Wenn Sie den Commit-Verlauf durchgesehen haben, geben Sie Q um zum Terminal zurückzukehren.

60voto

Matthew Flaschen Punkte 266507
git diff --stat commit1 commit2

EDIT: Sie müssen auch die Commits angeben (ohne Parameter vergleicht es das Arbeitsverzeichnis mit dem Index). z.B..

git diff --stat HEAD^ HEAD

zum Vergleich der Eltern von HEAD con HEAD .

1 Stimmen

Es besteht eigentlich nie die Notwendigkeit, die diff-index - die diff Frontend kann alles verarbeiten; der Fall von diff-index fällt unter die --cached/--staged glaube ich. (Und es gibt keine Möglichkeit, die diff-index um zwei beliebige Commits zu vergleichen, wie der OP fragte).

0 Stimmen

Das Ergebnis ist nichts für mich.

0 Stimmen

@Mike: Haben Sie ein Karat weggelassen? War dein letzter Commit ein Merge-Commit? Wenn Git sagt, dass es keinen Diff gibt, ist das so, weil es keinen Diff gibt.

45voto

Spyryto Punkte 757

Kurze Statistik über die letzte Übertragung:

git diff --shortstat HEAD~1 HEAD

In meinem Fall erhalte ich die folgenden Informationen:

 254 files changed, 37 insertions(+), 10773 deletions(-)

Einfügungen und Löschungen sind betroffene Zeilen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X