116 lines
2.8 KiB
Markdown
116 lines
2.8 KiB
Markdown
# ⚡ Modul 04 – Merge & Konflikte
|
||
|
||
Beim Mergen bringt Git Änderungen aus verschiedenen Branches zusammen. Das klappt meistens automatisch – aber manchmal muss du eingreifen.
|
||
|
||
---
|
||
|
||
## Fast-Forward-Merge
|
||
|
||
Ein **Fast-Forward-Merge** ist der einfachste Fall: `main` hat sich nicht verändert, während du auf deinem Feature-Branch gearbeitet hast. Git „spult" `main` einfach vorwärts.
|
||
|
||
```mermaid
|
||
gitGraph
|
||
commit id: "A"
|
||
commit id: "B"
|
||
branch feature/schnell
|
||
checkout feature/schnell
|
||
commit id: "C"
|
||
commit id: "D"
|
||
checkout main
|
||
merge feature/schnell id: "Fast-Forward"
|
||
```
|
||
|
||
Kein echter Merge-Commit entsteht – `main` zeigt einfach auf `D`.
|
||
|
||
---
|
||
|
||
## 3-Way-Merge
|
||
|
||
Ein **3-Way-Merge** passiert, wenn beide Branches seit dem letzten gemeinsamen Commit neue Commits haben. Git vergleicht den gemeinsamen Vorfahren mit beiden Spitzen und kombiniert die Änderungen.
|
||
|
||
```mermaid
|
||
gitGraph
|
||
commit id: "Basis"
|
||
commit id: "A"
|
||
branch feature/konflikt
|
||
checkout feature/konflikt
|
||
commit id: "F1 – auf feature"
|
||
checkout main
|
||
commit id: "M1 – auf main"
|
||
merge feature/konflikt id: "Merge Commit"
|
||
```
|
||
|
||
Git erstellt dabei einen **Merge-Commit** mit zwei Eltern-Commits.
|
||
|
||
---
|
||
|
||
## Wenn ein Konflikt entsteht
|
||
|
||
Ein Konflikt tritt auf, wenn **beide Branches dieselbe Zeile** einer Datei unterschiedlich geändert haben. Git weiß nicht, welche Version "richtig" ist – du musst entscheiden.
|
||
|
||
```bash
|
||
git merge feature/konflikt
|
||
```
|
||
|
||
```text
|
||
Auto-merging konflikt-vorlage.txt
|
||
CONFLICT (content): Merge conflict in konflikt-vorlage.txt
|
||
Automatic merge failed; fix conflicts and then commit the result.
|
||
```
|
||
|
||
---
|
||
|
||
## Konfliktmarker verstehen
|
||
|
||
Git markiert den betroffenen Bereich in der Datei so:
|
||
|
||
```text
|
||
<<<<<<< HEAD
|
||
Diese Zeile stammt vom main-Branch.
|
||
=======
|
||
Diese Zeile stammt vom feature-Branch.
|
||
>>>>>>> feature/konflikt
|
||
```
|
||
|
||
| Marker | Bedeutung |
|
||
|--------|-----------|
|
||
| `<<<<<<< HEAD` | Beginn des Konfliktbereichs – deine aktuelle Version (main) |
|
||
| `=======` | Trennlinie zwischen den beiden Versionen |
|
||
| `>>>>>>> feature/konflikt` | Ende des Konfliktbereichs – die eingehende Version |
|
||
|
||
---
|
||
|
||
## Konflikt auflösen
|
||
|
||
1. **Öffne die Datei** in einem Texteditor
|
||
2. **Entscheide**, welche Version du behalten willst (oder kombiniere beide)
|
||
3. **Entferne alle Konfliktmarker** (`<<<<<<<`, `=======`, `>>>>>>>`)
|
||
4. **Stage die Datei** und committe:
|
||
|
||
```bash
|
||
git add konflikt-vorlage.txt
|
||
git commit -m "fix: Merge-Konflikt aufgelöst"
|
||
```
|
||
|
||
---
|
||
|
||
## Notausgang: Merge abbrechen
|
||
|
||
Wenn du den Überblick verlierst und von vorn anfangen willst:
|
||
|
||
```bash
|
||
git merge --abort
|
||
```
|
||
|
||
Das setzt alles auf den Zustand vor dem Merge-Versuch zurück.
|
||
|
||
---
|
||
|
||
## 📝 Jetzt bist du dran!
|
||
|
||
Weiter zur [Aufgabe](aufgabe.md).
|
||
|
||
---
|
||
|
||
**Weiter geht's mit:** [05 – Remote & Pull Requests](../05-remote-und-pullrequests/README.md)
|