# 🚀 Git Cheat Sheet: Branches, Merge, Rebase & VS Code

## 🌳 Branches (Zweige)
* **`main`** → Stabiler Stand, Production-ready (Deployment).
* **`dev`** → Aktive Entwicklung, Sammelbecken für Features.

---

## 🛠 Zusammenführen von Änderungen

### Git Merge
Führt zwei Zweige zusammen. Git sucht den letzten gemeinsamen Basispunkt und erstellt einen neuen **Merge-Commit**.

```bash
git checkout dev
git merge main
```

| Details   |        |
|-----------|--------|
| Wann?     | In Team-Branches, bei bereits gepushten Branches, wenn Stabilität wichtiger als eine saubere History ist. |
| Vorteile  | Sicher, einfach nachvollziehbar, schreibt die History nicht um. |
| Nachteile | Die History kann bei vielen Merges unübersichtlich ("Spaghetti-Graph") werden. |

### Git Rebase
Setzt deine Commits neu auf die Spitze eines anderen Branches. Die Commit-IDs werden dabei neu geschrieben.

```bash
git checkout dev
git fetch origin
git rebase origin/main
```

| Details   |        |
|-----------|--------|
| Wann?     | In lokalen Feature-Branches (bevor sie geteilt werden), um die History sauber zu halten. |
| Vorteile  | Erzeugt eine perfekt lineare, leicht lesbare History. |
| Nachteile | ⚠️ Gefährlich auf geteilten/öffentlichen Branches. Konflikte müssen ggf. für jeden einzelnen Commit gelöst werden. |

---

## 📦 Temporäres Speichern & Spezialbefehle

### Stash (Das "Regal")
Speichert uncommitted Changes temporär, um das Arbeitsverzeichnis sauber zu machen, ohne zu committen.

```bash
git stash        # Änderungen "parken".
git stash pop    # Änderungen zurückholen und Stash leeren.
```

**Wann?** Wenn du schnell den Branch wechseln musst, aber deine Arbeit noch nicht fertig ist.

### Cherry-pick
Kopiert einen ganz gezielten Commit von einem Branch in deinen aktuellen.

```bash
git cherry-pick <commit-hash>
```

**Wann?** Wenn ein Bugfix auf dem falschen Branch gelandet ist oder du nur eine einzige Funktion aus einem Feature-Branch brauchst.

---

## 🔄 Checkout & Switch

```bash
git checkout dev      # oder git switch dev – Wechselt zum Branch.
git checkout -f dev   # Force Checkout: Wechselt den Branch und verwirft alle ungespeicherten lokalen Änderungen unwiderruflich! ⚠️
```

---

## 💻 VS Code Git-Optionen (UI)

VS Code bietet beim Branch-Wechsel oft drei intelligente Optionen an:

* **Migrate Changes ⭐**
	* Nimmt deine aktuellen Änderungen einfach mit in den neuen Branch.
	* (Intern: stash → switch → stash pop).
* **Stash & Checkout**
	* Parkt deine Änderungen sicher im Stash und wechselt den Branch. Die Änderungen bleiben im Stash, bis du sie manuell wieder herausholst.
* **Force Checkout ⚠️**
	* Wechselt den Branch und löscht deine aktuellen, ungespeicherten Änderungen. Nur nutzen, wenn die Arbeit weggeworfen werden kann.

---

## 🔄 Typischer Sync-Workflow

Um den Entwicklungs-Branch aktuell zu halten, nachdem dev in main gemerged wurde:

1. Auf dev entwickeln.
2. Merge dev → main für das Release.
3. Zurück auf dev wechseln:
		```bash
		git checkout dev
		git merge main   # (oder rebase), um den neuesten Stand vom Main wieder in Dev zu haben.
		```

---

## 🧠 Merksätze

* **Merge** = Historien verbinden (Sicher & Dokumentiert).
* **Rebase** = Historie neu schreiben (Linear & Sauber).
* **Stash** = "Ich parke das mal kurz hier."
* **Migrate Changes** = Sicherer Branch-Wechsel mit "Gepäck".
