Gibt es eine Möglichkeit, Git-Show-Zeilen hinzuzufügen, Zeilen zu ändern und Zeilen zu entfernen?

109

"git diff --stat" und "git log --stat" zeigen die Ausgabe wie folgt:

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

Aber was wirklich bei diesem Commit passiert ist, war, dass 4 Zeilen geändert und 26 Zeilen gelöscht wurden, was sich vom Hinzufügen von 4 Zeilen und Löschen von 30 unterscheidet.

Gibt es eine Möglichkeit, die Delta-LOCs zu erhalten (in diesem Fall 26)? Es ist mir nicht wirklich wichtig, zwischen hinzugefügten oder entfernten Zeilen zu unterscheiden.

Juan Alonso
quelle

Antworten:

124

Sie können verwenden:

git diff --numstat

um numerische Diff-Informationen zu erhalten.

Es --word-diffkann hilfreich sein , die Modifikation von einem Paar zum Hinzufügen und Entfernen zu trennen . Sie könnten so etwas versuchen:

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

Es ist etwas langwierig, daher möchten Sie es möglicherweise stattdessen in Ihrem eigenen Skript analysieren.

Quornian
quelle
2
Danke quornian, aber numstat gibt genau die gleichen Informationen wie stat, Ergänzungen und Löschungen.
Juan Alonso
Meine Antwort wurde aktualisiert und enthält nun ein Beispiel für die Verwendung von --word-diff. Das könnte nützlicher sein.
Quornian
13
Die Ausgabe von git diff --numstatist nach Dateien unterteilt. Um die Summe zu sehen, die für das Diff hinzugefügt / entfernt wurde, können Sie es an awk git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
weiterleiten
14
@hughes Eine einfachere Möglichkeit, die gleichen Informationen zu erhalten, wäre git diff --shortstat. Nach meiner Erfahrung entspricht dies der Akkumulation der Ausgabe von git diff --numstat.
Klaus Triendl
1
Auch FWIW, um die Statistiken für inszenierte Änderungen zu sehen, fügen --cached
Sie
65
  1. Wenn Sie wissen möchten, welche Zeilen durch ein Commit mit ID hinzugefügt / geändert / gelöscht wurden commit-id, können Sie diese verwenden

    git show commit-id --stat
    

    oder

    git diff commit-id-before commit-id --stat
    
  2. Wenn Sie wissen möchten, welche Zeilen durch ein Bereichs-Commit hinzugefügt / geändert / gelöscht wurden, können Sie diese verwenden

    git diff commit-id1 commit-id2 --stat
    
  3. Wenn Sie wissen möchten, welche Zeilen bei jedem Commit hinzugefügt / geändert / gelöscht wurden, können Sie diese verwenden

    git log --stat
    
yhluo
quelle
Diese Lösung beantwortet die Frage nicht. "Git - stat" zählt eine einzelne modifizierte Zeile als "1 Einfügung und 1 Löschung". Die Frage fragt, wie man "1 geändert" bekommt.
Juan Alonso
6

Wenn alle Ihre Dateien für das Festschreiben bereitgestellt werden, sehen Sie --numstatFolgendes wie folgt:

git diff --numstat HEAD~
Falieson
quelle
4

git verwendet als diff-Format "unified" diff, das nur Zeilen hinzugefügt und gelöscht hat. Sie müssen etwas Externes tun, um einen Unterschied zu erhalten, der das Hinzufügen, Löschen und Ändern von Informationen anzeigt.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git enthält Links zu einem Skript, mit dem reguläres altes "diff" ausgeführt werden kann. Daraus können Sie eine "Kontext" -Diff- Ausgabe generieren . Context Diff zeigt hinzugefügte, entfernte und geänderte Zeilen an, mit denen Sie die gewünschten Daten abrufen können.

Daniel Pittman
quelle
3

Sie können verwenden diffstat, um die Anzahl der geänderten Zeilen anzuzeigen. Beispielsweise:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

Die -COption besteht darin, eine farbige Ausgabe zu erhalten. Die -mOption dient zum Anzeigen der Anzahl der geänderten Zeilen. Beispielausgabe:

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

Die Anzahl der geänderten Zeilen ist ungefähr wie folgt man diffstat:

-m Anzahl der Einfüge- / Löschvorgänge aus jedem "Block" der Patch-Datei zusammenführen, um eine Anzahl der geänderten Zeilen zu approximieren.

Ein wesentlicher Unterschied zwischen git diff --statund diffstat: diffstatzeigt keine Dateiverschiebungen / -umbenennungen an (z app/{a.rb => b.rb}. B. ).

Fluss
quelle