🗂️Die drei Bereiche
Jede Datei existiert in Git bis zu dreimal: im Arbeitsverzeichnis (was du bearbeitest), im Index (auch „Staging-Area“ – der Entwurf des nächsten Commits, gespeichert in .git/index) und im Repository (der letzte Commit, auf den HEAD zeigt). Fast alle Befehle kopieren Dateien zwischen diesen drei Orten.
🔁Der Weg einer Änderung
Arbeitsverzeichnis Index (Staging) Repository (HEAD)
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ app.js (v2) │───▶│ app.js (v2) │───▶│ Commit mit v2 │
└──────────────────┘ └──────────────────┘ └──────────────────┘
│ git add │ git commit │
│◀───────────────────────┤ │
│ git restore <datei> │◀───────────────────────┤
│ │ git restore --staged │
│◀────────────────────────────────────────────────┤
git switch / git reset --hard / git restore --sourceLebenszyklus einer Datei (wie in „git status“):
unversioniert ──git add──▶ vorgemerkt ──git commit──▶ unverändert
(Untracked) (Staged) (Unmodified)
▲ │
│ git add bearbeiten
│ ▼
└────────────────── geändert
(Modified)
git rm --cached: versioniert ──▶ unversioniert (Datei bleibt liegen)🎛️Spielplatz
- README.md
# Projekt
- app.js
console.log("v1");
- README.md
# Projekt
- app.js
console.log("v1");
- README.md
# Projekt
- app.js
console.log("v1");
📄 Dateien bearbeiten (Arbeitsverzeichnis)
🌳 Commits
⏪reset --soft, --mixed, --hard im Vergleich
Ausgangslage: Branch main zeigt auf v3, im Arbeitsverzeichnis steht eine nicht committete Änderung.
Nur der Branch-Zeiger springt zurück. Index behält v3 → die Differenz zu v2 ist vorgemerkt (ideal zum Zusammenfassen von Commits).
Zeiger und Index springen zurück, das Arbeitsverzeichnis bleibt. Nichts ist mehr vorgemerkt. Das ist der Standard ohne Option.
Alles springt zurück – auch die nicht committete Zeile „v4“ ist weg. Committete Stände rettet das Reflog, nicht committete nicht!
🧮Welcher Befehl ändert welchen Bereich?
| Befehl | HEAD / Branch | Index | Arbeitsverzeichnis | Zweck |
|---|---|---|---|---|
| git add <datei> | – | ← Arbeitsverzeichnis | – | Änderung vormerken |
| git commit | neuer Commit, Branch rückt vor | – | – | Index wird zum Snapshot |
| git restore <datei> | – | – | ← Index | lokale Änderung verwerfen ⚠️ |
| git restore --staged <datei> | – | ← HEAD | – | Vormerkung aufheben |
| git reset --soft <commit> | Branch → <commit> | – | – | Commits „aufmachen“ |
| git reset [--mixed] <commit> | Branch → <commit> | ← <commit> | – | Standard von reset |
| git reset --hard <commit> | Branch → <commit> | ← <commit> | ← <commit> | alles verwerfen ⚠️ |
| git switch <branch> | HEAD → anderer Branch | ← Branch-Spitze* | ← Branch-Spitze* | *lokale Änderungen reisen mit |
| git stash | – | ← HEAD | ← HEAD | Änderungen parken |
git checkout konnte früher beides: Branches wechseln und Dateien wiederherstellen. Seit Git 2.23 gibt es dafür die klareren Befehle git switch (Branches) und git restore (Dateien).git checkout -- datei entspricht git restore datei.git restore oder git reset --hard weg – Git hat davon nie ein Objekt gespeichert. Vorgemerkte Stände liegen dagegen als Blob in .git/objects (auffindbar mit git fsck --lost-found).