Wie git log Dateinamen wie svn log -v anzeigen lässt


987

Das SVN-Protokoll verfügt über einen "-v" -Modus, der Dateinamen von Dateien ausgibt, die bei jedem Commit geändert wurden, wie folgt:

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800 (Mi, 03. Januar 2007) | 1 Zeile
Geänderte Pfade:
   A / AUTOREN
   A / KOPIEREN
   A / ChangeLog
   A / EVOLUTION
   A / INSTALLIEREN
   A / MacOSX

Gibt es eine schnelle Möglichkeit, eine Liste der geänderten Dateien in jedem Commit in Git abzurufen?


15
Frage mich, warum git lognicht einfach ein -vSwitch unterstützt , wie ihn so viele erwarten / wollen? </ griff>
MarkHu

Antworten:


1528

Für vollständige Pfadnamen geänderter Dateien:

git log --name-only

Für vollständige Pfadnamen und den Status geänderter Dateien:

git log --name-status

Für abgekürzte Pfadnamen und einen Diffstat geänderter Dateien:

git log --stat

Es gibt viel mehr Möglichkeiten, lesen Sie die Dokumente .


17
Ich benutze git log --numstat. Siehe git help logfür weitere Optionen.
ma11hew28

29
git log --name-only --onelineist auch ziemlich schick - eine farbige Zeile für das Commit und eine Datei pro Zeile. stackoverflow.com/a/14227496/1995714
cp.engr

4
Mit Git 2.7.3 musste ich dafür git log --name-status --find-renamesumbenannte Dateien anstelle von Hinzufügen + Löschen anzeigen .
Suzanne Dupéron

1
Beachten Sie, dass --statlange Pfade abgekürzt werden. Die Breite ist konfigurierbar, aber umhüllte Histogramme sind schwerer zu lesen. Andere Formate --numstatdrucken wie immer vollständige Pfade.
Beni Cherniavsky-Paskin

@ ma11hew28 Danke. --numstatbefindet sich in Zeile 946 dieser Manpage ab Git 2.22.00. Das sind viel mehr Optionen, als die meisten Menschen brauchen.
Monica wieder einsetzen - M. Schröder

139

HINWEIS: ist veraltet, verwenden Sie stattdessen git whatchangedgit log

Neue Benutzer werden aufgefordert, stattdessen git-log [1] zu verwenden. Der whatchangedBefehl ist im Wesentlichen derselbe wie git-log [1], zeigt jedoch standardmäßig die Diff-Ausgabe des Rohformats an und überspringt Zusammenführungen.

Der Befehl wird hauptsächlich aus historischen Gründen gehalten; Die Finger vieler Leute, die Git lange zuvor git logdurch das Lesen der Linux-Kernel-Mailingliste erfunden haben, sind darauf trainiert, es zu tippen.


Mit dem Befehl können git whatchanged --statSie eine Liste der Dateien abrufen, die sich bei jedem Commit geändert haben (zusammen mit der Commit-Nachricht).

Verweise


50

git show ist auch ein großartiger Befehl.

Es ist svn diffein bisschen wie , aber Sie können es als Commit-Guid übergeben und diesen Unterschied sehen.


46

Wenn Sie die Dateinamen nur ohne den Rest der Festschreibungsnachricht erhalten möchten, können Sie Folgendes verwenden:

git log --name-only --pretty=format: <branch name>

Dies kann dann erweitert werden, um die verschiedenen Optionen zu verwenden, die den Dateinamen enthalten:

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

Bei dieser Methode ist zu beachten, dass die Ausgabe einige Leerzeilen enthält, die ignoriert werden müssen. Die Verwendung dieser Funktion kann hilfreich sein, wenn Sie die Dateien anzeigen möchten, die in einem lokalen Zweig geändert wurden, aber noch nicht in einen Remote-Zweig verschoben wurden, und es gibt keine Garantie dafür, dass die neuesten Dateien von der Remote bereits abgerufen wurden. Zum Beispiel ::

git log --name-only --pretty=format: my_local_branch --not origin/master

Zeigt alle Dateien an, die im lokalen Zweig geändert, aber noch nicht mit dem Hauptzweig auf der Fernbedienung zusammengeführt wurden.


1
Hinweis zu Leerzeichen in den obigen Beispielen - es ist wie , git log --stat --pretty="format:" $branchName. So zum Beispiel git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD). Während ich dabei bin, ist hier die genaue Beschwörung, die für meinen Zweck relevant war:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
Driftcatcher

41

Ich benutze dies täglich, um den Verlauf mit Dateien anzuzeigen, die sich geändert haben:

git log --stat --pretty=short --graph

Um es kurz zu machen, fügen Sie einen Alias ​​hinzu, .gitconfigindem Sie Folgendes tun:

git config --global alias.ls 'log --stat --pretty=short --graph'

Meins ist sehr nah dran, git log --pretty = oneline --graph --name-status. Ich finde es prägnanter, nur die Liste der Dateien anzuzeigen, die sich geändert haben.
Peter Suwara

15

Ich benutze das:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

Hiermit wird nur eine Liste der Dateien und deren Status ausgegeben (hinzugefügt, geändert, gelöscht):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...

7

git diff --stat HEAD^!Zeigt geänderte Dateien und hinzugefügte / entfernte Zeilenzahlen für das letzte Commit ( HEAD) an.

Es scheint mir, dass es keinen einzigen Befehl gibt, um eine präzise Ausgabe zu erhalten, die nur aus Dateinamen und hinzugefügten und entfernten Zeilenzahlen für mehrere Commits gleichzeitig besteht. Deshalb habe ich mein eigenes Bash-Skript dafür erstellt:

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

ZB zu nennen. ./changed_files 99um die Änderungen in einer übersichtlichen Form von HEADbis zu erhalten HEAD~99. Kann z. zu less.


Können Sie nicht git diff --stat HEAD..masterden Unterschied zwischen HEAD und Master aufzeigen, oder gab es diesen nicht, als Sie 2012 Ihre Antwort veröffentlicht haben?
Ferrybig

1
Bei der Frage von @Ferrybig OP geht es darum, wie "eine Liste der geänderten Dateien in jedem Commit abgerufen werden kann " , nicht um den Unterschied zwischen HEADund master. Das sind zwei verschiedene Dinge.
Nrz

4

Ich finde, dass das Folgende die ideale Anzeige ist, um die pro Commit geänderten Dateien in einem übersichtlichen Format aufzulisten:

git log --pretty=oneline --graph --name-status

3

Eine Zusammenfassung der Antworten mit Beispielausgabe

Hierbei wird ein lokales Repository mit fünf einfachen Commits verwendet.

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <user@email.com>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


Dank an @ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc


0

Ein weiterer nützlicher Befehl wäre, git diff-tree <hash>wo Hash auch ein Hash-Bereich sein kann (bezeichnet durch <old>..<new>Notation). Ein Ausgabebeispiel:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

Die Felder sind:

Quellmodus, Zielmodus, Quell-Hash, Ziel-Hash, Status, Dateiname

Status sind diejenigen, die Sie erwarten würden: D (gelöscht), A (hinzugefügt), M (geändert) usw. Eine vollständige Beschreibung finden Sie auf der Manpage.


0

Ich benutze diese im Allgemeinen, um die Protokolle zu erhalten:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"

1
Ich wusste nichts über diese Optionen, aber dieser Beitrag wäre nützlicher, wenn er erklären würde, dass er das Protokoll filtert. Für einen Moment dachte ich, es wäre eine Möglichkeit, die Art und Weise zu ändern, wie Autoren in der Ausgabe aufgeführt sind.
Stein
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.