Einführung
Jede Git-Operation bewegt Daten zwischen drei Bereichen: dem Working Tree (Ihre Dateien), dem Index (Entwurf des nächsten Commits) und dem Repository (committete Historie unter .git). Zu benennen, was wohin bewegt wird, ist das einzelne nützlichste mentale Modell.
Die Bereiche
- Working Tree: das Verzeichnis, in dem Sie editieren.
- Index:
.git/index, der gestagte Tree. - Repository: Objekte in
.git/objectsplus Refs in.git/refs.
Befehle nach Richtung
# Working Tree -> Index
git add file
git rm file
git mv old new
# Index -> Repository
git commit
git write-tree # Plumbing
# Repository -> Index
git reset <commit>
git read-tree <tree>
# Repository -> Working Tree (und üblicherweise Index)
git checkout <commit> -- file
git restore --source <commit> file
git switch <branch>
Die vier Diffs
Sie können beliebige zwei Bereiche vergleichen:
git diff # Working Tree vs. Index
git diff --staged # Index vs. HEAD
git diff HEAD # Working Tree vs. HEAD
git diff main feature # Repository vs. Repository
Status entschlüsseln
git status -s
# XY filename
# X = Index-Status, Y = Working-Tree-Status
# M modified, A added, D deleted, R renamed, ?? untracked
Zum Beispiel bedeutet MM, dass die Datei sowohl im Index als auch im Working Tree modifiziert ist (Sie haben eine Änderung gestaged und dann erneut bearbeitet).
Reset, restore, checkout
Jeder beeinflusst verschiedene Bereiche:
git reset --soft: nur Repository (Ref bewegen).git reset(mixed): Repository + Index.git reset --hard: Repository + Index + Working Tree.git restore --staged: Index aus HEAD.git restore: Working Tree aus Index.git restore --source=<commit>: Working Tree (und optional Index) aus einem bestimmten Commit.
Eine Übung
echo a > f.txt
git add f.txt
git commit -m "v1"
echo b >> f.txt
git add f.txt
echo c >> f.txt
git status
git diff
git diff --staged
git diff HEAD
Lesen Sie jeden Diff; zu verstehen, warum sie sich unterscheiden, festigt das Modell.
Plumbing für jeden Bereich
Das Plumbing für jeden Bereich zu kennen entmystifiziert höhere Befehle:
- Working Tree: gewöhnliche Dateisystemoperationen.
- Index:
git update-index,git ls-files,git read-tree,git write-tree. - Objektdatenbank:
git hash-object,git cat-file,git mktree,git commit-tree. - Refs:
git update-ref,git symbolic-ref,git for-each-ref.
git ls-files --stage # Index
git ls-tree HEAD # Repo
ls -R # Working Tree
Häufige Fehler
Versuchen, Befehle statt Bereiche auswendig zu lernen; sobald Sie wissen, welcher Bereich Quelle und welcher Ziel ist, ist der richtige Befehl offensichtlich. git restore file mit git checkout file verwechseln; sie sind in diesem Fall äquivalent, aber die vielen anderen Modi von checkout verwirren neue Nutzer. git reset --hard zum "Aufräumen" verwenden, ohne zu merken, dass es den Working Tree vernichtet. Und schließlich: Erwarten, dass git commit ungestaged Änderungen einbezieht; tut es nicht (außer mit -a für nur verfolgte Dateien).