Wie finde ich den Commit, in dem eine bestimmte Datei hinzugefügt wurde?

Lesezeit: 4 Minuten

Benutzer-Avatar
Zombo

Angenommen, ich habe eine Datei foo.js das wurde vor einiger Zeit begangen. Ich möchte einfach den Commit finden, wo diese Datei zuerst hinzugefügt wurde.

Nach dem Lesen der Antworten und meinem eigenen Basteln funktioniert das für mich

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

  • Das ist besser als alle Antworten, da es umbenannte Dateien nachverfolgt.

    – Rainer Rillke

    5. Juni 2021 um 17:18 Uhr

  • Denken Sie, dass es einige Grenzfälle gibt, in denen dies mehr als ein Ergebnis zurückgeben kann, z. B. wenn eine Datei hinzugefügt und anschließend gelöscht und in einem anderen Commit (dh nicht umbenannt) erneut hinzugefügt wird. Seth Robinsons Antwort scheint diese Fälle zu behandeln.

    – Steve Kammern

    24. August 2021 um 12:45 Uhr

  • Aus Interesse, wie hast du dich für 40% entschieden --find-renames? Scheint ganz gut für mich zu funktionieren und habe einige davon abgeholt --follow allein nicht, nur neugierig …

    – Steve Kammern

    24. August 2021 um 15:06 Uhr


Benutzer-Avatar
stelterd

Hier ist eine einfachere, “reine Git”-Methode, ohne dass eine Pipeline erforderlich ist:

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 dafür einen praktischen Alias, weil ich ihn immer vergesse:

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

Das macht es so einfach wie:

git whatadded -- foo.js

Der untere Einzeiler durchsucht rekursiv Unterverzeichnisse der $PWD zum foo.js ohne einen absoluten oder relativen Pfad zur Datei angeben zu müssen, noch muss sich die Datei im selben Verzeichnis wie die befinden $PWD

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

  • +1! Meine Datei befand sich jedoch in einem Unterordner, sodass sie nur funktionierte, nachdem ich vorne ein Sternchen hinzugefügt hatte git log --diff-filter=A -- *subfolder/foo.js

    – Geo

    16. August 2013 um 17:40 Uhr


  • Wie funktioniert dies bei Dateien, die aus anderen Zweigen zusammengeführt wurden, die aber nicht unbedingt von dem Benutzer, der die Zusammenführung durchführt, zu dem Zweig hinzugefügt wurden, der zusammengeführt wird?

    Benutzer67416

    22. Januar 2014 um 18:47 Uhr


  • Ja, sie haben die Ankerstruktur in den Dokumenten geändert. Aktualisiert, danke!

    – stelterd

    20. März 2019 um 20:55 Uhr

  • @geo Ich glaube, ich verstehe, was du sagst, aber nicht wirklich, aber ich habe einen ähnlichen Anwendungsfall, bei dem ich im Allgemeinen im Projektstamm eines Git-Verzeichnisses bleibe und von dort Befehle ausgebe und den mitgelieferten Einzeiler verwende git log --diff-filter=A -- foo.js habe die Commit-ID / den Hash nicht in STDOUT in meinem Terminal gedruckt, sondern ich musste den relativen Pfad zur Datei aus dem Git-Repo-Root angeben, um die gewünschten Ergebnisse zu erhalten

    – Ipatch

    11. Dezember 2019 um 20:08 Uhr


  • Sehr schön, Sie wissen, dass Sie das setzen können -- auch im Alias, damit Sie schreiben können git whatadded foo.js?

    – Andreas Magnusson

    22. September 2021 um 8:23 Uhr

Benutzer-Avatar
Seth Robertson

git log --follow --find-renames=40% --oneline -- foo.js | tail -n 1

  • Ich wäre nett zu haben --follow.

    – Yasushi-Shoji

    19. August 2012 um 17:31 Uhr

  • Die akzeptierte Lösung hat bei mir nicht funktioniert, aber diese hat es getan. Vielen Dank!

    – Stevie Howard

    16. Oktober 2019 um 15:55 Uhr

  • Ich habe die Antwort so bearbeitet, dass sie beide enthält --follow und --find-renames=40% Es folgt also Dateiumbenennungen und findet den ursprünglichen Autor – hoffe, das ist in Ordnung?

    – Steve Kammern

    24. August 2021 um 14:14 Uhr

Benutzer-Avatar
Reid

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

Sie können verwenden git-blame um anzuzeigen, welche Revision und welcher Autor jede Zeile einer Datei zuletzt geändert hat, insbesondere eine Dateianmerkung. Besuch https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Zum Beispiel,

git blame -L 174,190  xx.py

Die Option -L beschränkt die Ausgabe der Anmerkung auf die Zeilen 174 bis 190, sodass Sie die Autoren und den Commit-Hash usw. von Zeile 174 bis 190 für die Datei xx.py sehen

  • 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

    6. Februar 2017 um 22:25 Uhr

  • 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 Dateiannotation oft Ihr bestes Werkzeug. Es zeigt Ihnen, welches Commit als letztes jede Zeile einer beliebigen Datei geändert hat, also verwendet dieses Beispiel, das ich gezeigt habe, die Option -L, um die Ausgabe auf die Zeilen 174 bis 190 zu beschränken, und das Letzte, was nur die Zieldatei ist, die Sie überprüfen möchten ( xx.py), in diesem Fall eine Python-Datei @rossmcm

    – Reide

    23. Februar 2017 um 16:46 Uhr


Wenn es eine Alternative ist, dies nicht programmgesteuert zu tun, geht dies sehr schnell. Öffnen Sie die gitk-GUI.

gitk file

Scrollen Sie dann einfach zum ersten Commit

1017600cookie-checkWie finde ich den Commit, in dem eine bestimmte Datei hinzugefügt wurde?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy