Wie liste ich nur die Dateinamen auf, die sich zwischen zwei Commits geändert haben?

1953

Ich habe ein paar Commits im Repo. Ich möchte eine Liste von Dateien sehen, die zwischen zwei Commits geändert wurden - von SHA1 zu SHA2.

Welchen Befehl soll ich verwenden?

Shawn
quelle
3
Für ein Commit und sein Elternteil: stackoverflow.com/questions/424071/…
Ciro Santilli 法轮功 病毒 审查 六四 事件 24

Antworten:

2663
git diff --name-only SHA1 SHA2

Hier müssen Sie nur genügend SHA hinzufügen, um die Commits zu identifizieren. Sie können dies beispielsweise auch tun

git diff --name-only HEAD~10 HEAD~5

um die Unterschiede zwischen dem zehnten letzten Commit und dem fünften letzten Commit (oder so) zu sehen.

Peter
quelle
151
Dies funktioniert auch für Git-Shows. git show --name-only SHA1.
August Lilleaas
78
git diff --name-status [TAG|SHA1]zeigt, welche Operationen auch an den Dateien durchgeführt wurden
Reconbot
2
Sie können auch Folgendes tun: git diff - only-name HEAD @ {3} HEAD @ {0} für die genauen Commits, die Sie vergleichen möchten.
B01
7
@AugustLilleaas, das tatsächlich show verwendet, zeigt nur die 2 spezifischen Commits an. Wenn Sie Commits zwischen diesen 2 haben, werden sie
weggelassen
4
Wie unten erwähnt, git diff --name-statusscheint es nicht möglich zu sein, hinzugefügte Dateien anzuzeigen. @sschuberth wies darauf hin git show, was für mich richtig zu funktionieren scheint : git show --pretty=format: --name-status. Nur zu tun git show --name-statusgibt ein bisschen mehr Informationen, aber immer noch schön und dicht ... das wird mein neuer goto-Befehl sein;)
travc
417
git diff --name-status [SHA1 [SHA2]]

ist wie --name-only, außer dass Sie ein einfaches Präfix erhalten, das Ihnen sagt, was mit der Datei passiert ist (geändert, gelöscht, hinzugefügt ...)

git log --name-status --oneline [SHA1..SHA2]

ist ähnlich, aber Commits werden nach der Commit-Nachricht aufgelistet, sodass Sie sehen können, wann eine Datei geändert wurde.

  • Wenn Sie daran interessiert sind, was mit bestimmten Dateien / Ordnern passiert ist, können Sie -- <filename> [<filename>...]die git logVersion anhängen .

  • Wenn Sie sehen möchten, was bei einem einzelnen Commit passiert ist, nennen Sie es SHA1 und dann
    git log --name-status --oneline [SHA1^..SHA1]

Dateistatus-Flags:
M geändert - Datei wurde geändert
C Kopieren-Bearbeiten - Datei wurde kopiert und geändert
R Umbenennen-Bearbeiten - Datei wurde umbenannt und geändert
A hinzugefügt - Datei wurde hinzugefügt
D gelöscht - Datei wurde gelöscht
U nicht zusammengeführt - Datei hat Konflikte nach einer Zusammenführung

Kunstroboter
quelle
Ich sage zufällig git diff --name-status und es gab die 'hinzugefügte Datei'.
Aartist
1
Für das Git-Protokoll müssen zwei Punkte zwischen den SHAs vorhanden sein, z. B. SHA1..SHA2, und das zweite SHA ist nicht optional. Daher sollte es folgendermaßen aussehen: Git-Protokoll --name-status --oneline [SHA1 .. SHA2]
Twasbrillig
Gibt es eine Möglichkeit, bestimmte Dateien / bestimmte Dateitypen auszuschließen?
aug
3
Die --relative[=<path>]Option kann Ihnen helfen, ich bin mir nicht sicher. Ansonsten gibt es immer | erep -v '(.tmp|.foo|.dontwant)$'...
Artfulrobot
80

Es scheint, dass niemand den Schalter erwähnt hat --stat:

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

Es gibt auch --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

und --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)
leeyuiwah
quelle
4
Die akzeptierte Antwort ist korrekt, aber dies ist sehr nützlich und gibt Ihnen ein paar zusätzliche Informationen. Vielen Dank!
Kontur
2
Einverstanden ist dies eine nützlichere Antwort, da sie die Diff-Statistiken enthält.
Internetross
52

Aber um zu sehen, wie sich die Dateien zwischen Ihrem Zweig und seinem gemeinsamen Vorfahren mit einem anderen Zweig (z. B. Ursprung / Master) geändert haben:

git diff --name-only `git merge-base origin/master HEAD`
Tim James
quelle
1
Das war wirklich nützlich! Ich wünschte, ich könnte einfach sagen git diffstatus masteroder ähnliches, das löst das Obige aus.
Oma
3
Oder git show --pretty=format: --name-only origin/master...
Sschuberth
Möglicherweise können Sie es nicht zu einem Git-Alias ​​machen, aber Sie können es definitiv in Ihre .bashrc-Datei einfügen.
Fred
3
Oder noch einfacher: git diff --name-only HEAD...master(beachten Sie die drei Punkte). Eine ausführliche Erklärung finden Sie hier .
Ostrokach
1
Sieht nach meist richtiger Antwort aus! Einfach git diff --name-only master..branchentspricht nicht der PR-Liste von Github. Auf diese Weise genauer. Aber trotzdem habe ich 173 geänderte Dateien vs 171 in Github PR. (ohne merge-baseich habe 228 vs 171)
x'ES
21

Um die Antwort von @ artfulrobot zu ergänzen, wenn Sie geänderte Dateien zwischen zwei Zweigen anzeigen möchten:

git diff --name-status mybranch..myotherbranch

Seien Sie vorsichtig bei der Rangfolge. Wenn Sie den neueren Zweig zuerst platzieren, werden Dateien als gelöscht und nicht als angezeigt angezeigt.

Das Hinzufügen einer grepDose verfeinert die Dinge weiter:

git diff --name-status mybranch..myotherbranch | grep "A\t"

Daraufhin werden nur die hinzugefügten Dateien angezeigt myotherbranch.

Max MacLeod
quelle
4
Regexes sind nett und können in der Tat fast alles. In diesem Fall gibt es jedoch auch --diff-filtereine Funktion, die diese Funktionalität nativ bietet, was eine geringere Wahrscheinlichkeit für falsche Ergebnisse (z. B. falsch positive Ergebnisse) bedeutet
Jasper,
8

Fügen Sie den folgenden Alias ​​zu Ihrem hinzu ~/.bash_profileund führen Sie ihn aus source ~/.bash_profile. Jetzt können Sie jederzeit die aktualisierten Dateien im letzten Commit anzeigen, das showfilesvon Ihrem Git-Repository ausgeführt wird.

alias showfiles='git show --pretty="format:" --name-only'
Zorayr
quelle
2
Oder git config --global alias.showfiles 'show --pretty="format:" --name-only'zu machen git showfiles.
CGMB
7

Dies zeigt die Änderungen in Dateien:

git diff --word-diff SHA1 SHA2
Julio Marins
quelle
5

Beachten Sie auch, wenn Sie nur die geänderten Dateien zwischen dem letzten und dem vorherigen Commit anzeigen möchten. Das funktioniert gut:git show --name-only

Parris
quelle
3

Verwenden Sie git log --pretty = oneline> C: \ filename.log

Dadurch wird nur eine Online-Datei (--pretty = oneline) protokolliert, die den Namen der geänderten Datei enthält. Außerdem werden alle Details in Ihrer Ausgabedatei protokolliert.

Agni
quelle
git log --pretty=onelinegibt mir nur die SHA und die Commit-Nachricht mit Git 2.10.1
verdammt
3

Wie Artfulrobot in seiner Antwort sagte:

git diff --name-status [SHA1 [SHA2]]

Mein Beispiel:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png
Jaime Montoya
quelle
3

Nur für jemanden, der sich nur auf Java-Dateien konzentrieren muss, ist dies meine Lösung:

 git diff --name-status SHA1 SHA2 | grep '\.java$'
K. Symbol
quelle
1

Folgendes funktioniert gut für mich:

$ git show --name-only --format=tformat: SHA1..SHA2

Es kann auch mit einem einzigen Commit verwendet werden:

git show --name-only --format=tformat: SHA1

Dies ist praktisch für die Verwendung in Jenkins, wo Sie eine Liste der changeSet-SHAs erhalten und diese durchlaufen möchten, um festzustellen, welche Dateien geändert wurden.

Dies ähnelt einigen der obigen Antworten, verwendet jedoch den Trennraum zwischen den Commits , tformat:anstatt ihn zu format:entfernen.

blindsnowmobile
quelle
0

Basierend auf habe git diff --name-statusich die Git-Diffview- Git-Erweiterung geschrieben, die eine hierarchische Baumansicht der Änderungen zwischen zwei Pfaden darstellt.

Bernard Opic
quelle