Add README.md
This commit is contained in:
605
README.md
Normal file
605
README.md
Normal file
@@ -0,0 +1,605 @@
|
||||
# Git CheatSheet
|
||||
|
||||
Übersicht der wichtigsten Git-Befehle mit praktischen Beispielen.
|
||||
|
||||
---
|
||||
|
||||
## Repository erstellen & klonen
|
||||
|
||||
```bash
|
||||
# Neues Repository im aktuellen Verzeichnis initialisieren
|
||||
git init
|
||||
|
||||
# Neues Repository mit Verzeichnis erstellen
|
||||
git init mein-projekt
|
||||
|
||||
# Bestehendes Repository klonen
|
||||
git clone https://github.com/user/repo.git
|
||||
|
||||
# Klonen in ein bestimmtes Verzeichnis
|
||||
git clone https://github.com/user/repo.git mein-ordner
|
||||
|
||||
# Nur den neuesten Commit klonen (shallow clone)
|
||||
git clone --depth 1 https://github.com/user/repo.git
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Konfiguration
|
||||
|
||||
```bash
|
||||
# Benutzername setzen (global)
|
||||
git config --global user.name "Max Mustermann"
|
||||
|
||||
# E-Mail setzen (global)
|
||||
git config --global user.email "max@example.com"
|
||||
|
||||
# Konfiguration nur für aktuelles Repo
|
||||
git config user.name "Max Mustermann"
|
||||
|
||||
# Alle Einstellungen anzeigen
|
||||
git config --list
|
||||
|
||||
# Standard-Branch-Name setzen
|
||||
git config --global init.defaultBranch main
|
||||
|
||||
# Editor festlegen
|
||||
git config --global core.editor "code --wait"
|
||||
|
||||
# Aliase erstellen
|
||||
git config --global alias.co checkout
|
||||
git config --global alias.br branch
|
||||
git config --global alias.st status
|
||||
git config --global alias.lg "log --oneline --graph --all"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Status & Änderungen
|
||||
|
||||
```bash
|
||||
# Aktuellen Status anzeigen
|
||||
git status
|
||||
|
||||
# Kurzform des Status
|
||||
git status -s
|
||||
|
||||
# Änderungen anzeigen (noch nicht gestaged)
|
||||
git diff
|
||||
|
||||
# Änderungen anzeigen (bereits gestaged)
|
||||
git diff --staged
|
||||
|
||||
# Änderungen einer bestimmten Datei
|
||||
git diff datei.txt
|
||||
|
||||
# Vergleich zwischen zwei Branches
|
||||
git diff main..feature-branch
|
||||
|
||||
# Vergleich zwischen zwei Commits
|
||||
git diff abc123 def456
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dateien hinzufügen (Staging)
|
||||
|
||||
```bash
|
||||
# Einzelne Datei hinzufügen
|
||||
git add datei.txt
|
||||
|
||||
# Mehrere Dateien hinzufügen
|
||||
git add datei1.txt datei2.txt
|
||||
|
||||
# Alle Dateien im aktuellen Verzeichnis
|
||||
git add .
|
||||
|
||||
# Alle Änderungen (inkl. gelöschte Dateien)
|
||||
git add -A
|
||||
|
||||
# Interaktiv Teile einer Datei hinzufügen
|
||||
git add -p datei.txt
|
||||
|
||||
# Dateien nach Muster hinzufügen
|
||||
git add *.js
|
||||
git add src/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Commits
|
||||
|
||||
```bash
|
||||
# Commit mit Nachricht
|
||||
git commit -m "Kurze Beschreibung der Änderung"
|
||||
|
||||
# Alle geänderten Dateien committen (ohne git add)
|
||||
git commit -am "Änderungen committen"
|
||||
|
||||
# Letzten Commit ändern (Nachricht oder Dateien)
|
||||
git commit --amend -m "Neue Nachricht"
|
||||
|
||||
# Leeren Commit erstellen (z.B. für CI-Trigger)
|
||||
git commit --allow-empty -m "Trigger CI"
|
||||
|
||||
# Commit mit mehrzeiliger Nachricht
|
||||
git commit -m "Titel" -m "Detaillierte Beschreibung"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Branches
|
||||
|
||||
```bash
|
||||
# Alle lokalen Branches anzeigen
|
||||
git branch
|
||||
|
||||
# Alle Branches (lokal + remote)
|
||||
git branch -a
|
||||
|
||||
# Neuen Branch erstellen
|
||||
git branch feature-login
|
||||
|
||||
# Branch erstellen und wechseln
|
||||
git checkout -b feature-login
|
||||
# oder (neuere Syntax)
|
||||
git switch -c feature-login
|
||||
|
||||
# Zu einem Branch wechseln
|
||||
git checkout main
|
||||
# oder
|
||||
git switch main
|
||||
|
||||
# Branch umbenennen
|
||||
git branch -m alter-name neuer-name
|
||||
|
||||
# Branch löschen (lokal)
|
||||
git branch -d feature-login
|
||||
|
||||
# Branch löschen (forciert, auch ungemergte)
|
||||
git branch -D feature-login
|
||||
|
||||
# Remote-Branch löschen
|
||||
git push origin --delete feature-login
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Merging
|
||||
|
||||
```bash
|
||||
# Branch in aktuellen Branch mergen
|
||||
git merge feature-login
|
||||
|
||||
# Merge ohne Fast-Forward (behält Branch-Historie)
|
||||
git merge --no-ff feature-login
|
||||
|
||||
# Merge abbrechen (bei Konflikten)
|
||||
git merge --abort
|
||||
|
||||
# Merge-Konflikte anzeigen
|
||||
git diff --name-only --diff-filter=U
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Rebasing
|
||||
|
||||
```bash
|
||||
# Aktuellen Branch auf main rebasen
|
||||
git rebase main
|
||||
|
||||
# Interaktives Rebase (letzte 3 Commits)
|
||||
git rebase -i HEAD~3
|
||||
|
||||
# Rebase abbrechen
|
||||
git rebase --abort
|
||||
|
||||
# Nach Konfliktlösung fortfahren
|
||||
git rebase --continue
|
||||
|
||||
# Einzelnen Commit überspringen
|
||||
git rebase --skip
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Remote-Repositories
|
||||
|
||||
```bash
|
||||
# Remote-Repositories anzeigen
|
||||
git remote -v
|
||||
|
||||
# Neues Remote hinzufügen
|
||||
git remote add origin https://github.com/user/repo.git
|
||||
|
||||
# Remote-URL ändern
|
||||
git remote set-url origin https://github.com/user/neues-repo.git
|
||||
|
||||
# Remote entfernen
|
||||
git remote remove origin
|
||||
|
||||
# Remote umbenennen
|
||||
git remote rename origin upstream
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Push & Pull
|
||||
|
||||
```bash
|
||||
# Änderungen pushen
|
||||
git push origin main
|
||||
|
||||
# Ersten Push mit Upstream setzen
|
||||
git push -u origin main
|
||||
|
||||
# Danach reicht:
|
||||
git push
|
||||
|
||||
# Force-Push (Vorsicht!)
|
||||
git push --force
|
||||
# Sicherer:
|
||||
git push --force-with-lease
|
||||
|
||||
# Änderungen holen und mergen
|
||||
git pull
|
||||
|
||||
# Änderungen holen ohne Merge
|
||||
git fetch
|
||||
|
||||
# Alle Remotes fetchen
|
||||
git fetch --all
|
||||
|
||||
# Mit Rebase statt Merge
|
||||
git pull --rebase
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Stashing (Änderungen zwischenspeichern)
|
||||
|
||||
```bash
|
||||
# Aktuelle Änderungen stashen
|
||||
git stash
|
||||
|
||||
# Stash mit Beschreibung
|
||||
git stash save "Arbeit an Feature X"
|
||||
|
||||
# Auch untracked Dateien stashen
|
||||
git stash -u
|
||||
|
||||
# Stash-Liste anzeigen
|
||||
git stash list
|
||||
|
||||
# Letzten Stash anwenden und behalten
|
||||
git stash apply
|
||||
|
||||
# Letzten Stash anwenden und löschen
|
||||
git stash pop
|
||||
|
||||
# Bestimmten Stash anwenden
|
||||
git stash apply stash@{2}
|
||||
|
||||
# Stash löschen
|
||||
git stash drop stash@{0}
|
||||
|
||||
# Alle Stashes löschen
|
||||
git stash clear
|
||||
|
||||
# Stash als neuen Branch
|
||||
git stash branch neuer-branch
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Historie & Logs
|
||||
|
||||
```bash
|
||||
# Commit-Historie anzeigen
|
||||
git log
|
||||
|
||||
# Kompakte Ansicht
|
||||
git log --oneline
|
||||
|
||||
# Mit Graph
|
||||
git log --oneline --graph --all
|
||||
|
||||
# Letzte n Commits
|
||||
git log -5
|
||||
|
||||
# Commits eines Autors
|
||||
git log --author="Max"
|
||||
|
||||
# Commits in Zeitraum
|
||||
git log --since="2024-01-01" --until="2024-12-31"
|
||||
|
||||
# Commits mit bestimmtem Text
|
||||
git log --grep="bugfix"
|
||||
|
||||
# Änderungen in Datei verfolgen
|
||||
git log -p datei.txt
|
||||
|
||||
# Wer hat welche Zeile geändert
|
||||
git blame datei.txt
|
||||
|
||||
# Kurze Statistik
|
||||
git log --stat
|
||||
|
||||
# Änderungen pro Autor
|
||||
git shortlog -sn
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Rückgängig machen
|
||||
|
||||
```bash
|
||||
# Unstaged Änderungen verwerfen
|
||||
git checkout -- datei.txt
|
||||
# oder (neuere Syntax)
|
||||
git restore datei.txt
|
||||
|
||||
# Staged Datei zurück zu unstaged
|
||||
git reset HEAD datei.txt
|
||||
# oder
|
||||
git restore --staged datei.txt
|
||||
|
||||
# Letzten Commit rückgängig (behält Änderungen)
|
||||
git reset --soft HEAD~1
|
||||
|
||||
# Letzten Commit rückgängig (verwirft Änderungen)
|
||||
git reset --hard HEAD~1
|
||||
|
||||
# Zu bestimmtem Commit zurück
|
||||
git reset --hard abc1234
|
||||
|
||||
# Commit rückgängig machen (neuer Commit)
|
||||
git revert abc1234
|
||||
|
||||
# Alle lokalen Änderungen verwerfen
|
||||
git checkout .
|
||||
git clean -fd
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
```bash
|
||||
# Alle Tags anzeigen
|
||||
git tag
|
||||
|
||||
# Lightweight Tag erstellen
|
||||
git tag v1.0.0
|
||||
|
||||
# Annotated Tag mit Nachricht
|
||||
git tag -a v1.0.0 -m "Version 1.0.0 Release"
|
||||
|
||||
# Tag für älteren Commit
|
||||
git tag -a v0.9.0 abc1234 -m "Nachträglicher Tag"
|
||||
|
||||
# Tags pushen
|
||||
git push origin v1.0.0
|
||||
|
||||
# Alle Tags pushen
|
||||
git push origin --tags
|
||||
|
||||
# Tag löschen (lokal)
|
||||
git tag -d v1.0.0
|
||||
|
||||
# Tag löschen (remote)
|
||||
git push origin --delete v1.0.0
|
||||
|
||||
# Zu Tag wechseln
|
||||
git checkout v1.0.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Cherry-Pick
|
||||
|
||||
```bash
|
||||
# Einzelnen Commit in aktuellen Branch übernehmen
|
||||
git cherry-pick abc1234
|
||||
|
||||
# Mehrere Commits
|
||||
git cherry-pick abc1234 def5678
|
||||
|
||||
# Cherry-Pick ohne Commit (nur Änderungen übernehmen)
|
||||
git cherry-pick -n abc1234
|
||||
|
||||
# Bei Konflikten fortfahren
|
||||
git cherry-pick --continue
|
||||
|
||||
# Cherry-Pick abbrechen
|
||||
git cherry-pick --abort
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Suchen
|
||||
|
||||
```bash
|
||||
# In Dateien suchen
|
||||
git grep "suchbegriff"
|
||||
|
||||
# Mit Zeilennummern
|
||||
git grep -n "suchbegriff"
|
||||
|
||||
# In bestimmtem Commit suchen
|
||||
git grep "suchbegriff" abc1234
|
||||
|
||||
# Commit finden, der einen Bug eingeführt hat
|
||||
git bisect start
|
||||
git bisect bad # Aktueller Commit ist kaputt
|
||||
git bisect good abc1234 # Dieser Commit war noch OK
|
||||
# Git führt dich durch die Commits
|
||||
git bisect reset # Beenden
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Aufräumen
|
||||
|
||||
```bash
|
||||
# Untracked Dateien anzeigen
|
||||
git clean -n
|
||||
|
||||
# Untracked Dateien löschen
|
||||
git clean -f
|
||||
|
||||
# Auch Verzeichnisse
|
||||
git clean -fd
|
||||
|
||||
# Auch ignorierte Dateien
|
||||
git clean -fdx
|
||||
|
||||
# Nicht mehr existierende Remote-Branches entfernen
|
||||
git fetch --prune
|
||||
|
||||
# Alte Objekte aufräumen
|
||||
git gc
|
||||
|
||||
# Aggressive Aufräumung
|
||||
git gc --aggressive
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Submodules
|
||||
|
||||
```bash
|
||||
# Submodule hinzufügen
|
||||
git submodule add https://github.com/user/lib.git libs/lib
|
||||
|
||||
# Submodules beim Klonen initialisieren
|
||||
git clone --recurse-submodules https://github.com/user/repo.git
|
||||
|
||||
# Submodules nachträglich initialisieren
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
# Alle Submodules aktualisieren
|
||||
git submodule update --remote
|
||||
|
||||
# Submodule entfernen
|
||||
git submodule deinit libs/lib
|
||||
git rm libs/lib
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Nützliche Kombinationen
|
||||
|
||||
```bash
|
||||
# Letzten Commit-Hash anzeigen
|
||||
git rev-parse HEAD
|
||||
|
||||
# Aktuellen Branch-Namen anzeigen
|
||||
git branch --show-current
|
||||
|
||||
# Anzahl Commits zählen
|
||||
git rev-list --count HEAD
|
||||
|
||||
# Alle Dateien eines Commits auflisten
|
||||
git diff-tree --no-commit-id --name-only -r abc1234
|
||||
|
||||
# Änderungen seit letztem Tag
|
||||
git log $(git describe --tags --abbrev=0)..HEAD --oneline
|
||||
|
||||
# Dateien im Staging-Bereich anzeigen
|
||||
git diff --cached --name-only
|
||||
|
||||
# Lokale Branches ohne Remote löschen
|
||||
git fetch -p && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## .gitignore Beispiele
|
||||
|
||||
```gitignore
|
||||
# Verzeichnisse
|
||||
node_modules/
|
||||
vendor/
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
# Dateitypen
|
||||
*.log
|
||||
*.tmp
|
||||
*.cache
|
||||
|
||||
# Spezifische Dateien
|
||||
.env
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Ausnahmen (nicht ignorieren)
|
||||
!wichtig.log
|
||||
|
||||
# Muster
|
||||
**/logs/
|
||||
debug[0-9].log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Häufige Workflows
|
||||
|
||||
### Feature-Branch Workflow
|
||||
|
||||
```bash
|
||||
git checkout main
|
||||
git pull
|
||||
git checkout -b feature/neue-funktion
|
||||
# ... Änderungen ...
|
||||
git add .
|
||||
git commit -m "Neue Funktion implementiert"
|
||||
git push -u origin feature/neue-funktion
|
||||
# Pull Request erstellen, dann:
|
||||
git checkout main
|
||||
git pull
|
||||
git branch -d feature/neue-funktion
|
||||
```
|
||||
|
||||
### Hotfix Workflow
|
||||
|
||||
```bash
|
||||
git checkout main
|
||||
git pull
|
||||
git checkout -b hotfix/kritischer-bug
|
||||
# ... Fix ...
|
||||
git commit -am "Kritischen Bug behoben"
|
||||
git checkout main
|
||||
git merge hotfix/kritischer-bug
|
||||
git tag -a v1.0.1 -m "Hotfix Release"
|
||||
git push origin main --tags
|
||||
git branch -d hotfix/kritischer-bug
|
||||
```
|
||||
|
||||
### Rebase vor Merge
|
||||
|
||||
```bash
|
||||
git checkout feature-branch
|
||||
git fetch origin
|
||||
git rebase origin/main
|
||||
# Konflikte lösen falls nötig
|
||||
git push --force-with-lease
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tipps
|
||||
|
||||
- **Commit oft**: Kleine, fokussierte Commits sind besser als große.
|
||||
- **Aussagekräftige Nachrichten**: Was wurde geändert und warum?
|
||||
- **Branches nutzen**: Nie direkt auf main/master entwickeln.
|
||||
- **Vor Push prüfen**: `git log origin/main..HEAD` zeigt ausstehende Commits.
|
||||
- **Backup vor Reset**: Bei `--hard` gehen Änderungen verloren!
|
||||
- **Force-Push vermeiden**: Nur auf eigenen Feature-Branches.
|
||||
|
||||
---
|
||||
|
||||
*Erstellt: 04 Februar 2026*
|
||||
Reference in New Issue
Block a user