Wie erhalte ich eine Liste aller Dateien, die sich zwischen zwei Git-Commits geändert haben?

178

Aus bürokratischen Gründen muss ich für einen Bericht eine Liste aller geänderten Dateien in meinem Repository abrufen (ich habe mit dem vorhandenen Quellcode begonnen).

Was soll ich ausführen, um diese Liste zu erhalten?

Chen Kinnrot
quelle
33
"wegen Bürokratie" xD
ptim

Antworten:

238

Für Dateien, die zwischen einem bestimmten SHA und Ihrem aktuellen Commit geändert wurden:

git diff --name-only <starting SHA> HEAD

oder wenn Sie geänderte, aber noch nicht festgeschriebene Dateien einschließen möchten:

git diff --name-only <starting SHA>

Im Allgemeinen sagt Ihnen die folgende Syntax immer, welche Dateien zwischen zwei Commits geändert wurden (angegeben durch ihre SHAs oder andere Namen):

git diff --name-only <commit1> <commit2>
Bernstein
quelle
2
und wenn Sie wissen möchten, welche Dateien für ein bestimmtes Commit geändert wurden, gehen Sie wie git diff --name-only <SHA> <SHA>^
folgt vor
3
Die Verwendung des --name-statusFlags anstelle von --name-onlyist praktisch, um eine Liste der Dateien abzurufen und deren Änderungsstatus anzuzeigen, z. B. Hinzugefügt oder Geändert.
Thane Plummer
@ Amber sollte die Notizen von @Thane Plummer erwähnen, die --name-statuszeigen, was mit ihnen passiert ist
Zoltán Süle
64

So finden Sie die Namen aller Dateien, die seit Ihrem letzten Commit geändert wurden:

git diff --name-only

Oder (für ein bisschen mehr Informationen, einschließlich nicht verfolgter Dateien):

git status
Tim Bellis
quelle
48
  • So listen Sie alle nicht bereitgestellten nachverfolgten geänderten Dateien auf:

    git diff --name-only
    
  • So listen Sie alle inszenierten nachverfolgten geänderten Dateien auf:

    git diff --name-only --staged
    
  • So listen Sie alle bereitgestellten und nicht bereitgestellten nachverfolgten geänderten Dateien auf:

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • So listen Sie alle nicht verfolgten Dateien auf (die von aufgelisteten git status, also keine ignorierten Dateien):

    git ls-files --other --exclude-standard
    

Wenn Sie dies in einem Shell-Skript verwenden und programmgesteuert prüfen möchten, ob diese Befehle etwas zurückgegeben haben, interessiert Sie git diffdie --exit-codeOption.

Flimm
quelle
16

Wenn ich viele Dateien hinzugefügt / geändert / gelöscht habe (seit dem letzten Festschreiben), möchte ich diese Änderungen in chronologischer Reihenfolge betrachten.

Dafür benutze ich:

  • So listen Sie alle nicht bereitgestellten Dateien auf:

    git ls-files --other --modified --exclude-standard
    
  • So erhalten Sie das Datum der letzten Änderung für jede Datei:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

Obwohl Ruvim in den Kommentaren vorschlägt :

xargs -0 stat -c '%y %n' -- 
  • So sortieren Sie sie vom ältesten zum neueren:

    sort
    

Ein Alias ​​erleichtert die Verwendung:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

Oder (kürzer und effizienter dank ruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Beispielsweise:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Ich kann jetzt meine Änderungen überprüfen, von den ältesten bis zu den neueren.

VonC
quelle
Warum nicht einen xargseinzigen Anruf von verwenden stat? Der volle git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
Einzeiler
@ruvim Danke. Sehr guter Vorschlag. Ich habe die Antwort so bearbeitet, dass sie Ihren Kommentar enthält, um die Sichtbarkeit zu verbessern.
VonC
4

Ich benötige eine Liste von Dateien, deren Inhalt zwischen zwei Commits geändert wurde (nur hinzugefügt oder geändert). Daher habe ich Folgendes verwendet:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

Die verschiedenen Diff-Filter-Optionen aus der Git Diff-Dokumentation :

Diff-Filter = [(A | C | D | M | R | T | U | X | B)… [*]]

Wählen Sie nur Dateien aus, die hinzugefügt (A), kopiert (C), gelöscht (D), geändert (M), umbenannt (R) sind und deren Typ (dh reguläre Datei, Symlink, Submodul, ...) geändert wurde (T). sind nicht zusammengeführt (U), sind unbekannt (X) oder haben ihre Paarung gebrochen (B). Es kann eine beliebige Kombination der Filterzeichen (einschließlich keiner) verwendet werden. Wenn der Kombination * (Alles oder Nichts) hinzugefügt wird, werden alle Pfade ausgewählt, wenn eine Datei vorhanden ist, die anderen Kriterien im Vergleich entspricht. Wenn keine Datei vorhanden ist, die anderen Kriterien entspricht, wird nichts ausgewählt.

Außerdem können diese Großbuchstaben zum Ausschließen in Kleinbuchstaben geschrieben werden. ZB --diff-filter = ad schließt hinzugefügte und gelöschte Pfade aus.

Wenn Sie auch den Status auflisten möchten (z. B. A / M), wechseln Sie --name-onlyzu --name-status.

Futter
quelle
3

Die Liste der nicht bereitgestellten Änderungen kann mit git statusund dem folgenden grepBefehl abgerufen werden . So etwas wie git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....
SuperNova
quelle
Beachten Sie, dass dies nur für nicht bereitgestellte Änderungen verwendet werden kann. Daher ist es nicht nützlich für "Dateien, die sich zwischen zwei Git-Commits geändert haben"
John Vandenberg,
2

Mit git showkönnen Sie ein ähnliches Ergebnis erzielen. git logVerwenden Sie zum Anzeigen des Commits (wie es in der Ansicht aussieht ) mit der Liste der enthaltenen Dateien:

git show --name-only [commit-id_A]^..[commit-id_B]

Wo [commit-id_A]ist das anfängliche Commit und [commit-id_B]das letzte Commit, als Sie anzeigen möchten?

Besondere Aufmerksamkeit mit ^Symbol. Wenn Sie dies nicht angeben, werden die Commit-ID_A-Informationen nicht bereitgestellt.

Kurapika
quelle
1

Wenn Sie die geänderten Dateien überprüfen möchten, müssen Sie sich um viele kleine Dinge kümmern, z. B. welche am besten zu verwenden sind, z. B. wenn Sie überprüfen möchten, welche der geänderten Dateien nur eingegeben wurden

Git-Status - Zeigt die Dateien mit den Änderungen an

Wenn Sie dann wissen möchten, welche Änderungen vorgenommen werden sollen, können Sie dies auf verschiedene Weise überprüfen.

git diff - zeigt alle Änderungen in allen Dateien an

Es ist nur dann gut, wenn nur eine Datei geändert wird

und wenn Sie eine bestimmte Datei überprüfen möchten, verwenden Sie

Git Diff

Saurabh Pal
quelle