Kapitel ▾ 2. Auflage

10.1 Git Internals - Werkzeuge und Benutzeroberfläche

Sie sind vielleicht von einem viel früheren Kapitel zu diesem gesprungen, oder Sie haben dieses Kapitel nach dem sequenziellen Lesen des gesamten Buches erreicht – in jedem Fall werden wir hier die inneren Abläufe und die Implementierung von Git durchgehen. Wir fanden, dass das Verständnis dieser Informationen für die Wertschätzung, wie nützlich und mächtig Git ist, von grundlegender Bedeutung war, aber andere haben uns argumentiert, dass es für Anfänger verwirrend und unnötig komplex sein kann. Daher haben wir diese Diskussion zum letzten Kapitel des Buches gemacht, damit Sie sie früh oder später in Ihrem Lernprozess lesen können. Wir überlassen es Ihnen, das zu entscheiden.

Jetzt, wo Sie hier sind, legen wir los. Erstens, falls es noch nicht klar ist: Git ist im Grunde ein inhaltsadressierbares Dateisystem, auf dem eine Benutzeroberfläche für ein Versionskontrollsystem aufgesetzt ist. Sie werden gleich mehr darüber erfahren, was das bedeutet.

In den frühen Tagen von Git (hauptsächlich vor 1.5) war die Benutzeroberfläche viel komplexer, da sie dieses Dateisystem eher betonte als ein poliertes VCS. In den letzten Jahren wurde die Benutzeroberfläche verfeinert, bis sie so sauber und einfach zu bedienen ist wie jedes andere System da draußen; das Stereotyp der frühen Git-Benutzeroberfläche, die komplex und schwer zu lernen war, bleibt jedoch bestehen.

Die inhaltsadressierbare Dateisystemschicht ist erstaunlich cool, deshalb werden wir sie zuerst in diesem Kapitel behandeln; dann lernen Sie die Transportmechanismen und die Repository-Wartungsaufgaben kennen, mit denen Sie sich möglicherweise irgendwann auseinandersetzen müssen.

Werkzeuge und Benutzeroberfläche

Dieses Buch behandelt hauptsächlich, wie man Git mit etwa 30 Unterbefehlen wie checkout, branch, remote usw. verwendet. Da Git ursprünglich ein Werkzeugkasten für ein Versionskontrollsystem und kein vollwertiges, benutzerfreundliches VCS war, gibt es eine Reihe von Unterbefehlen, die Low-Level-Arbeit leisten und dafür konzipiert wurden, im UNIX-Stil aneinandergereiht oder von Skripten aufgerufen zu werden. Diese Befehle werden im Allgemeinen als "Plumbing"-Befehle von Git bezeichnet, während die benutzerfreundlicheren Befehle als "Porcelain"-Befehle bezeichnet werden.

Wie Sie inzwischen bemerkt haben werden, befassen sich die ersten neun Kapitel dieses Buches fast ausschließlich mit Porcelain-Befehlen. Aber in diesem Kapitel werden Sie sich hauptsächlich mit den Low-Level-Plumbing-Befehlen beschäftigen, da diese Ihnen Zugang zu den inneren Abläufen von Git geben und demonstrieren, wie und warum Git das tut, was es tut. Viele dieser Befehle sind nicht dafür gedacht, manuell auf der Kommandozeile verwendet zu werden, sondern als Bausteine für neue Werkzeuge und benutzerdefinierte Skripte.

Wenn Sie git init in einem neuen oder bestehenden Verzeichnis ausführen, erstellt Git das .git-Verzeichnis, in dem fast alles gespeichert und manipuliert wird, was Git braucht. Wenn Sie Ihr Repository sichern oder klonen möchten, erhalten Sie fast alles, was Sie brauchen, indem Sie dieses einzelne Verzeichnis woanders kopieren. Dieses gesamte Kapitel befasst sich im Grunde mit dem, was Sie in diesem Verzeichnis sehen können. Hier ist, wie ein neu initialisiertes .git-Verzeichnis typischerweise aussieht:

$ ls -F1
config
description
HEAD
hooks/
info/
objects/
refs/

Abhängig von Ihrer Git-Version sehen Sie dort möglicherweise zusätzlichen Inhalt, aber dies ist ein frisches git init-Repository – das ist das, was Sie standardmäßig sehen. Die Datei description wird nur vom GitWeb-Programm verwendet, also machen Sie sich keine Sorgen darum. Die Datei config enthält Ihre projektspezifischen Konfigurationsoptionen, und das Verzeichnis info enthält eine globale exclude-Datei für ignorierte Muster, die Sie nicht in einer .gitignore-Datei verfolgen möchten. Das Verzeichnis hooks enthält Ihre client- oder serverseitigen Hook-Skripte, die in Git Hooks detailliert besprochen werden.

Übrig bleiben vier wichtige Einträge: die Dateien HEAD und (noch zu erstellende) index sowie die Verzeichnisse objects und refs. Dies sind die Kernbestandteile von Git. Das Verzeichnis objects speichert den gesamten Inhalt Ihrer Datenbank, das Verzeichnis refs speichert Zeiger auf Commit-Objekte in diesen Daten (Branches, Tags, Remotes und mehr), die Datei HEAD zeigt auf den Branch, den Sie gerade ausgecheckt haben, und die Datei index ist dort, wo Git die Informationen Ihrer Staging-Area speichert. Wir werden nun jeden dieser Abschnitte im Detail betrachten, um zu sehen, wie Git funktioniert.