So prüfen Sie, ob eine Datei in einem Git-Repository existiert

GitGitBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie prüfen können, ob eine Datei in der Historie eines Git-Repositorys existiert. Wir werden zwei Hauptmethoden untersuchen: die Verwendung des Befehls git ls-tree, um den Inhalt eines bestimmten Commits zu untersuchen, und die Nutzung von git log mit einem Dateipfad, um die Historie einer bestimmten Datei anzuzeigen.

Durch praktische Übungen üben Sie die Verwendung von git ls-tree, um die in einem Commit-Snapshot vorhandenen Dateien zu untersuchen, und nutzen git log -- <file>, um die Existenz und die Historie einer Datei zu überprüfen. Wir werden diese Methoden auch mit nicht vorhandenen Dateien testen, um ihr Verhalten zu verstehen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/status("Check Status") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/status -.-> lab-560021{{"So prüfen Sie, ob eine Datei in einem Git-Repository existiert"}} git/log -.-> lab-560021{{"So prüfen Sie, ob eine Datei in einem Git-Repository existiert"}} end

Ausführen von git ls-tree zur Dateiprüfung

In diesem Schritt werden wir untersuchen, wie wir mit dem Befehl git ls-tree in unsere Git-Zeitmaschine hineinschauen können. Dieser Befehl ermöglicht es uns, den Inhalt eines bestimmten Commits zu sehen, ähnlich wie wenn wir in eine versiegelte Zeitkapsel hineinschauen, ohne sie vollständig zu öffnen.

Zunächst stellen wir sicher, dass wir uns in unserem Projektverzeichnis befinden:

cd ~/project/my-time-machine

Jetzt verwenden wir git ls-tree, um den Inhalt unseres neuesten Commits zu sehen. Wir benötigen die Commit-ID, die Sie aus der Ausgabe von git log erhalten können. Alternativ können Sie HEAD verwenden, das sich auf den neuesten Commit bezieht.

git ls-tree HEAD

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

100644 blob a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9	message.txt

Lassen Sie uns diese Ausgabe analysieren:

  • 100644: Dies ist der Dateimodus, der anzeigt, dass es sich um eine normale Datei handelt.
  • blob: Dies zeigt an, dass es sich in Git um ein "Blob"-Objekt handelt, wie Git Dateiinhalte speichert.
  • a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9: Dies ist der eindeutige Bezeichner (Hash) des Blob-Objekts, das den genauen Inhalt der Datei message.txt zum Zeitpunkt des Commits darstellt.
  • message.txt: Dies ist der Name der Datei.

Der Befehl git ls-tree ist nützlich, um den Inhalt eines Commits zu untersuchen, ohne diesen Commit auszuchecken. Er zeigt Ihnen die Dateien und Verzeichnisse, die Teil dieses bestimmten Zeitpunktsnapshots waren. Dies unterscheidet sich von git status, das Ihnen den aktuellen Zustand Ihres Arbeitsverzeichnisses im Vergleich zum neuesten Commit zeigt.

Das Verständnis von git ls-tree hilft Ihnen zu verstehen, wie Git die Historie Ihres Projekts als eine Reihe von Snapshots speichert, wobei jeder Snapshot seine eigene Gruppe von Dateien und Verzeichnissen hat.

Verwenden von git log -- <Datei> zur Überprüfung

Im vorherigen Schritt haben wir git ls-tree verwendet, um den Inhalt eines Commits zu sehen. Jetzt wollen wir eine andere Möglichkeit erkunden, die Historie einer bestimmten Datei anzuzeigen, indem wir git log mit einem Dateipfad verwenden.

Stellen Sie sicher, dass Sie sich immer noch in Ihrem Projektverzeichnis befinden:

cd ~/project/my-time-machine

Jetzt verwenden wir git log, um die Historie unserer message.txt-Datei anzuzeigen:

git log -- message.txt

Sie sollten den Log-Eintrag für den Commit sehen, in dem wir message.txt erstellt haben:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Your Name <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

Der Teil -- message.txt des Befehls teilt git log mit, nur Commits anzuzeigen, die die Datei message.txt beeinflusst haben. Dies ist unglaublich nützlich, wenn Sie ein großes Projekt mit vielen Dateien haben und nur die Historie einer bestimmten Datei sehen möchten.

Dieser Befehl hilft Ihnen, Fragen wie die folgenden zu beantworten:

  • Wann wurde diese Datei erstellt?
  • Wer hat die letzte Änderung an dieser Datei vorgenommen?
  • Was waren die Änderungen an dieser Datei in einem bestimmten Commit?

Wenn Ihr Projekt wächst und Sie mehr Commits erstellen, wird die Verwendung von git log -- <Datei> unerlässlich sein, um die Historie und Entwicklung einzelner Dateien in Ihrem Projekt zu verstehen.

Drücken Sie q, um die Log-Ansicht zu verlassen.

Testen von nicht existierenden Dateien

In den vorherigen Schritten haben wir erfolgreich git ls-tree und git log -- <Datei> verwendet, um eine Datei zu untersuchen, die in unserem Git-Repository existiert. Jetzt wollen wir sehen, was passiert, wenn wir versuchen, diese Befehle auf eine Datei anzuwenden, die in der Historie des Repositorys nicht existiert.

Stellen Sie sicher, dass Sie sich in Ihrem Projektverzeichnis befinden:

cd ~/project/my-time-machine

Zunächst versuchen wir, git ls-tree auf eine nicht existierende Datei anzuwenden, beispielsweise nonexistent.txt:

git ls-tree HEAD nonexistent.txt

Sie sollten keine Ausgabe sehen. Dies liegt daran, dass git ls-tree nur Einträge auflistet, die im angegebenen Baum (in diesem Fall der Baum bei HEAD) vorhanden sind. Da nonexistent.txt nicht im Baum des neuesten Commits ist, wird nichts angezeigt.

Jetzt versuchen wir, git log auf dieselbe nicht existierende Datei anzuwenden:

git log -- nonexistent.txt

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

fatal: no such path 'nonexistent.txt' in HEAD

Dies ist ein unterschiedliches Verhalten! git log -- <Datei> sucht speziell nach Commits, die den angegebenen Dateipfad im Laufe der Historie beeinflusst haben. Wenn der Dateipfad in keinem Commit jemals existiert hat, teilt Ihnen Git mit, dass es "keinen solchen Pfad" gibt.

Dieser Unterschied im Verhalten zeigt, wie diese Befehle funktionieren:

  • git ls-tree untersucht einen bestimmten Snapshot (Commit) und listet dessen Inhalt auf.
  • git log -- <Datei> durchsucht die gesamte Historie nach Änderungen, die sich auf einen bestimmten Dateipfad beziehen.

Das Verständnis dieser Unterschiede hilft Ihnen, den richtigen Befehl für die Aufgabe auszuwählen. Wenn Sie sehen möchten, welche Dateien in einem Commit enthalten waren, verwenden Sie git ls-tree. Wenn Sie die Historie einer Datei sehen möchten, verwenden Sie git log -- <Datei>.

Zusammenfassung

In diesem Lab haben wir gelernt, wie man prüft, ob eine Datei in der Historie eines Git-Repositorys existiert, ohne spezifische Commits auschecken zu müssen. Zunächst haben wir uns den Befehl git ls-tree angeschaut, der es uns ermöglicht, den Inhalt eines bestimmten Commits (z. B. HEAD) zu untersuchen und die Dateien sowie ihre entsprechenden Blob-Hashes anzuzeigen. Dieser Befehl liefert einen Snapshot des Repositorys zu einem bestimmten Zeitpunkt und zeigt Dateimodi, Objekttypen, Objekt-IDs und Dateinamen.

Anschließend haben wir begonnen, git log mit einem Dateipfad zu verwenden, um die Commit-Historie speziell für diese Datei anzuzeigen. Diese Methode ermöglicht es uns, zu sehen, wann eine Datei hinzugefügt, geändert oder gelöscht wurde und bietet eine andere Perspektive auf ihre Existenz innerhalb der Zeitlinie des Repositorys.