git: Zeigt alle Dateien an, die zwischen zwei Commits geändert wurden

Antworten:

79

Dies ist das Beste, was ich mir vorstellen kann:

git log --name-only --pretty=oneline --full-index HEAD^^..HEAD | grep -vE '^[0-9a-f]{40} ' | sort | uniq

Ersetzen Sie HEAD ^^ und HEAD durch die Commits, die Sie vergleichen möchten.

Mein Versuch verwendet git logwith, --name-onlyum alle Dateien jedes Commits zwischen den angegebenen aufzulisten. --pretty=onelineDer Teil über der Dateiliste besteht nur aus dem Commit-SHA und dem Nachrichtentitel. --full-indexmacht die SHA die vollen 40 Zeichen. grepfiltert alles heraus, was wie ein SHA aussieht, gefolgt von einem Leerzeichen. Sofern Sie keine Dateien haben, die mit einem SHA gefolgt von einem Leerzeichen beginnen, sollte das Ergebnis korrekt sein.

igorw
quelle
Wenn ich diesen Befehl für HEAD ^ und HEAD ausführe, erhalte ich eine Liste, wie jede einzelne Datei im Repository aussieht. sogar diejenigen, die sich nicht geändert haben.
Blair Holloway
Mein schlechtes, das Format ist "<commit1> .. <commit2>" anstelle von "<commit1> <commit2>".
igorw
Danke, etwas umständlich, aber es wird reichen.
Andrew
2
Auf jeden Fall umständlich. Ich musste 3 Punkte zwischen die Commit-SHAs setzen (nicht 2 wie gezeigt), damit es funktioniert. Ich denke, Bryces Antwort ist einfacher (dh mit dem Befehl --stat on git diff) und bietet ein wenig mehr Informationen (Zusammenfassung der Anzahl der geänderten Dateien plus Anzahl der in jeder Datei geänderten Zeilen).
Daniel Goldfarb
58

Ich denke, dieser Befehl ist Ihre Antwort:

git diff --stat abc123 xyz123  # where abc123 and xyz123 are SHA1 hashes of commit objects

Direkt aus dem Git-Community-Buch :

Wenn Sie nicht den gesamten Patch sehen möchten, können Sie die Option '--stat' hinzufügen, mit der die Ausgabe auf die geänderten Dateien beschränkt wird. Außerdem wird ein kleines Textdiagramm angezeigt, in dem angegeben ist, wie viele Zeilen sich in jeder Datei geändert haben.

brycemcd
quelle
3
Genauer gesagt git diff --stat <commit1> <commit2>.
Blair Holloway
4
Nein, genau das wollte er nicht. Git Diff macht einen direkten Unterschied zwischen den Bäumen, es berücksichtigt nicht die Commits. Wenn Sie eine neue Datei mit dem Inhalt "A" erstellen, den Inhalt in "B" ändern und dann wieder in "A" ändern git diff --stat HEAD^^ HEAD, erhalten Sie eine leere Ausgabe.
igorw
3
git diff --name-onlyist wahrscheinlich besser als, git diff --stataber wie bereits erwähnt, macht git diffes nicht das, was das OP wollte.
nnutter
14

Wenn Sie nur die Dateinamen sehen möchten, nach denen das Commit bchronologisch folgt a:

git diff <a commit sha1>...<b commit sha2> --name-only # b is after a in time

Wenn Sie alle Dateinamen und die Änderungen von Commit a in Commit b anzeigen möchten, löschen Sie das letzte Argument.

git diff <a commit sha1>...<b commit sha2> # shows file names and what changed in each file

Ein Beispiel dafür <commit sha1>sind die Commit-IDs 675ee6860d2c273bcc6c6a0536634a107e2a3d9f. Im Allgemeinen funktionieren die ersten 8 bis 10 Ziffern bei den meisten Projekten, benötigen jedoch möglicherweise mehr, wenn das Projekt unzählige Commits enthält. Normalerweise verwende ich die Ausgabe der ID von git log --oneline.

Wenn Sie einen Unterschied zwischen a ... b und b später als a feststellen, ist es leicht zu erkennen, was in jeder Datei chronologisch geändert wurde.

Lloyd Rochester
quelle
1

Dieser ähnelt dem von igorw , vermeidet jedoch das Entfernen des SHA über grep:

git log --pretty='format:' --name-only HEAD^^..HEAD | sort -u

Wenn Sie zusätzlich sehen möchten, wie die Dateien geändert wurden, ersetzen Sie --name-onlydurch --name-status.

Ingo Karkat
quelle
Ich habe diesen Befehl gerade getestet. Die Verarbeitung dauerte ungefähr 10 Sekunden und begann dann, eine riesige Dateiliste zu erstellen.
ostler.c
@ ostler.c: Haben Sie den Revisionsbereich in bestanden "$@"? Andernfalls werden vorhandene Änderungen angezeigt, was sehr viel ist :-) Ich habe meine Antwort überarbeitet, um ein Beispiel zu verwenden, wie in den anderen Antworten.
Ingo Karkat
Okay, das macht Sinn. Ich bin überrascht, dass ich "$ @" nicht kannte. Obwohl ich es für die meisten Befehle nicht sehr nützlich finde.
ostler.c
@ ostler.c: Ich habe diese Zeile in einem git-showfilesSkript und "$@"fügt alle übergebenen Argumente ein. Obwohl ein bisschen dunkel (wie viel in Shell-Skripten), ist dies ziemlich normales Zeug.
Ingo Karkat
0

Ich würde verwenden; Nehmen Sie die ersten 8 des Commit-Hash. Wenn Sie möchten, können Sie wie folgt in eine Datei leiten:

git log 12345678..87654321 > C:\GitChanges.txt
Craig Rickett
quelle
0

Ich benutze diesen Befehl, um alle Änderungen zwischen zwei Commits zu vergleichen:

git difftool -d <commit hash1> <commit hash2>

Wie eine Git-Rebase, um alle lokalen Commits in einem zu zerquetschen.

Codewarrior
quelle