Gibt es eine Möglichkeit, alle Commits aufzulisten, die eine bestimmte Datei geändert haben?
Gibt es eine Möglichkeit, alle Commits aufzulisten, die eine bestimmte Datei geändert haben?
Antworten:
Das --follow
funktioniert 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
).
--follow
Konten für Umbenennungen, so ist dies robuster alsgit log -- path
--follow
ein 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.)
git log filename?
git log filename
folgt 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 X
und Y
änderte beide, dann gelöscht Y
und umbenannt X
zu Y
und 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, --follow
Sie erhalten Commits bezüglich dieser Datei, wenn sie benannt wurde X
und als sie benannt wurde Y
.
git log path
sollte tun was du willst. Vom git log
Mann :
[--] <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.
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
--reflog
Commits 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 log
und herauszufinden, warum ich scheinbar doppelte Commits sah!
Verwenden Sie den folgenden Befehl, um Commits für eine bestimmte Datei abzurufen:
git log -p filename
git log -p mybranch -- filename
oder nur verwenden git log --all -- filename
, um in allen Zweigen zu suchen.
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.
-p
wenn Sie den vollständigen Unterschied sehen möchten, nicht nur, dass einige Zeilen geändert wurden.
git show
über die spezifischen Commits erhalten kann, die so aussehen, als wären sie wichtig.
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 upperLimit
ist das start_line_number
und lowerLimit
ist dasending_line_number
Weitere Informationen - https://www.techpurohit.com/list-some-useful-git-commands
Wie jackrabb1t hervorhob, --follow
ist 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 --follow
nur für eine einzelne Datei funktioniert.
--follow
funktioniert 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.
Wenn Sie versuchen, einer Datei zu folgen, die in einem früheren Commit gelöscht wurde, verwenden Sie
git log --follow -- filename
git
Neulinge: 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.
Wenn Sie alle Commits anzeigen möchten, die eine Datei in allen Zweigen geändert haben, verwenden Sie Folgendes:
git log --follow --all <filepath>
Wenn Sie nach allen Commits nach filename
und nicht nach suchen möchten filepath
, verwenden Sie:
git log --all -- '*.wmv'
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>
[branch]
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.
gitk
mit Git für Windows gebündelt ist.
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 b7c4f0d7
das aktuellste.
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.
# 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>