Skip to main content

git init und das .git-Verzeichnis

Der Moment, in dem ein Repository entsteht

Bevor Git eine einzige Datei verfolgen kann, muss es einen Ort haben, an dem es seine gesamte Buchführung ablegt. Genau das leistet der Befehl git init: Er verwandelt ein gewöhnliches Verzeichnis in ein Git-Repository, indem er darin ein verstecktes Unterverzeichnis namens .git anlegt. Dieses Verzeichnis ist keine Nebensächlichkeit – es ist das Repository. Alles, was du später über Commits, Branches, Remotes oder die Historie erfährst, ist letztlich nur eine strukturierte Sammlung von Dateien innerhalb dieses einen Ordners.

In diesem Abschnitt öffnest du das .git-Verzeichnis bewusst, statt es als Blackbox zu behandeln. Das schafft ein solides mentales Modell für alles Folgende.

git init ausführen

Wechsle in Git Bash oder PowerShell in dein Übungsprojekt und führe aus:

cd C:\Users\DeinName\Projekte\uebungsprojekt
git init

Die Ausgabe sieht sinngemäß so aus:

Initialized empty Git repository in C:/Users/DeinName/Projekte/uebungsprojekt/.git/

Wichtig ist die Formulierung „empty Git repository“. Es wurden noch keine Dateien verfolgt, kein Commit erstellt – lediglich das Grundgerüst wurde angelegt. Ein Repository existiert also bereits, bevor überhaupt ein Commit gemacht wurde.

Hinweis: Seit neueren Git-Versionen kannst du den initialen Branch direkt festlegen, etwa mit git init -b main. Das ist besonders unter Windows sinnvoll, da die Standardeinstellung je nach Konfiguration variieren kann (siehe Kapitel 2, Abschnitt „Standard-Branch und Standard-Editor festlegen“).

Das .git-Verzeichnis sichtbar machen

Unter Windows 11 sind versteckte Dateien standardmäßig ausgeblendet. Um .git im Windows-Explorer zu sehen, aktiviere unter Ansicht → Ausgeblendete Elemente die Anzeige versteckter Ordner. Schneller geht es über die Kommandozeile:

ls -la

In PowerShell:

Get-ChildItem -Force

Du solltest neben deinen Projektdateien einen Eintrag .git sehen – ein Verzeichnis, kein Symlink, keine spezielle Systemdatei. Das ist bewusst so gestaltet: Git funktioniert vollständig lokal und plattformunabhängig, ohne Betriebssystem-Dienste oder Datenbanken.

Struktur des .git-Verzeichnisses

Wirf einen Blick in den Inhalt:

ls -la .git

Ein frisch initialisiertes Repository enthält typischerweise folgende Elemente:

Element Bedeutung
HEAD Zeigt symbolisch auf den aktuell aktiven Branch
config Repository-spezifische Konfiguration
description Beschreibungstext, relevant für ältere Web-Oberflächen wie GitWeb
hooks/ Vorlagen für clientseitige und serverseitige Hooks
info/ Lokale Ausschlussregeln und Metainformationen
objects/ Der eigentliche Objektspeicher für Blobs, Trees und Commits
refs/ Referenzen auf Branches und Tags

Zum aktuellen Zeitpunkt sind objects/ und refs/ noch weitgehend leer – schließlich wurde noch kein Inhalt committet. Das ändert sich, sobald du im nächsten Abschnitt deinen ersten Commit erstellst.

HEAD: der Zeiger auf die Gegenwart

Öffne die Datei HEAD in einem Texteditor oder gib ihren Inhalt aus:

cat .git/HEAD

Die Ausgabe lautet üblicherweise:

ref: refs/heads/main

Das bedeutet: HEAD verweist nicht direkt auf einen Commit, sondern symbolisch auf einen Branch – konkret auf refs/heads/main. Da dieser Branch noch keinen Commit besitzt, existiert die referenzierte Datei refs/heads/main momentan noch gar nicht. Erst der erste Commit erzeugt sie. Dieses Verhalten ist ein gutes Beispiel dafür, dass Git mit Verweisen auf Verweise arbeitet – ein Konzept, das in Kapitel 23 vertieft wird.

config: lokale Einstellungen

Die Datei .git/config enthält repository-spezifische Konfiguration, die Vorrang vor globalen Einstellungen hat:

cat .git/config

Direkt nach git init findest du dort meist nur einen minimalen Abschnitt:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    symlinks = false
    ignorecase = true

Bemerkenswert für Windows-Nutzer sind besonders filemode = false und ignorecase = true – beide spiegeln Eigenschaften des NTFS-Dateisystems wider und werden in Kapitel 29 im Detail erklärt.

objects/ und refs/: die beiden tragenden Säulen

Auch wenn diese Verzeichnisse aktuell leer wirken, lohnt sich ein kurzer Blick:

ls .git/objects
ls .git/refs

objects/ wird später sämtliche Inhalte deines Projekts als inhaltsadressierte, unveränderliche Objekte speichern – Kapitel 22 widmet sich diesem Content-Addressable Storage ausführlich. refs/ enthält die Unterordner heads und tags, die Branches beziehungsweise Tags als einfache Textdateien mit einem Commit-Hash abbilden.

Visualisierung des Zusammenhangs

Das folgende Diagramm zeigt, wie die zentralen Bestandteile direkt nach git init zusammenhängen:

graph TD
    A["Arbeitsverzeichnis"] -->|git init| B[".git Verzeichnis"]
    B --> C["HEAD - verweist auf refs/heads/main"]
    B --> D["config - lokale Einstellungen"]
    B --> E["objects - noch leer"]
    B --> F["refs/heads - noch leer"]
    C -.->|symbolischer Verweis| F

    style B fill:#2f3b52,color:#ffffff
    style C fill:#3b5b3b,color:#ffffff

Der gestrichelte Pfeil verdeutlicht, dass HEAD lediglich symbolisch auf refs/heads/main zeigt – ein Ziel, das erst mit dem ersten Commit real wird.

Ein bestehendes Verzeichnis erneut initialisieren

Führst du git init in einem Verzeichnis aus, das bereits ein Repository ist, richtet Git keinen Schaden an. Der Befehl ist idempotent: Bestehende Konfiguration, Objekte und Referenzen bleiben unverändert, Git meldet lediglich eine Reinitialisierung:

Reinitialized existing Git repository in ...

Das ist nützlich, wenn du beispielsweise versehentlich gelöschte Vorlagendateien in hooks/ wiederherstellen möchtest, ohne die eigentliche Historie zu gefährden.

Ein Repository wieder entfernen

Da das gesamte Repository ausschließlich im .git-Verzeichnis lebt, genügt dessen Löschung, um alle Versionsinformationen vollständig und unwiderruflich zu entfernen – deine eigentlichen Projektdateien bleiben dabei unberührt:

Remove-Item -Recurse -Force .git

Dies solltest du nur bewusst und niemals in einem produktiven Projekt ohne Sicherung ausführen. Es demonstriert aber sehr eindringlich, dass Git keine externe Datenbank, sondern schlicht ein gut organisiertes Dateisystem nutzt.

Blick in PhpStorm

Öffnest du das gerade initialisierte Verzeichnis in PhpStorm, erkennt die IDE das Repository automatisch anhand des .git-Ordners und aktiviert die VCS-Funktionen im Menü Git. PhpStorm blendet .git standardmäßig aus der Projektübersicht aus, da es sich um Metadaten und nicht um Projektinhalt handelt. Über Einstellungen → Editor → File Types lässt sich diese Ausblendung zwar anpassen, für den Alltag ist sie jedoch sinnvoll: Du arbeitest mit den komfortablen Werkzeugen der IDE, während das rohe .git-Verzeichnis unangetastet im Hintergrund verwaltet wird.

Zwischenfazit

Mit git init hast du kein „Werkzeug gestartet“, sondern eine konkrete, inspizierbare Datenstruktur erzeugt. HEAD, config, objects/ und refs/ sind keine abstrakten Begriffe, sondern reale Dateien und Verzeichnisse, die du jederzeit öffnen kannst. Dieses Verständnis trägt dich durch den gesamten Kurs: Jeder spätere Befehl – ob commit, branch, merge oder reset – verändert am Ende nichts anderes als genau diese Dateien im .git-Verzeichnis.

Im nächsten Abschnitt nutzt du git status, um den aktuellen Zustand deines frisch initialisierten Repositorys systematisch zu lesen, bevor du die erste Datei zur Nachverfolgung vormerkst. 🗂️