git - Find Commit, wo Datei hinzugefügt wurde

208

Angenommen, ich habe eine Datei foo.js, die vor einiger Zeit festgeschrieben wurde. Ich möchte einfach das Commit finden, bei dem diese Datei zuerst hinzugefügt wurde.

Nachdem ich die Antworten gelesen und selbst gebastelt habe, funktioniert das für mich

git log --follow --diff-filter=A --find-renames=40% foo.js
Steven Penny
quelle

Antworten:

316

Hier ist eine einfachere, "reine Git" -Methode, ohne dass eine Pipeline benötigt wird:

git log --diff-filter=A -- foo.js

Überprüfen Sie die Dokumentation. Sie können dasselbe für Gelöscht, Geändert usw. tun.

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

Ich habe einen praktischen Alias ​​dafür, weil ich ihn immer vergesse:

git config --global alias.whatadded 'log --diff-filter=A'

Dies macht es so einfach wie:

git whatadded -- foo.js

Der unten stehende Liner durchsucht rekursiv die Unterverzeichnisse von $PWDfor, foo.jsohne einen absoluten oder relativen Pfad zur Datei angeben zu müssen, und die Datei muss sich auch nicht im selben Verzeichnis wie die befinden$PWD

git log --diff-filter=A -- **foo.js
stelterd
quelle
27
+1! Meine Datei befand sich jedoch in einem Unterordner und funktionierte daher erst, nachdem ich vorne ein Sternchen hinzugefügt hattegit log --diff-filter=A -- *subfolder/foo.js
Geo
4
Wie funktioniert dies bei Dateien, die aus anderen Zweigen zusammengeführt wurden, aber nicht unbedingt zu dem Zweig hinzugefügt wurden, der vom Benutzer, der die Zusammenführung durchführt, zusammengeführt wird?
g33kz0r
Der obige Doc-Link springt nicht zu den Flag-Informationen. Vielleicht hat es sich seit dem Posten geändert. git-scm.com/docs/git-log#Documentation/…
Webbower
1
Ja, sie haben die Ankerstruktur in den Dokumenten geändert. Aktualisiert, danke!
Stelterd
@geo Ich glaube, ich verstehe, was Sie sagen, aber nicht wirklich, aber ich habe einen ähnlichen Anwendungsfall, bei dem ich im Allgemeinen im Projektstamm eines Git-Verzeichnisses bleibe und Befehle von dort aus erteile und mit dem mitgelieferten Einzeiler git log --diff-filter=A -- foo.jsden nicht druckte ID / Hash in STDOUT in meinem Terminal festschreiben, stattdessen musste ich den relativen Pfad zur Datei vom Git-Repo-Stamm
angeben
17
git log --oneline -- foo.js | tail -n 1
Seth Robertson
quelle
1
Ich wäre schön zu haben --follow.
Yasushi Shoji
Die akzeptierte Lösung hat bei mir nicht funktioniert, aber das hat funktioniert. Vielen Dank!
Stevie Howard
1

Folgendes ist möglicherweise nicht von Ihrem Interesse, aber ich denke, es wird Ihnen in Zukunft helfen und ist Teil des Debugging-Ökosystems in Git:

Sie können verwenden, git-blameum anzuzeigen, welche Revision und welcher Autor die letzten Zeilen einer Datei zuletzt geändert haben, insbesondere Dateianmerkungen. Besuchen Sie https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Beispielsweise,

git blame -L 174,190  xx.py
Reidel
quelle
Könnten Sie bitte erklären, was jeder der Operanden tut? Mir ist klar, dass Sie einen Link zum relevanten RTFM bereitgestellt haben, aber eine kleine Erläuterung würde Ihren Beitrag zu einem One-Stop-Shop machen.
Rossmcm
Wie das Pro-Git-Buch sagt Wenn Sie einen Fehler in Ihrem Code aufspüren und wissen möchten, wann er eingeführt wurde und warum, ist die Dateianmerkung häufig das beste Werkzeug. Es zeigt Ihnen, welches Commit das letzte war, das jede Zeile einer Datei geändert hat. In diesem Beispiel, das ich gezeigt habe, wird die Ausgabe mit der Option -L auf die Zeilen 174 bis 190 beschränkt, und das Letzte ist nur die Zieldatei, die Sie überprüfen möchten ( xx.py) in diesem Fall eine Python-Datei @rossmcm
Reidel