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.
- Der Blob speichert den eigentlichen Text oder die Daten in Ihrer Datei.
- Der Tree ordnet diesen Blob einem bestimmten Dateinamen und einem Ordnerpfad zu.
- 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:
Ein Repository initialisieren:
mkdir git-labcd git-labgit initEine Datei erstellen und ihren Hash finden:
echo 'Hello Git' > hello.txtgit hash-object hello.txtDie Datei als Blob speichern:
git hash-object -w hello.txtObjekttyp und Inhalt prüfen:
git cat-file -t [YOUR_HASH]git cat-file -p [YOUR_HASH]Einen Commit erstellen und den Tree ansehen:
git add hello.txtgit 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
