Inside Git: Objekte & Hashing

Git ist schnell und zuverlässig, weil es Daten auf eine bestimmte Weise speichert. Um Git zu beherrschen, müssen Sie das .git-Verzeichnis verstehen. Dieser versteckte Ordner enthält alles, was Git benötigt, um Ihr Projekt zu verfolgen.

Git verwendet vier Hauptobjekttypen, um Ihre Arbeit zu verwalten:

  • Blobs: Diese speichern den Dateiinhalt.
  • Trees: Diese speichern Verzeichnisstrukturen und Dateinamen.
  • Commits: Diese speichern Snapshots Ihres Projekts und Metadaten.
  • Tags: Diese speichern Referenzen auf bestimmte Versionen.

Git identifiziert alles mithilfe von Hashing. Es verwendet den SHA-1-Algorithmus, um Daten in eine eindeutige ID umzuwandeln. Diese ID fungiert als Fingerabdruck. Wenn Sie auch nur ein einziges Zeichen in einer Datei ändern, ändert sich der Hash vollständig.

So erstellt Git einen Snapshot:

Wenn Sie eine Datei committen, erstellt Git eine Kette von Objekten.

  1. Der Blob speichert den eigentlichen Text oder die Daten in Ihrer Datei.
  2. Der Tree ordnet diesen Blob einem bestimmten Dateinamen und einem Ordnerpfad zu.
  3. Der Commit verknüpft den Tree mit einem Autor, einem Zeitstempel und einer Nachricht.

Git speichert keine Änderungen oder „Deltas“. Es speichert Snapshots. Jedes Mal, wenn Sie committen, erstellt Git neue Objekte. Dies macht Ihren Verlauf unveränderlich und leicht wiederherstellbar.

Das Verständnis dieser Struktur hilft Ihnen dabei, Fehler zu beheben, verlorene Daten wiederherzustellen und komplexe Branches zu verwalten.

Versuchen Sie dieses Miniprojekt, um es in Aktion zu sehen:

  1. Ein Repository initialisieren: mkdir git-lab cd git-lab git init

  2. Eine Datei erstellen und ihren Hash finden: echo 'Hello Git' > hello.txt git hash-object hello.txt

  3. Die Datei als Blob speichern: git hash-object -w hello.txt

  4. Objekttyp und Inhalt prüfen: git cat-file -t [YOUR_HASH] git cat-file -p [YOUR_HASH]

  5. Einen Commit erstellen und den Tree ansehen: git add hello.txt git commit -m 'Initial commit' git ls-tree HEAD

Wenn man unter die Haube schaut, erkennt man, dass Git mehr als nur ein Versionskontrollwerkzeug ist. Es ist eine hochorganisierte Datenbank aus inhaltsadressierten Objekten (content-addressed objects).

Quelle: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc

Optionale Lern-Community: https://t.me/GyaanSetuAi