# Git Cheatsheet
## Login / Authentifizieren
```bash
# Git-User-Info lokal setzen (für Commits)
git config --global user.name "Dein Name"
git config --global user.email "deine@email.de"
```
## Create & Clone
```bash
# Aktuellen Ordner in eine Repository verwandeln
git init
# Repository von einem Link klonen
git clone
# Repository von einem Link zu einem bestimmten Pfad klonen
git clone
```
## Add & Remove
```bash
# Einzelne Datei tracken & stagen
git add
# Alle geänderte Dateien tracken & stagen
git add .
# Datei aus dem Arbeitsverzeichnis entfernen
git rm
```
## Commit & Synchronize
```bash
# Commit erstellen
git commit -m "fix: Quick hotfix"
# Commit erstellen und bereits getrackten dateien stagen
git commit -am "fix: Quick hotfix"
# Alle lokalen Commits pushen
git push
# Alle lokalen Commits zu einer bestimmten branch pushen
git push origin
# Alle lokalen Commits zu einer neuen remote pushen
git remote add upstream
git push -u upstream main
```
## Zu einem alten Commit zurückkehren
```bash
# 1. Zuerst die Commit-Historie anzeigen, um den Hash des gewünschten Commits zu finden
git log # zeigt die letzten Commits an, inklusive deren Hashs (zufällige Zeichenfolge)
# Setze den Branch auf den gewünschten Commit zurück
git reset --hard
```
## Branches
```bash
# Aktuellen Branch anzeigen
git branch
# Neuen Branch erstellen (aber nicht wechseln)
git branch
# Neuen Branch erstellen UND direkt wechseln
git checkout -b
# Zu bestehendem Branch wechseln
git checkout
# Branch löschen
git branch -d # nur wenn schon gemerged
git branch -D # erzwingen
# Alle lokalen Branches anzeigen
git branch
# Remote-Branches anzeigen
git branch -r
# Alle Branches (lokal + remote)
git branch -a
# Lokalen Branch auf Remote pushen
git push -u origin
```
## Mergen
```bash
# Aktuellen Status des Repositories anzeigen
git status
# Zu dem Branch wechseln, in den du mergen willst (z.B. main)
git checkout
# Mergen eines anderen Branches (z.B. feature-branch) in den aktuellen Branch
git merge
# Merge rückgängig machen, falls du den Merge noch nicht committet hast
git merge --abort
# Den Merge-Commit durch einen "Squash" zusammenfassen (optional)
git merge --squash # fasst alle Commits des Branches in einen zusammen
git commit # Commit erstellen
```
## Merge Konflikte lösen
```bash
# 1. Git meldet einen Konflikt, falls es welche gibt
git status # zeigt an, welche Dateien Konflikte haben
# 2. Öffne die betroffenen Dateien, um die Konflikte zu lösen
# Konflikte werden in der Datei markiert:
# >>>>>>> HEAD und ======= trennen die Versionen
# Lösche die Marker und entscheide, welche Version du behalten möchtest
# 3. Nachdem du die Konflikte manuell behoben hast, markiere die Dateien als gelöst
git add # fügt die gelösten Dateien zum Staging-Bereich hinzu
# 4. Nachdem alle Konflikte gelöst sind, beende den Merge-Prozess
git commit # Commit für den Merge erstellen (Git wird eine Standard-Merge-Nachricht vorschlagen)
# 5. Falls du den Merge abbrechen möchtest, z.B. wenn du die Konflikte nicht lösen kannst
git merge --abort # Rückgängig machen und zum vorherigen Zustand zurückkehren (nur während eines unvollständigen Merges)
# 6. Falls du den Merge nach Konfliktlösung fortsetzen willst (wenn z.B. der Merge in einem "Squash"-Commit abgeschlossen wurde)
git merge --continue # Fortsetzen des Merges (normalerweise nur nach einem Rebase oder Squash, der den Merge unterbricht)
```
## Tagging
```bash
# Alle bestehenden Tags anzeigen
git tag
# Einen neuen Tag erstellen (z.B. v1.0.0)
git tag
# Einen Tag mit einer Nachricht versehen
git tag -a -m "Tag Nachricht"
# Einen Tag zu einem bestimmten Commit erstellen (z.B. nach Commit ID)
git tag
# Einen Tag auf einem Remote-Repository veröffentlichen
git push origin
# Alle Tags auf das Remote-Repository pushen
git push --tags
# Einen Tag löschen (lokal)
git tag -d
# Einen Tag löschen (remote)
git push --delete origin
# Einen Tag auf einen bestimmten Commit verschieben (z.B. nach Commit ID)
git tag -f
# Einen Tag auschecken, um zu diesem Punkt im Repository zu gehen
git checkout
# Einen Tag mit einer Nachricht bearbeiten (falls nicht noch gepusht)
git tag -a -m "Neue Nachricht"
```