🐙 Git und GitHub CLI
Grundlegende und erweiterte Git-Befehle für Versionskontrolle, Branching, Remote-Repos, Stash, Tags und GitHub CLI.
🔹 Grundlegende Befehle
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| git add | Eine Datei zum Staging-Bereich hinzufügen | |
| git add file.txt | Eine bestimmte Datei für den nächsten Commit bereitstellen | |
| git add . | Alle Änderungen im aktuellen Verzeichnis und darunter bereitstellen | |
| git add -p | Interaktiv auswählen, welche Teile von Dateien gestaged werden sollen (nützlich für partielle Commits) | |
| git clone | Ein Repository in ein neues Verzeichnis klonen | |
| git clone -b branch_name URL | Nur den angegebenen Branch klonen (anstatt den Standard) | |
| git clone --depth 1 URL | Nur den neuesten Commit klonen (Shallow Copy, spart Zeit und Speicherplatz) | |
| git commit | Änderungen im Repository aufzeichnen | |
| git commit -m "Initial commit" | Commit mit Nachricht ohne Editor öffnen | |
| git commit -a -m "Fix bugs" | Alle geänderten Dateien stagen und committen mit Nachricht | |
| git commit --amend | Den letzten Commit aktualisieren (Nachricht ändern oder weitere Änderungen hinzufügen) | |
| git commit --fixup abc1234 | Einen Fixup-Commit erstellen, der später beim interaktiven Rebase automatisch gesquasht wird | |
| git config | Repository- oder globale Optionen abrufen und festlegen | |
| git config --global user.name "Name" | Globalen Git-Benutzernamen setzen | |
| git config --global user.email "email@example.com" | Globale Git-E-Mail-Adresse setzen | |
| git config --list | Alle Git-Einstellungen auflisten (Name, E-Mail, Editor usw.) | |
| git diff | Änderungen zwischen Commits, Commit und Arbeitsbaum usw. anzeigen | |
| git diff HEAD | Zeigen, was seit dem letzten Commit geändert wurde (unstaged) | |
| git diff --staged | Zeigen, was im nächsten Commit enthalten sein wird | |
| git diff --word-diff HEAD~1 | Änderungen auf Wortebene anzeigen | |
| git grep | In Repository-Dateien suchen | |
| git grep "functionName" | Alle Vorkommen von  | |
| git grep -n "TODO" | Zeilen mit  | |
| git grep -i "login" | Nach dem Wort  | |
| git init | Ein leeres Git-Repository erstellen oder ein bestehendes neu initialisieren | |
| git init my-project | Ein neues Repo im Verzeichnis my-project initialisieren | |
| git init --bare | Ein Bare-Repository initialisieren | |
| git log | Commit-Logs anzeigen | |
| git log --oneline | Commit-Verlauf in kompaktem Einzeilenformat anzeigen | |
| git log --graph --all | Alle Branches in einem visuellen Commit-Graphen anzeigen | |
| git log -p --stat | Patch und Dateistatistiken zu Commits anzeigen | |
| git reset | Dateien unstagen, Änderungen im Arbeitsverzeichnis behalten | |
| git reset HEAD file.txt | Eine Datei aus dem Staging entfernen (Änderungen bleiben erhalten) | |
| git reset --hard HEAD~1 | Einen Commit zurückgehen und alle Änderungen löschen (irreversibel!) | |
| git reset --soft HEAD~1 | Letzten Commit rückgängig machen, Änderungen aber behalten (erneut commitbar) | |
| git reset --mixed HEAD~1 | Einen Commit rückgängig machen, Änderungen aber ungestaged im Arbeitsverzeichnis behalten | |
| git show | Verschiedene Objekttypen anzeigen | |
| git show <commit_hash> | Änderungen und Nachricht eines bestimmten Commits anzeigen | |
| git show HEAD~1 | Den vorherigen Commit vor dem aktuellen anzeigen | |
| git show --stat | Eine Zusammenfassung der Dateiänderungen des neuesten Commits anzeigen | |
| git status | Status des Arbeitsbaums anzeigen | |
| git status -s | Status im Kurzformat anzeigen | |
| git status -b | Aktuellen Branch und Status der Dateien anzeigen | 
🌿 Branching und Merging
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| git branch | Branches erstellen, auflisten oder löschen | |
| git branch new-feature | Einen neuen Branch namens  | |
| git branch -d old-feature | Einen lokalen Branch namens  | |
| git checkout | Branches wechseln oder Dateien aus einem anderen Commit wiederherstellen | |
| git checkout main | Zum Branch  | |
| git checkout -b new-branch | Einen neuen Branch  | |
| git switch | Branches wechseln (vereinfachte Alternative zu checkout) | |
| git switch main | Zum Branch  | |
| git switch -c feature-x | Einen neuen Branch namens  | |
| git switch new-feature | Zu einem bestehenden Branch  | |
| git merge | Änderungen aus einem anderen Branch in den aktuellen übernehmen | |
| git merge new-feature | Den Branch  | |
| git merge --no-ff new-feature | Immer einen Merge-Commit erstellen (auch wenn Fast-Forward möglich ist) | |
| git merge --abort | Merge abbrechen und Änderungen zurücksetzen, falls Konflikte auftreten | |
| git rebase | Commits auf einen neuen Basis-Commit verschieben oder neu anwenden | |
| git rebase main | Commits des eigenen Branches auf  | |
| git rebase -i HEAD~3 | Die letzten 3 Commits interaktiv bearbeiten | |
| git rebase --abort | Einen laufenden Rebase stoppen und rückgängig machen | |
| git rebase -i --autosquash HEAD~5 | Commits, die als fixup oder squash markiert sind, beim interaktiven Rebase automatisch zusammenfassen | |
| git cherry-pick | Bestimmte Commits aus einem anderen Branch anwenden | |
| git cherry-pick <hash> | Einen bestimmten Commit (per Hash) im aktuellen Branch anwenden | |
| git cherry-pick --continue | Nach Konfliktlösung den Cherry-Pick fortsetzen | |
| git cherry-pick A^..B | Eine Commit-Spanne von  | 
📡 Remote-Repositories
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| git remote | Verknüpfungen zu Remote-Repositories (z. B. GitHub) verwalten | |
| git remote -v | Remote-Namen und ihre URLs anzeigen | |
| git remote add origin URL | Ein Remote-Repository namens  | |
| git pull | Änderungen aus einem Remote-Branch herunterladen und automatisch mergen | |
| git pull origin main | Änderungen aus dem Remote-Branch  | |
| git pull --rebase origin main | Änderungen holen und Rebase statt Merge durchführen | |
| git push | Lokale Änderungen in ein Remote-Repository hochladen | |
| git push origin main | Den lokalen Branch  | |
| git fetch | Änderungen vom Remote herunterladen, ohne sie zu mergen | |
| git fetch origin | Alle Updates von Remote  | |
| git fetch origin main | Nur den Branch  | |
| git fetch --all | Updates von allen Remotes holen | |
| git fetch --prune | Gelöschte Branches aufräumen — lokale Referenzen zu Remote-Branches entfernen | |
| git fetch --dry-run | Anzeigen, was geholt würde, ohne es herunterzuladen | |
| git fetch origin +main | Lokalen Tracking-Branch ( | 
📦 Stash und Aufräumen
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| git stash | Nicht commitete Änderungen (Work in Progress) temporär speichern | |
| git stash | Geänderte und gestagte Dateien speichern und Arbeitsverzeichnis zurücksetzen | |
| git stash apply | Die zuletzt gespeicherten Stash-Änderungen wieder anwenden (bleibt erhalten) | |
| git stash pop | Den letzten Stash anwenden und entfernen | |
| git stash list | Liste aller gespeicherten Stashes anzeigen | |
| git stash branch feature-fix | Einen neuen Branch erstellen und den letzten Stash darauf anwenden | |
| git clean | Nicht versionierte Dateien (nicht in Git) endgültig löschen | |
| git clean -f | Unversionierte Dateien im aktuellen Verzeichnis löschen | |
| git clean -fd | Unversionierte Dateien und Ordner löschen | |
| git clean -n | Vorschau, was gelöscht würde (sicherer Dry-Run) | 
🏷️ Tags
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| git tag | Tags erstellen, auflisten oder löschen, um bestimmte Punkte in der Historie zu markieren (z. B. Releases) | |
| git tag -a v1.0 -m "Version 1.0" | Einen annotierten Tag  | |
| git tag -d v1.0 | Den lokalen Tag  | |
| git push | Commits, Branches und Tags von lokal ins Remote-Repository hochladen | |
| git push origin --tags | Alle lokalen Tags ins Remote pushen (praktisch nach mehreren Versionstaggs) | |
| git push origin v1.0 | Einen bestimmten Tag (z. B.  | |
| git push origin :refs/tags/v1.0 | Den Remote-Tag  | 
🛠️ Konfliktlösung
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| git mergetool | Ein visuelles Tool öffnen, um Merge-Konflikte zu lösen | |
| git mergetool --tool=meld | Ein bestimmtes Merge-Tool (z. B. Meld) verwenden, um Konflikte zu beheben | |
| git rerere | Git merken lassen, wie Konflikte zuvor gelöst wurden | |
| git config --global rerere.enabled true | Automatische Wiederverwendung vergangener Konfliktlösungen aktivieren | |
| git rerere status | Anzeigen, welche Dateien gespeicherte Konfliktlösungen haben | |
| git rerere diff | Anzeigen, welche Änderungen Git für die Wiederverwendung gespeichert hat | 
⚙️ Erweiterte Befehle
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| git bisect | Binäre Suche verwenden, um den Commit zu finden, der einen Bug eingeführt hat | |
| git bisect start | Binäre Suche zwischen bekannt gutem und schlechtem Commit starten | |
| git bisect bad | Aktuellen Commit als “bad” markieren (enthält den Bug) | |
| git bisect good <commit> | Einen bekannten “good” Commit markieren, bei dem der Bug nicht existierte | |
| git blame | Zeigen, wer welche Zeile zuletzt geändert hat, mit Revision und Autor | |
| git blame file.txt | Autor- und Commit-Infos für jede Zeile einer Datei anzeigen | |
| git blame -L 10,20 file.txt | Blame-Infos nur für Zeilen 10 bis 20 anzeigen | |
| git blame --show-email file.txt | E-Mail-Adressen der Autoren zusammen mit den Zeilenänderungen anzeigen | |
| git reflog | Den Referenz-Log (Reflog) von Branch-Bewegungen und HEAD anzeigen und verwalten | |
| git reflog show main@{1.week.ago} | Sehen, wo der Branch  | |
| git reflog expire --expire=30.days --dry-run | Vorschau, welche Reflog-Einträge älter als 30 Tage aufgeräumt werden können | |
| git reflog delete HEAD@{2} | Einen bestimmten Reflog-Eintrag löschen (vorsichtig, da dies die Wiederherstellung beeinträchtigen kann) | |
| git submodule | Submodule hinzufügen, initialisieren, aktualisieren oder inspizieren (Repos innerhalb von Repos) | |
| git submodule add URL path | Ein externes Repository als Submodul im angegebenen Pfad hinzufügen | |
| git submodule update --init | Alle in der Repo aufgelisteten Submodule initialisieren und herunterladen | |
| git submodule foreach git pull | 
 | |
| git submodule sync --recursive | Submodul-URLs nach Änderungen in  | |
| git submodule update --remote --merge | Submodule auf den neuesten Commit ihrer Remote-Branches aktualisieren | |
| git archive | Ein Archiv (zip, tar usw.) von Dateien eines bestimmten Commits oder Branches erstellen | |
| git archive --format=zip HEAD > archive.zip | Ein ZIP-Archiv der aktuellen Projektdateien von HEAD erstellen | |
| git archive -o release.tar.gz HEAD | Ein komprimiertes  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | Ein  | |
| git gc | Unnötige Dateien bereinigen und Repository für bessere Performance optimieren | |
| git gc --aggressive | Eine gründliche Bereinigung und Optimierung durchführen (kann langsam sein, aber effektiv) | |
| git gc --prune=now | Alle unerreichbaren Objekte sofort entfernen (gefährlich, wenn unsicher) | |
| git shortlog | Kurze Zusammenfassung der Autoren und ihrer Commits | |
| git shortlog -e | Liste der Autoren mit E-Mail-Adressen anzeigen (z. B. zur Analyse, wer wie viel beigetragen hat) | |
| git shortlog -s -n | Anzeigen, wie viele Commits jeder Autor gemacht hat, sortiert nach Anzahl | |
| git shortlog -sne | Wie oben, aber mit Namen und E-Mails — nützlich für detailliertes Aktivitäts-Tracking | |
| git revert | Einen neuen Commit erstellen, der Änderungen eines vorherigen Commits rückgängig macht, ohne die Historie umzuschreiben | |
| git revert HEAD | Den letzten Commit rückgängig machen, indem ein neuer Commit erstellt wird | |
| git revert <commit_hash> | Einen bestimmten Commit per Hash rückgängig machen, indem ein neuer sicherer Commit erstellt wird | 
🐙 GitHub CLI
ghermöglicht es dir, GitHub direkt vom Terminal aus zu verwalten.
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| gh auth login | Authentifiziere dich bei einem GitHub-Host, um CLI-Befehlen den Zugriff auf dein Konto zu erlauben | |
| gh auth login --with-token < mytoken.txt | Authentifizierung mit einem persönlichen Zugriffstoken aus einer Datei ( | |
| gh auth login --hostname enterprise.internal | Authentifizierung bei einem GitHub-Enterprise-Server (nicht github.com) | |
| gh repo clone | Ein GitHub-Repository auf die lokale Maschine klonen | |
| gh repo clone user/repo | Das Repository  | |
| gh repo clone cli/cli -- --depth=1 | Das Repository klonen, aber nur den neuesten Commit herunterladen (schneller und platzsparender Clone) | |
| gh repo clone cli/cli workspace/cli | Das Repository in den benutzerdefinierten Ordner  | |
| gh issue list | Issues in einem GitHub-Repository auflisten, optional nach verschiedenen Kriterien gefiltert | |
| gh issue list --assignee "@me" | Issues anzeigen, die dir zugewiesen sind | |
| gh issue list --state all | Issues unabhängig vom Status (offen oder geschlossen) auflisten | |
| gh issue list --search "error no:assignee sort:created-asc" | Issues mit dem Begriff “error” finden, nicht zugewiesen, sortiert nach Erstellungsdatum aufsteigend | |
| gh pr create | Einen Pull Request auf GitHub über die CLI erstellen | |
| gh pr create --title "..." | Einen Pull Request mit dem angegebenen Titel erstellen | |
| gh pr create --project "Roadmap" | Den Pull Request mit einem GitHub-Projekt namens “Roadmap” verknüpfen | |
| gh pr create --base develop --head monalisa:feature | Einen PR vom Branch  | |
| gh repo create | Ein neues GitHub-Repository über die CLI erstellen | |
| gh repo create my-project | Ein neues Repository namens  | |
| gh repo create my-project --public --clone | Ein öffentliches Repository erstellen und lokal klonen | |
| gh repo create my-project --private --source=. --remote=upstream | Ein privates Remote-Repository aus dem aktuellen Ordner erstellen und ein Remote namens  | 
💡 Git-Aliasse (nützliche Abkürzungen)
Richte praktische Aliasse ein, um häufige Git-Befehle zu beschleunigen:
git config --global alias.br branch                                       # Abkürzung für: git branch
git config --global alias.ci commit                                       # Abkürzung für: git commit
git config --global alias.co checkout                                     # Abkürzung für: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # Schöne Verlaufsgrafik
git config --global alias.last "log -1 HEAD"                              # Letzten Commit anzeigen
git config --global alias.st status                                       # Abkürzung für: git status🚀 Erweiterte Git-Befehle für Profis
| Befehl | Beispiel | Beschreibung | 
|---|---|---|
| git filter-repo | Ein leistungsstarkes Tool zum Umschreiben der Git-Historie, um Dateien, Autorenschaft oder Pfade zu entfernen oder zu ändern; ersetzt git filter-branchmit besserer Geschwindigkeit und Sicherheit | |
| git filter-repo --path secret.txt --invert-paths | Repository-Historie effizient umschreiben, um sensible Dateien oder Verzeichnisse zu entfernen (schneller als  | |
| git filter-repo --replace-text replacements.txt | Strings oder Muster in der gesamten Historie massenweise ersetzen (z. B. Anmeldedaten bereinigen) | |
| git filter-repo --subdirectory-filter src | Die Historie eines Unterverzeichnisses in ein neues Repository extrahieren, Commit-Metadaten bleiben erhalten | |
| git worktree | Mehrere Arbeitsverzeichnisse mit einem einzigen Repository verknüpfen, um parallel an verschiedenen Branches zu arbeiten, ohne zu klonen | |
| git worktree add ../feature feature-branch | Ein zusätzliches Arbeitsverzeichnis für denselben Repo erstellen, um Branches parallel auszuchecken | |
| git worktree list | Alle aktiven Worktrees mit Pfaden und zugehörigen Branches auflisten | |
| git worktree remove ../feature | Ein verknüpftes Worktree entfernen, wenn es nicht mehr benötigt wird, und Arbeitsverzeichnis sicher bereinigen | |
| git replace | Temporäre Referenzen erstellen, die bestehende Objekte ersetzen, um eine nicht-destruktive lokale Historienmanipulation und Tests zu ermöglichen | |
| git replace <old_commit> <new_commit> | Einen Commit im lokalen Repo temporär gegen einen anderen austauschen, nützlich zum Testen oder Patchen der Historie | |
| git replace --list | Alle aktiven Ersatz-Referenzen anzeigen | |
| git replace -d <replace_ref> | Eine bestimmte Ersatz-Referenz löschen, um das Verhalten zurückzusetzen | |
| git stash | Nicht commitete Änderungen temporär auf einem Stack speichern, um Kontextwechsel ohne unfertige Commits zu ermöglichen | |
| git stash push -p | Interaktiv Änderungen zum Stash auswählen, für granulare Kontrolle | |
| git stash push -m "WIP selective stash" | Einen Stash mit einer benutzerdefinierten Nachricht erstellen, um ihn leichter zu identifizieren | |
| git stash apply stash@{2} | Einen bestimmten Stash aus der Liste anwenden, ohne ihn zu löschen | |
| git rebase | Commits auf eine andere Basis neu anwenden, für eine sauberere, lineare Historie und interaktives Editieren | |
| git rebase --interactive --autosquash | Eine interaktive Rebase-Session starten, die automatisch Commits mit fixup/squash zusammenführt | |
| git rebase -i --autosquash HEAD~10 | Commits mit fixup/squash automatisch zusammenführen, um die Historie vor dem Push aufzuräumen | |
| git commit --fixup <commit> | Einen Fixup-Commit erstellen, der beim interaktiven Rebase automatisch zusammengeführt wird | |
| git commit --squash <commit> | Einen Squash-Commit erstellen, um ihn beim Rebase mit einem bestimmten Commit zu kombinieren | |
| git bisect | Binäre Suche, um den Commit zu finden, der einen Bug eingeführt hat, durch schrittweises Testen von Commits | |
| git bisect run | Bisect automatisieren, indem ein Testskript auf jedem Commit läuft, um den fehlerhaften Commit schnell zu finden | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | Bisection durch Testskript automatisieren, um die Fehlersuche deutlich zu beschleunigen | |
| git bisect visualize | Ein grafisches Tool öffnen, um den Bisection-Prozess zu visualisieren | |
| git bisect reset | Bisect-Modus beenden und zum ursprünglichen HEAD zurückkehren | |
| git commit | Änderungen mit erweiterten Optionen (Amend, Sign, Fixup, Nachricht) committen, um eine hochwertige Historie zu gewährleisten | |
| git commit --gpg-sign | Einen Commit mit deinem GPG-Schlüssel signieren, um Authentizität kryptografisch zu verifizieren | |
| git commit -S -m "Signed commit" | Commits kryptografisch mit deinem GPG-Schlüssel signieren, um Integrität und Autorenschaft sicherzustellen | |
| git config --global user.signingkey <key_id> | Den globalen GPG-Schlüssel konfigurieren, der zum Signieren verwendet wird | |
| git log --show-signature | GPG-Signaturinformationen für Commits prüfen und anzeigen | |
| git reflog | Ein Log aller HEAD- und Branch-Updates aufbewahren — unerlässlich für die Wiederherstellung verlorener Commits und Nachvollziehen der Historie | |
| git reset --hard HEAD@{3} | Den aktuellen Branch mit einem älteren Reflog-Eintrag zurücksetzen, um Änderungen rückgängig zu machen | |
| git reflog expire --expire=now --all | Alle Reflog-Einträge sofort verfallen lassen (Vorsicht!) | 
🧰 Profi-Workflow-Tipps und Automatisierung
| Thema | Befehle / Beispiel | Erklärung & Profi-Tipps | 
|---|---|---|
| Aggressives Repo-Cleanup | git gc --aggressive --prune=now | Führt eine tiefe Garbage Collection durch und entfernt unerreichbare Objekte sofort zur Optimierung. Ideal während Wartungsfenstern | 
| Parallele Branch-Worktrees | git worktree add ../feature-branch feature | Mehrere Arbeitsverzeichnisse für gleichzeitige Feature-Entwicklung behalten, vermeidet Clone-Overhead | 
| Saubere, lineare Historie | git rebase -i --autosquash | Vor dem Push interaktives Rebase mit Autosquash durchführen, um die Historie sauber und lesbar zu halten | 
| Sichere Commits | git commit -S | Commits mit GPG signieren, um Vertrauen in gemeinsamen Repos zu stärken — in vielen Unternehmen Pflicht | 
| Automatisierte Bisektion | git bisect run ./test-script.sh | Fehlerjagd automatisieren, indem bei Bisect ein Testskript auf jedem Commit läuft | 
| Konfliktlösungs-Cache | git config --global rerere.enabled true | Wiederverwendung von Konfliktlösungen aktivieren, um wiederholte Merge-Konflikte schneller zu lösen | 
| Gemeinsame Aliasse und Hooks | Häufige Git-Aliasse und Commit-Hooks in einem geteilten Repo oder CI-Pipeline speichern, um Teamstandards durchzusetzen und Produktivität zu steigern | 
Zusätzliche Ressourcen
🧠 Tipp
Nicht alles auswendig lernen. Verwende --help, erkunde und übe regelmäßig:
git help <command>
git status🌐 Nützliche Links
📘 Offizielle Git-Dokumentation — detailliertes Handbuch für alle Git-Befehle:
https://git-scm.com/docs
📙 Learn Git Branching — interaktives visuelles Tutorial zum Erlernen von Branching-Konzepten:
https://learngitbranching.js.org
📕 Pro Git Buch (kostenlos, von Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Git Cheatsheet (offizielle kompakte Referenz):
https://education.github.com/git-cheat-sheet-education.pdf