Git Spickzettel
Befehle, Flags, Beispiele und häufige Fehler
Konfiguration
Liest oder setzt Git-Konfigurationsoptionen auf drei Ebenen: System, Benutzer (global) oder Repository (lokal).
git config --global user.name "John Doe" git config --global user.email "john.doe@example.com"
Legt fest, wie Git HTTPS-Anmeldedaten speichert, damit nicht bei jedem Push das Passwort verlangt wird.
git config --global credential.helper manager
Definiert eine globale .gitignore, die für alle Repositories gilt.
git config --global core.excludesfile ~/.gitignore_global
Repositories
Erstellt ein neues Git-Repository im aktuellen Verzeichnis.
git init git init --initial-branch=main meu-projeto
Kopiert ein entferntes Repository auf den lokalen Rechner inklusive der gesamten Historie.
git clone https://github.com/user/repo.git
Stage und commit
Zeigt den Zustand des Working Directory und des Staging: was geändert, gestaged oder untracked ist.
git status
Verschiebt Änderungen aus dem Working Directory in die Staging Area, bereit für den nächsten Commit.
git add src/components/Button.tsx git add .
Speichert den gestageten Inhalt mit einer Nachricht als neuen Commit im lokalen Repository.
git commit -m "feat: adiciona git cheat sheet"
Stellt Dateien wieder her: nimmt sie aus dem Staging oder verwirft Änderungen im Working Directory.
git restore --staged file.txt git restore file.txt
Entfernt Dateien aus dem Repository (und optional von der Festplatte).
git rm secret.env
Benennt eine getrackte Datei um oder verschiebt sie, äquivalent zu mv + git add + git rm.
git mv old.tsx new.tsx
Branches
Listet, erstellt, benennt um oder löscht Branches.
git branch git branch feature/login
Alter Befehl zum Wechseln von Branches oder Wiederherstellen von Dateien. Heute werden git switch und git restore empfohlen.
git checkout main git checkout -b feature/x
Moderne Variante von checkout, dediziert für Branch-Wechsel.
git switch main git switch -c feature/login
Merge und rebase
Führt Änderungen einer anderen Branch in die aktuelle ein und erstellt bei Bedarf einen Merge-Commit.
git switch main git merge feature/login
Wendet die Commits der aktuellen Branch erneut auf einer anderen Basis an und schreibt damit die Historie um.
git switch feature git rebase main
Wendet einen einzelnen Commit aus einer anderen Branch auf die aktuelle an.
git cherry-pick a1b2c3d
Öffnet ein grafisches Tool zum Lösen von Merge-Konflikten.
git mergetool --tool=meld
Remote
Verwaltet die Remotes des Repositorys (origin, upstream usw.).
git remote -v
Lädt Commits und Refs vom Remote herunter, ohne sie in die lokale Branch zu integrieren.
git fetch origin
Entspricht git fetch gefolgt von git merge (oder rebase) auf der aktuellen Branch.
git pull origin main
Sendet lokale Commits zum Remote.
git push -u origin feature/login
Stash
Speichert nicht commitete Änderungen auf einem temporären Stack, um das Working Directory zu leeren.
git stash push -m "WIP login"
Verwaltung des Stash-Stacks.
git stash list git stash pop
Tags
Erstellt, listet, löscht oder prüft Tags. Tags markieren Punkte in der Historie (Releases).
git tag -a v1.2.0 -m "Release 1.2"
Liefert einen lesbaren Namen basierend auf dem nächsten Tag.
git describe --tags --always --dirty
Log
Zeigt die Commit-Historie mit flexiblen Filtern und Formaten.
git log --oneline --graph --decorate --all
Zeigt den Inhalt eines Commits, Tags oder Objekts.
git show HEAD git show a1b2c3d:src/file.tsx
Zeigt Unterschiede zwischen Working Dir, Staging, Commits oder Branches.
git diff git diff --cached git diff main feature
Zeigt, wer jede Zeile einer Datei in welchem Commit geändert hat.
git blame -L 10,30 file.tsx
Zusammenfassung gruppiert nach Autor (nützlich für Release Notes).
git shortlog -sne
Lokale Historie von allem, was HEAD berührt hat. Lebensretter zum Wiederfinden verlorener Commits.
git reflog
git reset --hard HEAD@{2}Rückgängig
Bewegt HEAD zu einem anderen Commit und verändert optional Staging und Working Dir.
git reset --soft HEAD~1 git reset --mixed HEAD~1 git reset --hard HEAD~1
Erstellt einen neuen Commit, der die Änderungen eines anderen rückgängig macht. Sicher auf geteilten Branches.
git revert a1b2c3d
Löscht untracked Dateien aus dem Working Directory. Destruktive Operation.
git clean -nfd
Submodule
Fügt ein Repository als Submodul innerhalb des aktuellen hinzu.
git submodule add -b main https://github.com/user/lib.git vendor/lib
Initialisiert und lädt die in .gitmodules definierten Submodule herunter.
git submodule update --init --recursive
Status anzeigen, Befehl in jedem Submodul ausführen oder eines deaktivieren.
git submodule foreach 'git pull origin main'
Hooks
Erstellt eine ausführbare Datei in .git/hooks/ mit dem Namen des Events (pre-commit, pre-push, commit-msg, post-merge usw.).
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit chmod +x .git/hooks/pre-commit
Definiert ein gemeinsames Hooks-Verzeichnis (versionierbar, außerhalb von .git).
git config core.hooksPath .githooks
JS-Tool, das Hooks in package.json versioniert und automatisch installiert.
npx husky init echo "npm test" > .husky/pre-commit
Überspringt die Hooks pre-commit und commit-msg (sparsam einsetzen).
git commit --no-verify -m "hotfix"
Erweitert
Binäre Suche durch die Historie, um den Commit zu finden, der einen Bug eingeführt hat.
git bisect start git bisect bad HEAD git bisect good v1.0 git bisect reset
Erstellt mehrere Working Directories, die mit demselben .git verbunden sind, sodass parallel an mehreren Branches gearbeitet werden kann.
git worktree add ../proj-hotfix hotfix/urgente
Schreibt Historie um: Commits zusammenfassen, umsortieren, bearbeiten oder verwerfen.
git rebase -i HEAD~5 # pick a1b2 feat: x # squash c3d4 fix typo # reword e5f6 chore: y # drop g7h8 wip
Massenweises Umschreiben der Historie, moderner Ersatz für git filter-branch. Praktisch zum Entfernen sensibler Dateien.
git filter-repo --path secrets.env --invert-paths
Erstellt ein Tarball oder Zip aus dem Inhalt einer Ref, ohne .git.
git archive --format=zip --prefix=app/ -o release.zip v1.0
Packt Commits in eine einzige Datei, die offline übertragen werden kann.
git bundle create repo.bundle --all git clone repo.bundle nova-pasta
Löst eine Referenz in eine vollständige SHA, kurze SHA oder einen Namen auf.
git rev-parse HEAD git rev-parse --abbrev-ref HEAD git rev-parse --short HEAD
Inspiziert Git-Objekte (Blobs, Trees, Commits, Tags).
git cat-file -p HEAD git cat-file -t a1b2c3d
Listet getrackte Dateien (ls-files) oder den Inhalt eines Trees (ls-tree).
git ls-files git ls-tree -r HEAD --name-only
Wartung: Garbage Collection, Integritätsprüfungen, Entfernen loser Objekte.
git gc --aggressive --prune=now git fsck --full
Erlaubt es, lokal nur einen Teilbaum vorzuhalten, hilfreich für große Monorepos.
git sparse-checkout init --cone git sparse-checkout set apps/web libs/ui
Fügt Notizen zu Commits hinzu, ohne deren SHA zu ändern.
git notes add -m "reviewed by QA" HEAD
Referenz
┌──────────────┐ git add ┌────────────┐ git commit ┌─────────────┐ git push ┌──────────┐
│ Working Dir │ ───────────▶ │ Staging │ ───────────▶ │ Local Repo │ ──────────▶ │ Remote │
│ (files) │ ◀─────────── │ (index) │ ◀─────────── │ (.git) │ ◀────────── │ (origin) │
└──────────────┘ git restore └────────────┘ git reset └─────────────┘ git fetch └──────────┘
git pull = git fetch + git merge- untrackedneue Datei, Git kennt sie noch nicht
- modifiedbekannte Datei wurde geändert
- stagedfür den nächsten Commit markiert
- committedin .git gespeichert, Teil der Historie
- ignoredin .gitignore aufgeführt
Geteilte Branches, große Features integrieren und Kontext erhalten, Release-Branches.
- Schreibt die Historie nicht um
- Sicher in jedem Szenario
- Bewahrt die echte Timeline
- Historie mit Diamanten und Rauschen
- git log ist schwerer zu lesen
Lokale Feature-Branch vor dem PR mit main aktualisieren. Lineare Historie behalten.
- Lineare und saubere Historie
- Lesbares git log
- Effektiveres git bisect
- Schreibt SHAs um (NIEMALS auf öffentlichen Branches)
- Konflikte können sich wiederholen
- Verliert zeitlichen Kontext
Vor dem Mergen einer Feature mit mehreren 'wip' oder 'fix typo' Commits in main.
- 1 sauberer Commit pro Feature
- Main mit ultra lesbarer Historie
- Verliert die Granularität der Entwicklung
- git bisect lokalisiert nur das gesamte Feature
Goldene Regel: lokal rebase, öffentlich merge. Niemals rebase auf Branches, die andere benutzen.
--softBehält Staging und Working DirBewegt HEAD. Lässt Staging und Working Dir unverändert. Dateien bleiben gestaged.
Commits umgruppieren, ohne Änderungen zu verlieren.
--mixedLeert Staging, behält Working Dir(default) Bewegt HEAD. Leert Staging, behält aber Working Dir. Dateien werden unstaged.
Neu zusammenstellen, was in den nächsten Commit ging.
--hardLöscht alles (destruktiv)Bewegt HEAD. Leert Staging UND Working Dir. Verwirft nicht commitete Änderungen. Destruktiv.
Zum Zustand eines anderen Commits zurückkehren und alles verwerfen.
fatal: refusing to merge unrelated historiesDie beiden Repos haben keinen gemeinsamen Vorgänger-Commit.
git pull origin main --allow-unrelated-histories
Updates were rejected because the remote contains work that you do not haveDas Remote hat Commits, die das lokale Repo nicht kennt.
git pull --rebase origin main, dann git push. Niemals push --force ohne --force-with-lease.
Please commit your changes or stash them before you switch branchesEs gibt lokale Änderungen, die beim Branch-Wechsel kollidieren würden.
git stash, git switch andere-branch, dann git stash pop.
CONFLICT (content): Merge conflict in <file>Merge oder rebase hat dieselben Zeilen wie eine andere Branch berührt.
Zwischen <<<<<<< ======= >>>>>>> editieren, dann git add datei und git merge --continue. Zum Abbrechen: git merge --abort.
detached HEADEs wurde eine SHA oder ein Tag ausgecheckt statt einer Branch.
Arbeit sichern: git switch -c neue-branch. Verwerfen: git switch main.
Permission denied (publickey)SSH-Schlüssel nicht in GitHub oder GitLab konfiguriert.
ssh-keygen -t ed25519 -C "email" ausführen und ~/.ssh/id_ed25519.pub den SSH-Schlüsseln des Dienstes hinzufügen.
fatal: Authentication failed (HTTPS)GitHub akzeptiert keine Passwörter mehr, ein Personal Access Token wird benötigt.
Auf GitHub einen PAT erzeugen und als Passwort verwenden, oder den Remote auf SSH umstellen.
Your branch and 'origin/main' have divergedBeide Seiten haben unterschiedliche Commits.
git pull --rebase auf lokaler Feature-Branch, oder einfach git pull auf geteilter main.
error: failed to push some refs (non-fast-forward)Das Remote ist weitergegangen, ein Push ist ohne vorheriges Integrieren nicht möglich.
git pull --rebase, dann git push.
Falsche Branch gelöscht oder reset --hard gemacht und Arbeit verlorenDestruktive Operation ohne Backup.
git reflog, um die SHA zu finden, dann git checkout -b wiederhergestellt <sha>. Commits bleiben ca. 30 Tage vor dem gc.
.gitignore funktioniert nichtDie Datei war bereits getrackt, bevor sie ignoriert wurde.
git rm --cached <datei> und git commit -m "untrack". Für Verzeichnisse: git rm -r --cached <ordner>.
Geheimnis, Passwort oder .env-Datei committetUnvorsichtiges git add . .
Geheimnis rotieren, git filter-repo --path .env --invert-paths ausführen, git push --force-with-lease und das Team zum Reclone bitten.
LF will be replaced by CRLFUnterschiede in den Zeilenenden zwischen Windows und Unix.
Auf Windows git config --global core.autocrlf true, auf Mac und Linux input.
Filename too long (Windows)Windows-Limit von 260 Zeichen.
git config --system core.longpaths true