Wie kann ich alle Commits auflisten, die eine bestimmte Datei geändert haben?

802

Gibt es eine Möglichkeit, alle Commits aufzulisten, die eine bestimmte Datei geändert haben?

Daniel
quelle
1
Suchen Sie nach Änderungen an einer Datei in einem einzelnen Zweig? über alle lokalen Niederlassungen hinweg; über alle Zweige auf einer einzigen Fernbedienung; oder über alles? Ich denke, dass für alles ein Skript erforderlich ist.
benhorgen

Antworten:

1082

Das --followfunktioniert für eine bestimmte Datei

git log --follow -- filename

Unterschied zu anderen Lösungen gegeben

Beachten Sie, dass andere Lösungen git log path(ohne --follow) enthalten. Dieser Ansatz ist praktisch, wenn Sie z. B. Änderungen in einem Verzeichnis verfolgen möchten , aber beim Umbenennen von Dateien stolpern (also verwenden --follow filename).

jackrabb1t
quelle
32
+1 --followKonten für Umbenennungen, so ist dies robuster alsgit log -- path
Gabe Moothart
42
Beachten Sie, dass --followein Pfad akzeptiert wird , der eine Datei, aber auch ein Verzeichnis sein kann. Im letzteren Fall wird es rekursiv ausgeführt und meldet Änderungen an allen Dateien unterhalb dieses Punktes. (Dieses Verhalten ist nicht in der Manpage dokumentiert und möglicherweise nicht dauerhaft.)
StvnW
5
Was ist der Unterschied zwischen diesem und nurgit log filename?
VaTo
8
@SaulOrtega git log filenamefolgt nicht dem Umbenennen von Dateien, dh es werden alle Commits in Bezug auf diesen Dateinamen angezeigt (nicht die tatsächliche Datei). Wenn Sie Dateien erstellen Xund Yänderte beide, dann gelöscht Yund umbenannt Xzu Yund dann auch verändert, und Sie laufen git log Y, werden Sie Nachrichten für beide bekommen alt Y und neu ein. Und im Gegenteil, --followSie erhalten Commits bezüglich dieser Datei, wenn sie benannt wurde X und als sie benannt wurde Y.
MarSoft
7
Verwenden Sie "git log --all filename", um alle Commits in allen Zweigen
anzuzeigen
122

git log pathsollte tun was du willst. Vom git logMann :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.
Gabe Moothart
quelle
11
Funktioniert nicht, wenn sich der Pfad der Datei geändert hat. Jackrabbits Antwort funktioniert in diesem Fall.
Kwahn
1
Dies funktioniert , wenn Sie benötigen , um das Protokoll zu einem bestimmten Zweig zu beschränken
ams
63

Ich habe mir das genau angesehen und all diese Antworten scheinen mir nicht wirklich alle Verpflichtungen in allen Branchen zu zeigen.

Hier ist, was ich mir ausgedacht habe, indem ich mit den Optionen für die gitk-Bearbeitungsansicht herumgespielt habe. Dies zeigt mir alle Commits für eine Datei, unabhängig von Zweig, lokal, Reflog und Remote.

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

Es funktioniert auch mit git log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename
BigMiner
quelle
11
Dies ist perfekt, wenn jemand Änderungen vornimmt, aber vergisst, wo er die Änderungen vorgenommen hat.
EarthmeLon
2
Sehr hilfreich. Beinhaltet auch Stash Commits
Juan Antonio Tubío
Dies sollte die bevorzugte Antwort sein. Die Frage war, alle Commits zu finden, das tut dieser.
Carl verbiest
Beachten Sie, dass --reflogCommits enthalten sind, die neu basiert / geändert oder auf andere Weise verworfen wurden. Vielleicht sollte das offensichtlich sein, aber ich habe versucht, dies zu verwenden git logund herauszufinden, warum ich scheinbar doppelte Commits sah!
Soren Bjornstad
43

Verwenden Sie den folgenden Befehl, um Commits für eine bestimmte Datei abzurufen:

git log -p filename
Sankar Subburaj
quelle
8
Ich verstehe, dass dies die Frage nicht genau beantwortet, da er eine Liste von Commits wollte, aber das ist Gold und geht in meine Akte.
zkent
3
Dies funktioniert überhaupt nicht, wenn die Datei nicht im aktuell ausgecheckten Zweig vorhanden ist. Sie können den Zweig wie hinzufügen git log -p mybranch -- filenameoder nur verwenden git log --all -- filename, um in allen Zweigen zu suchen.
Soren Bjornstad
37

Es sollte so einfach sein wie git log <somepath>; Überprüfen Sie die Manpage ( git-log(1)).

Persönlich verwende ich gerne, git log --stat <path>damit ich die Auswirkungen jedes Commits auf die Datei sehen kann.

rfunduk
quelle
9
Oder selbst -pwenn Sie den vollständigen Unterschied sehen möchten, nicht nur, dass einige Zeilen geändert wurden.
Cascabel
Stimmt, aber das ist ziemlich laut, wenn man bedenkt, dass die meisten Dateien im Laufe ihres Lebens viele Male geändert wurden. Ich möchte nicht die vollständigen Unterschiede jedes einzelnen Commits sehen, das jemals eine Datei berührt hat. Normalerweise suche ich nach einer bestimmten Sache, damit ich ein Protokoll mit nur Auswirkungen und dann git showüber die spezifischen Commits erhalten kann, die so aussehen, als wären sie wichtig.
Rfunduk
git log --stat --follow - * .html => Liste der Commits mit genau einer Datei in jedem Commit ausgeben. Sehr schön!
Sergio Belevskij
18

Alternativ (seit Git 1.8.4) ist es auch möglich, alle Commits abzurufen, die einen bestimmten Teil einer Datei geändert haben . Sie können dies erhalten, indem Sie die Startzeile und die Endzeilennummer übergeben.

Das zurückgegebene Ergebnis wäre die Liste der Commits, die diesen bestimmten Teil geändert haben. Der Befehl lautet wie folgt:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

wo upperLimitist das start_line_numberund lowerLimitist dasending_line_number

Weitere Informationen - https://www.techpurohit.com/list-some-useful-git-commands

Jitendrapurohit
quelle
17

Wie jackrabb1t hervorhob, --followist es robuster, da es weiterhin den Verlauf über das Umbenennen / Verschieben hinaus auflistet. Wenn Sie also nach einer Datei suchen, die sich derzeit nicht im selben Pfad befindet, oder nach einer Datei, die während verschiedener Commits umbenannt wurde, wird sie von --follow nachverfolgt.

Dies kann eine bessere Option sein, wenn Sie die Namens- / Pfadänderungen visualisieren möchten:

git log --follow --name-status -- <path>

Aber wenn Sie eine kompaktere Liste mit nur dem wollen, was zählt:

git log --follow --name-status --format='%H' -- <path>

oder auch

git log --follow --name-only --format='%H' -- <path>

Der Nachteil ist, dass --follownur für eine einzelne Datei funktioniert.

Roberto
quelle
4
--followfunktioniert für einen einzelnen Pfad , der ein Verzeichnis sein kann. Wenn ein Verzeichnis übergeben wird, wird es rekursiv ausgeführt und meldet Änderungen an alle Dateien unterhalb dieses Punkts.
StvnW
10

Wenn Sie versuchen, einer Datei zu folgen, die in einem früheren Commit gelöscht wurde, verwenden Sie

git log --follow -- filename
Snovelli
quelle
3
Für gitNeulinge: Verwenden Sie diese Option git log -p --follow -- filename, um auch die Änderungen anzuzeigen. Beachten Sie auch: "Dateiname" kann eine Datei, ein Verzeichnis oder ein Submodul sein.
Tino
8

Wenn Sie alle Commits anzeigen möchten, die eine Datei in allen Zweigen geändert haben, verwenden Sie Folgendes:

git log --follow --all <filepath>
Always_Beginner
quelle
8

Wenn Sie nach allen Commits nach filenameund nicht nach suchen möchten filepath, verwenden Sie:

git log --all -- '*.wmv'
Wunderland
quelle
6

Wenn Sie alle Änderungen sehen möchten, die in Commits vorgenommen wurden, die eine bestimmte Datei geändert haben (und nicht nur die Änderungen an der Datei selbst), können Sie Folgendes übergeben --full-diff:

git log -p --full-diff [branch] -- <path>
Kubisch
quelle
oder ohne die[branch]
Anentropic
1
@Anentropic Die eckigen Klammern sollten anzeigen, dass das Argument optional ist.
Cubic
Es ist alles, was ich brauche. Es zeigt die vollständige Änderung, einschließlich einiger Änderungen aus der Zusammenführung.
ThanhLD
5

Verwenden Sie git log --all <filename>diese Option , um die Commits anzuzeigen, die <filename>in allen Zweigen Einfluss haben .

Lebnik
quelle
4
gitk <path_to_filename>

Angenommen, das Paket "gitk" ist bereits installiert.

Wenn es nicht installiert ist, gehen Sie folgendermaßen vor:

sudo apt-get install gitk

Versuchen Sie dann den obigen Befehl. Es ist für Linux ... Es könnte Linux-Benutzern helfen, wenn sie eine grafische Benutzeroberfläche wünschen.

Breen ho
quelle
Beachten Sie für Windows-Benutzer, dass dies gitkmit Git für Windows gebündelt ist.
Soren Bjornstad
2

Um nur eine Liste der Commit-Hashes zu erhalten, verwenden Sie git rev-list

 git rev-list HEAD <filename>

Ausgabe:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

Dies bedeutet, dass 5 Commits diese Datei berührt haben. Die chronologische Reihenfolge ist umgekehrt, daher ist das erste Commit in der Liste b7c4f0d7das aktuellste.

Boris
quelle
1

Unter Linux können Sie dafür gitk verwenden.

Es kann mit "sudo apt-get install git-gui gitk" installiert werden. Es kann verwendet werden, um Commits einer bestimmten Datei mit "gitk <Dateiname>" anzuzeigen.

Chamila Wijayarathna
quelle
1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

Referenz

AnshBikram
quelle