MaisTools
Anleitungen/

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

SchlüsselwörterkonfigurierenOptionen festlegenuser.nameuser.emailIdentitätglobale Konfigurationlokale Konfigurationalias
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.

SchlüsselwörterPasswort speichernAnmeldedaten merkenAuthentifizierungLoginkein Passwort abfragencredential helper
Beispiel
git config --global credential.helper manager
git config --global core.excludesfile

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

Schlüsselwörterglobales gitignoreglobal ignorierenexcludesfilein allen Repos ignorieren
Beispiel
git config --global core.excludesfile ~/.gitignore_global

Repositories

git init

Erstellt ein neues Git-Repository im aktuellen Verzeichnis.

SchlüsselwörterRepository erstellenneues RepoinitialisierenProjekt starteninitleeres Repobare
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.

SchlüsselwörterklonenRepository kopierenProjekt herunterladenherunterladendownloadshallowdepth
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.

SchlüsselwörterStatusÄnderungen anzeigenModifikationen sehenwas habe ich geändertuntrackedmodifiedstaged
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.

SchlüsselwörterhinzufügenstagingCommit vorbereitenfür Commit markierenindexierenadd patchadd interaktiv
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.

SchlüsselwörtercommitspeichernÄnderungen sichernNachrichteintragenamendfixupsquashsignieren
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.

SchlüsselwörterwiederherstellenÄnderungen rückgängig machenaus dem Staging entfernenunstageDatei zurücksetzenundo file
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).

SchlüsselwörterentfernenDatei löscheneliminierenuntrackrm cached
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.

Schlüsselwörterverschiebenumbenennenrenamemove
Flags-f-n
Beispiel
git mv old.tsx new.tsx

Branches

git branch

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

SchlüsselwörterbranchZweigBranches auflistenBranch erstellenBranch löschenBranch umbenennenmerged
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.

SchlüsselwörterBranch wechselnBranch tauschenDatei zurücksetzencheckoutdetached HEADorphan
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.

SchlüsselwörterBranch wechselnBranch tauschenswitcherstellen und wechseln
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.

SchlüsselwörterzusammenführenintegrierenmergenmergeMerge-Konfliktfast-forwardno-ffsquash merge
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.

SchlüsselwörterrebaseHistorie umschreibenlinearisierenhistoryinteractive rebaseautosquashautostash
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.

Schlüsselwörtercherry-pickCommit auswählenCommit kopierenCommit auf anderem Branch anwenden
Flags-x-n--continue--abort
Beispiel
git cherry-pick a1b2c3d
git mergetool

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

SchlüsselwörterKonflikte lösenMerge-Toolconflict toolmergetoolmeldvimdiff
Flags--tool=-y
Beispiel
git mergetool --tool=meld

Remote

git remote

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

SchlüsselwörteroriginupstreamremoteRemote hinzufügenURL ändernset-urlprune remote
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.

Schlüsselwörterherunterladenfetchvom Remote holenohne mergeentfernte Branches prunen
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.

SchlüsselwörterpullBranch aktualisierenmit Remote synchronisierenpull rebaseff-only
Flags--rebase--ff-only--no-rebase--autostash
Beispiel
git pull origin main
git push

Sendet lokale Commits zum Remote.

Schlüsselwörterpushsendenveröffentlichenan Remote übermittelnforce pushforce-with-leasepush tagsentfernten Branch löschen
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.

Schlüsselwörterstashvorübergehend speichernÄnderungen versteckenbeiseite legenwork in progresswipuntracked stash
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.

SchlüsselwörterStash wiederherstellenStashes auflistenStash anwendenpopdropclearBranch aus Stash erstellen
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).

SchlüsselwörtertagVersion markierenreleaseEtikettVersionannotatedsignedpush tags
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.

Schlüsselwörterdescribeaktuelle Versionletztes Tagdirtyabbrev
Flags--tags--always--dirty--abbrev
Beispiel
git describe --tags --always --dirty

Log

git log

Zeigt die Commit-Historie mit flexiblen Filtern und Formaten.

SchlüsselwörterHistorieCommits anzeigenCommit-ListehistoryGraphlogonelinenach Autor filternNachricht durchsuchenpickaxe
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.

SchlüsselwörterCommit anzeigenCommit zeigenInhaltÄnderungen eines Commitsshow
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.

SchlüsselwörterdiffUnterschiedevergleichenÄnderungen anzeigenBranches vergleichenstaged diffword diff
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.

Schlüsselwörterblamewer hat geändertAutor der ZeileSchuldZeilen annotieren
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).

SchlüsselwörtershortlogcontributorsAutorenAnzahl pro Autorrelease 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.

Schlüsselwörterreflogverlorenen Commit wiederherstellenundo resetRettunghistory HEADArbeit wiederherstellen
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.

Schlüsselwörterresetrückgängig machenCommit rückgängigsofthardmixedHEAD verschiebenverwerfen
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.

SchlüsselwörterrevertCommit zurücknehmenmit neuem Commit rückgängig machenÄnderungen annullieren
Flags--no-commit-m--continue--abort
Beispiel
git revert a1b2c3d
git clean

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

Schlüsselwörtercleanuntracked aufräumenungetrackte Dateien löschenMüll entfernendry-run
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.

SchlüsselwörterSubmodulSub-RepositoryGit-Abhängigkeitvendorsubmodule hinzufügen
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.

SchlüsselwörterSubmodul initialisierenSubmodul aktualisierenrecursivesubmodule update
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.

SchlüsselwörterSubmodul-StatusforeachSubmodul deaktivierendeinitsubmodule entfernen
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.).

Schlüsselwörterhookpre-commitpre-pushpost-mergecommit-msgautomatisierenSkript
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).

Schlüsselwörtergeteilte HooksHooks versionierencore.hooksPathHooks außerhalb von .git
Beispiel
git config core.hooksPath .githooks
Husky

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

Schlüsselwörterhuskynode Hooksnpm Hookslint-stagedHooks automatisch installieren
Beispiel
npx husky init
echo "npm test" > .husky/pre-commit
git commit --no-verify

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

SchlüsselwörterHooks überspringenHooks ignorierenno-verifybypass pre-commit
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.

Schlüsselwörterbisectbinäre SucheBug findenRegression findenfind regression
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.

Schlüsselwörterworktreemehrere Branchesparalleler Workspacemehrere BäumeHotfix-Branch
Unterbefehleaddlistremoveprune
Beispiel
git worktree add ../proj-hotfix hotfix/urgente
git rebase -i

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

Schlüsselwörterinteraktives Rebasesquashrewordedit commitfixupdrop commitneu anordnen
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.

Schlüsselwörterfilter-repoDatei aus Historie entfernenGeheimnis löschenHistorie umschreibenfilter-branch ErsatzBFG
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.

Schlüsselwörterarchiveals zip exportierenals tar exportierensnapshotrelease zipohne .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.

Schlüsselwörterbundleoffline übertragenRepo in einer Dateiohne NetzwerkSneakernet-Übertragung
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.

Schlüsselwörterrev-parseaktuelle SHAaktueller Branchkurzer Hashabbrev-ref
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).

Schlüsselwörtercat-fileObjekt inspizierenblobtreeSHA anzeigenObjekte debuggen
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).

Schlüsselwörtergetrackte Dateien auflistenls-filesls-treeTree-Inhalt auflistenindexierte Dateien
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.

Schlüsselwörtergarbage collectionWartungIntegritätoptimierengcfsckObjekte prunen
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.

Schlüsselwörtersparsepartieller CheckoutMonorepoSubsetnur einen Ordner sehensparse-checkout cone
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.

SchlüsselwörternotesAnmerkungenCommit-MetadatenKommentar ohne SHA-Änderung
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