MaisTools
Entwickler/

Git Spickzettel

Schnelle Git-Referenz: Befehle, Flags, Beispiele und Varianten nach Abschnitten geordnet, mit Sofortsuche.

Git Spickzettel

Befehle, Flags, Beispiele und häufige Fehler

Konfiguration

git config

Liest oder setzt Git-Konfigurationsoptionen auf drei Ebenen: System, Benutzer (global) oder Repository (lokal).

Flags--global--local--system--list--unset--edit
Beispiel
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
git config credential.helper

Legt fest, wie Git HTTPS-Anmeldedaten speichert, damit nicht bei jedem Push das Passwort verlangt wird.

Beispiel
git config --global credential.helper manager
git config --global core.excludesfile

Definiert eine globale .gitignore, die für alle Repositories gilt.

Beispiel
git config --global core.excludesfile ~/.gitignore_global

Repositories

git init

Erstellt ein neues Git-Repository im aktuellen Verzeichnis.

Flags--bare--initial-branch=--shared
Beispiel
git init
git init --initial-branch=main meu-projeto
git clone

Kopiert ein entferntes Repository auf den lokalen Rechner inklusive der gesamten Historie.

Flags--depth--branch--single-branch--recurse-submodules--mirror--bare
Beispiel
git clone https://github.com/user/repo.git

Stage und commit

git status

Zeigt den Zustand des Working Directory und des Staging: was geändert, gestaged oder untracked ist.

Flags-s-b--ignored-uno
Beispiel
git status
git add

Verschiebt Änderungen aus dem Working Directory in die Staging Area, bereit für den nächsten Commit.

Flags-A-p-i-u-n-f
Beispiel
git add src/components/Button.tsx
git add .
git commit

Speichert den gestageten Inhalt mit einer Nachricht als neuen Commit im lokalen Repository.

Flags-m-a--amend--no-edit-S--allow-empty--no-verify--fixup--squash
Beispiel
git commit -m "feat: adiciona git cheat sheet"
git restore

Stellt Dateien wieder her: nimmt sie aus dem Staging oder verwirft Änderungen im Working Directory.

Flags--staged--source=--worktree
Beispiel
git restore --staged file.txt
git restore file.txt
git rm

Entfernt Dateien aus dem Repository (und optional von der Festplatte).

Flags--cached-r-f-n
Beispiel
git rm secret.env
git mv

Benennt eine getrackte Datei um oder verschiebt sie, äquivalent zu mv + git add + git rm.

Flags-f-n
Beispiel
git mv old.tsx new.tsx

Branches

git branch

Listet, erstellt, benennt um oder löscht Branches.

Flags-a-r-vv-d-D-m-M--merged--no-merged--contains
Beispiel
git branch
git branch feature/login
git checkout

Alter Befehl zum Wechseln von Branches oder Wiederherstellen von Dateien. Heute werden git switch und git restore empfohlen.

Flags-b-B--orphan--detach
Beispiel
git checkout main
git checkout -b feature/x
git switch

Moderne Variante von checkout, dediziert für Branch-Wechsel.

Flags-c-C--detach--discard-changes
Beispiel
git switch main
git switch -c feature/login

Merge und rebase

git merge

Führt Änderungen einer anderen Branch in die aktuelle ein und erstellt bei Bedarf einen Merge-Commit.

Flags--no-ff--ff-only--squash--abort--continue-X-s
Beispiel
git switch main
git merge feature/login
git rebase

Wendet die Commits der aktuellen Branch erneut auf einer anderen Basis an und schreibt damit die Historie um.

Flags-i--onto--continue--abort--skip--autosquash--autostash
Beispiel
git switch feature
git rebase main
git cherry-pick

Wendet einen einzelnen Commit aus einer anderen Branch auf die aktuelle an.

Flags-x-n--continue--abort
Beispiel
git cherry-pick a1b2c3d
git mergetool

Öffnet ein grafisches Tool zum Lösen von Merge-Konflikten.

Flags--tool=-y
Beispiel
git mergetool --tool=meld

Remote

git remote

Verwaltet die Remotes des Repositorys (origin, upstream usw.).

Unterbefehleaddremoverenameset-urlshowprune
Flags-v
Beispiel
git remote -v
git fetch

Lädt Commits und Refs vom Remote herunter, ohne sie in die lokale Branch zu integrieren.

Flags--all--prune--tags--depth--unshallow
Beispiel
git fetch origin
git pull

Entspricht git fetch gefolgt von git merge (oder rebase) auf der aktuellen Branch.

Flags--rebase--ff-only--no-rebase--autostash
Beispiel
git pull origin main
git push

Sendet lokale Commits zum Remote.

Flags-u--force--force-with-lease--tags--delete--dry-run--all
Beispiel
git push -u origin feature/login

Stash

git stash

Speichert nicht commitete Änderungen auf einem temporären Stack, um das Working Directory zu leeren.

Unterbefehlepush
Flags-u-a-m-k-p
Beispiel
git stash push -m "WIP login"
git stash list / show / pop / apply / drop / clear

Verwaltung des Stash-Stacks.

Beispiel
git stash list
git stash pop

Tags

git tag

Erstellt, listet, löscht oder prüft Tags. Tags markieren Punkte in der Historie (Releases).

Flags-a-m-s-d-l-f
Beispiel
git tag -a v1.2.0 -m "Release 1.2"
git describe

Liefert einen lesbaren Namen basierend auf dem nächsten Tag.

Flags--tags--always--dirty--abbrev
Beispiel
git describe --tags --always --dirty

Log

git log

Zeigt die Commit-Historie mit flexiblen Filtern und Formaten.

Flags--oneline--graph--all--decorate-p--stat--since--author--grep-S
Beispiel
git log --oneline --graph --decorate --all
git show

Zeigt den Inhalt eines Commits, Tags oder Objekts.

Flags--stat--name-only--name-status
Beispiel
git show HEAD
git show a1b2c3d:src/file.tsx
git diff

Zeigt Unterschiede zwischen Working Dir, Staging, Commits oder Branches.

Flags--cached--staged--stat--name-only--word-diff
Beispiel
git diff
git diff --cached
git diff main feature
git blame

Zeigt, wer jede Zeile einer Datei in welchem Commit geändert hat.

Flags-L-w-C-M
Beispiel
git blame -L 10,30 file.tsx
git shortlog

Zusammenfassung gruppiert nach Autor (nützlich für Release Notes).

Flags-s-n-e
Beispiel
git shortlog -sne
git reflog

Lokale Historie von allem, was HEAD berührt hat. Lebensretter zum Wiederfinden verlorener Commits.

Unterbefehleshowexpiredelete
Beispiel
git reflog
git reset --hard HEAD@{2}

Rückgängig

git reset

Bewegt HEAD zu einem anderen Commit und verändert optional Staging und Working Dir.

Flags--soft--mixed--hard--keep--merge
Beispiel
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
git revert

Erstellt einen neuen Commit, der die Änderungen eines anderen rückgängig macht. Sicher auf geteilten Branches.

Flags--no-commit-m--continue--abort
Beispiel
git revert a1b2c3d
git clean

Löscht untracked Dateien aus dem Working Directory. Destruktive Operation.

Flags-n-f-d-x-X-i
Beispiel
git clean -nfd

Submodule

git submodule add

Fügt ein Repository als Submodul innerhalb des aktuellen hinzu.

Flags-b--name
Beispiel
git submodule add -b main https://github.com/user/lib.git vendor/lib
git submodule init / update

Initialisiert und lädt die in .gitmodules definierten Submodule herunter.

Flags--init--recursive--remote--merge--rebase
Beispiel
git submodule update --init --recursive
git submodule status / foreach / deinit

Status anzeigen, Befehl in jedem Submodul ausführen oder eines deaktivieren.

Flags--recursive
Beispiel
git submodule foreach 'git pull origin main'

Hooks

Einen manuellen Hook aktivieren

Erstellt eine ausführbare Datei in .git/hooks/ mit dem Namen des Events (pre-commit, pre-push, commit-msg, post-merge usw.).

Beispiel
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
git config core.hooksPath

Definiert ein gemeinsames Hooks-Verzeichnis (versionierbar, außerhalb von .git).

Beispiel
git config core.hooksPath .githooks
Husky

JS-Tool, das Hooks in package.json versioniert und automatisch installiert.

Beispiel
npx husky init
echo "npm test" > .husky/pre-commit
git commit --no-verify

Überspringt die Hooks pre-commit und commit-msg (sparsam einsetzen).

Beispiel
git commit --no-verify -m "hotfix"

Erweitert

git bisect

Binäre Suche durch die Historie, um den Commit zu finden, der einen Bug eingeführt hat.

Unterbefehlestartgoodbadskipresetrun
Beispiel
git bisect start
git bisect bad HEAD
git bisect good v1.0
git bisect reset
git worktree

Erstellt mehrere Working Directories, die mit demselben .git verbunden sind, sodass parallel an mehreren Branches gearbeitet werden kann.

Unterbefehleaddlistremoveprune
Beispiel
git worktree add ../proj-hotfix hotfix/urgente
git rebase -i

Schreibt Historie um: Commits zusammenfassen, umsortieren, bearbeiten oder verwerfen.

Unterbefehlepickrewordeditsquashfixupdropexec
Beispiel
git rebase -i HEAD~5
# pick    a1b2 feat: x
# squash  c3d4 fix typo
# reword  e5f6 chore: y
# drop    g7h8 wip
git filter-repo

Massenweises Umschreiben der Historie, moderner Ersatz für git filter-branch. Praktisch zum Entfernen sensibler Dateien.

Flags--path--invert-paths--replace-text
Beispiel
git filter-repo --path secrets.env --invert-paths
git archive

Erstellt ein Tarball oder Zip aus dem Inhalt einer Ref, ohne .git.

Flags--format--prefix-o
Beispiel
git archive --format=zip --prefix=app/ -o release.zip v1.0
git bundle

Packt Commits in eine einzige Datei, die offline übertragen werden kann.

Unterbefehlecreateverifyunbundle
Beispiel
git bundle create repo.bundle --all
git clone repo.bundle nova-pasta
git rev-parse

Löst eine Referenz in eine vollständige SHA, kurze SHA oder einen Namen auf.

Flags--short--abbrev-ref--verify
Beispiel
git rev-parse HEAD
git rev-parse --abbrev-ref HEAD
git rev-parse --short HEAD
git cat-file

Inspiziert Git-Objekte (Blobs, Trees, Commits, Tags).

Flags-p-t-s
Beispiel
git cat-file -p HEAD
git cat-file -t a1b2c3d
git ls-files / ls-tree

Listet getrackte Dateien (ls-files) oder den Inhalt eines Trees (ls-tree).

Flags--cached--others--ignored
Beispiel
git ls-files
git ls-tree -r HEAD --name-only
git gc / fsck

Wartung: Garbage Collection, Integritätsprüfungen, Entfernen loser Objekte.

Flags--aggressive--prune=now
Beispiel
git gc --aggressive --prune=now
git fsck --full
git sparse-checkout

Erlaubt es, lokal nur einen Teilbaum vorzuhalten, hilfreich für große Monorepos.

Unterbefehleinitsetlistdisable
Beispiel
git sparse-checkout init --cone
git sparse-checkout set apps/web libs/ui
git notes

Fügt Notizen zu Commits hinzu, ohne deren SHA zu ändern.

Unterbefehleaddshoweditremove
Beispiel
git notes add -m "reviewed by QA" HEAD

Referenz

Git Workflow
┌──────────────┐  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
Merge vs Rebase vs Squash
Merge

Geteilte Branches, große Features integrieren und Kontext erhalten, Release-Branches.

Vorteile
  • Schreibt die Historie nicht um
  • Sicher in jedem Szenario
  • Bewahrt die echte Timeline
Nachteile
  • Historie mit Diamanten und Rauschen
  • git log ist schwerer zu lesen
Rebase

Lokale Feature-Branch vor dem PR mit main aktualisieren. Lineare Historie behalten.

Vorteile
  • Lineare und saubere Historie
  • Lesbares git log
  • Effektiveres git bisect
Nachteile
  • Schreibt SHAs um (NIEMALS auf öffentlichen Branches)
  • Konflikte können sich wiederholen
  • Verliert zeitlichen Kontext
Squash

Vor dem Mergen einer Feature mit mehreren 'wip' oder 'fix typo' Commits in main.

Vorteile
  • 1 sauberer Commit pro Feature
  • Main mit ultra lesbarer Historie
Nachteile
  • 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.

Reset: soft, mixed, hard
--softBehält Staging und Working Dir

Bewegt 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.

Häufige Fehler und Lösungen
fatal: refusing to merge unrelated histories
Ursache

Die beiden Repos haben keinen gemeinsamen Vorgänger-Commit.

Lösung

git pull origin main --allow-unrelated-histories

Updates were rejected because the remote contains work that you do not have
Ursache

Das Remote hat Commits, die das lokale Repo nicht kennt.

Lösung

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 branches
Ursache

Es gibt lokale Änderungen, die beim Branch-Wechsel kollidieren würden.

Lösung

git stash, git switch andere-branch, dann git stash pop.

CONFLICT (content): Merge conflict in <file>
Ursache

Merge oder rebase hat dieselben Zeilen wie eine andere Branch berührt.

Lösung

Zwischen <<<<<<< ======= >>>>>>> editieren, dann git add datei und git merge --continue. Zum Abbrechen: git merge --abort.

detached HEAD
Ursache

Es wurde eine SHA oder ein Tag ausgecheckt statt einer Branch.

Lösung

Arbeit sichern: git switch -c neue-branch. Verwerfen: git switch main.

Permission denied (publickey)
Ursache

SSH-Schlüssel nicht in GitHub oder GitLab konfiguriert.

Lösung

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)
Ursache

GitHub akzeptiert keine Passwörter mehr, ein Personal Access Token wird benötigt.

Lösung

Auf GitHub einen PAT erzeugen und als Passwort verwenden, oder den Remote auf SSH umstellen.

Your branch and 'origin/main' have diverged
Ursache

Beide Seiten haben unterschiedliche Commits.

Lösung

git pull --rebase auf lokaler Feature-Branch, oder einfach git pull auf geteilter main.

error: failed to push some refs (non-fast-forward)
Ursache

Das Remote ist weitergegangen, ein Push ist ohne vorheriges Integrieren nicht möglich.

Lösung

git pull --rebase, dann git push.

Falsche Branch gelöscht oder reset --hard gemacht und Arbeit verloren
Ursache

Destruktive Operation ohne Backup.

Lösung

git reflog, um die SHA zu finden, dann git checkout -b wiederhergestellt <sha>. Commits bleiben ca. 30 Tage vor dem gc.

.gitignore funktioniert nicht
Ursache

Die Datei war bereits getrackt, bevor sie ignoriert wurde.

Lösung

git rm --cached <datei> und git commit -m "untrack". Für Verzeichnisse: git rm -r --cached <ordner>.

Geheimnis, Passwort oder .env-Datei committet
Ursache

Unvorsichtiges git add . .

Lösung

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 CRLF
Ursache

Unterschiede in den Zeilenenden zwischen Windows und Unix.

Lösung

Auf Windows git config --global core.autocrlf true, auf Mac und Linux input.

Filename too long (Windows)
Ursache

Windows-Limit von 260 Zeichen.

Lösung

git config --system core.longpaths true