🐙 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-branch mit 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