Einführung
Der Index, auch Staging Area oder Cache genannt, ist eines der unterscheidenden Merkmale von Git. Es handelt sich um eine Binärdatei unter .git/index, die den Tree enthält, den Sie als Nächstes committen wollen. Den Index zu verstehen, beseitigt das meiste Geheimnis aus der Ausgabe von git status.
Warum er existiert
Der Index erlaubt es Ihnen, einen Commit bewusst zusammenzustellen, anstatt jede Änderung auf einmal abzuwerfen. Sie können zehn Dateien bearbeiten, aber nur die drei committen, die einen Bug beheben, und den Rest für einen späteren Commit gestaged lassen. Diese Entkopplung ermöglicht eine saubere, atomare Historie.
Den Index inspizieren
Zwei Befehle vergleichen die drei Bereiche:
git diff # Working Tree vs. Index
git diff --staged # Index vs. HEAD
git diff HEAD # Working Tree vs. HEAD
Der Plumbing-Befehl git ls-files --stage zeigt den Rohinhalt des Index, einschließlich der SHA-1-Hashes:
git ls-files --stage
Änderungen stagen
git add file.txt # hinzufügen oder aktualisieren
git add . # alles ab cwd hinzufügen
git add -u # nur verfolgte Dateien aktualisieren
git add -p # interaktiv Hunk für Hunk
git add -N new.txt # intent-to-add (leer verfolgen)
Unstagen
Wenn Sie versehentlich etwas gestaged haben, nehmen Sie es heraus, ohne die Bearbeitung zu verlieren:
# Modern (Git 2.23+)
git restore --staged file.txt
# Ältere Syntax, funktioniert weiterhin
git reset HEAD file.txt
Der Index bei Konflikten
Während eines Merge-Konflikts erhält der Index drei Einträge pro konfliktbehaftetem Pfad: Stage 1 ist der gemeinsame Vorfahre, Stage 2 ist "ours", Stage 3 ist "theirs". git ls-files -u zeigt sie an:
git ls-files -u
Den Konflikt zu lösen bedeutet, eine endgültige Version zu schreiben und sie mit git add hinzuzufügen, wodurch alles wieder zu einem einzigen Stage-0-Eintrag zusammenfällt.
Das Index-Dateiformat
Der Index ist ein Binärformat, das in der Git-Quelle unter Documentation/gitformat-index.txt dokumentiert ist. Er beginnt mit einem 12-Byte-Header (Signatur DIRC, Version, Eintragszahl), gefolgt von sortierten Einträgen. Mehrere optionale Erweiterungen fügen Caching hinzu: TREE cacht Subtree-Hashes für schnelles write-tree, und UNTR cacht Listen untracked Dateien für schnelles git status. Modernes Git unterstützt auch einen Sparse-Index, der Einträge außerhalb des ausgecheckten Cones auslässt:
git sparse-checkout init --cone
git config core.sparseCheckoutCone true
git update-index --test-untracked-cache
Häufige Fehler
Zu glauben, dass git add endgültig sei. Ist es nicht: Sie können stagen, erneut bearbeiten und erneut stagen. Der Index ist nur der Entwurf des nächsten Commits. Eine weitere klassische Verwirrung: Eine gestagete Datei bearbeiten, dann committen und sich wundern, dass die neuen Bearbeitungen nicht enthalten sind. git add erfasst einen Snapshot in dem Moment, in dem Sie ihn ausführen; nachfolgende Bearbeitungen leben nur im Working Tree. Führen Sie git diff (ohne Flags) aus, um zu sehen, was gestaged-aber-dann-modifiziert ist. Schließlich: Löschen Sie .git/index niemals manuell; bauen Sie ihn mit git read-tree HEAD neu auf, falls er korrupt wird.