chore: initial training material setup
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
# ⚡ 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)
|
||||
@@ -0,0 +1,133 @@
|
||||
# 📝 Aufgabe 04 – Merge & Konflikte
|
||||
|
||||
In dieser Aufgabe provozierst du absichtlich einen Merge-Konflikt und löst ihn auf. Das ist der beste Weg, um Konflikte zu verstehen – bevor sie im echten Projekt auftreten!
|
||||
|
||||
---
|
||||
|
||||
## Ausgangssituation
|
||||
|
||||
Lege ein neues Repo an:
|
||||
|
||||
```bash
|
||||
mkdir konflikt-uebung
|
||||
cd konflikt-uebung
|
||||
git init
|
||||
```
|
||||
|
||||
Kopiere die Datei [konflikt-vorlage.txt](konflikt-vorlage.txt) in den Ordner (oder erstelle sie neu):
|
||||
|
||||
```bash
|
||||
cp ../04-merge-und-konflikte/konflikt-vorlage.txt .
|
||||
git add konflikt-vorlage.txt
|
||||
git commit -m "chore: Vorlage hinzugefügt"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Aufgabe
|
||||
|
||||
### 1. Ersten Feature-Branch anlegen
|
||||
|
||||
```bash
|
||||
git switch -c feature/version-a
|
||||
```
|
||||
|
||||
Öffne `konflikt-vorlage.txt` und ändere Zeile 3 (`[HIER ÄNDERN]`) zu:
|
||||
|
||||
```text
|
||||
Dies ist Version A – geändert von Branch feature/version-a.
|
||||
```
|
||||
|
||||
Committe die Änderung:
|
||||
|
||||
```bash
|
||||
git add konflikt-vorlage.txt
|
||||
git commit -m "feat: Version A in Zeile 3 eingetragen"
|
||||
```
|
||||
|
||||
### 2. Ersten Branch in main mergen (Fast-Forward)
|
||||
|
||||
```bash
|
||||
git switch main
|
||||
git merge feature/version-a
|
||||
```
|
||||
|
||||
Da `main` sich nicht verändert hat, ist das ein **Fast-Forward-Merge** – kein Konflikt.
|
||||
|
||||
### 3. Zweiten Feature-Branch anlegen
|
||||
|
||||
Erstelle vom aktuellen Stand von `main` einen zweiten Branch:
|
||||
|
||||
```bash
|
||||
git switch -c feature/version-b
|
||||
```
|
||||
|
||||
Öffne `konflikt-vorlage.txt` und ändere dieselbe Zeile 3 zu:
|
||||
|
||||
```text
|
||||
Dies ist Version B – geändert von Branch feature/version-b.
|
||||
```
|
||||
|
||||
Committe die Änderung:
|
||||
|
||||
```bash
|
||||
git add konflikt-vorlage.txt
|
||||
git commit -m "feat: Version B in Zeile 3 eingetragen"
|
||||
```
|
||||
|
||||
### 4. Auch main verändern (Konflikt vorbereiten)
|
||||
|
||||
```bash
|
||||
git switch main
|
||||
```
|
||||
|
||||
Öffne `konflikt-vorlage.txt` und ändere Zeile 3 **nochmals** zu:
|
||||
|
||||
```text
|
||||
Dies ist die main-Version – direkt auf main geändert.
|
||||
```
|
||||
|
||||
Committe:
|
||||
|
||||
```bash
|
||||
git add konflikt-vorlage.txt
|
||||
git commit -m "fix: Zeile 3 auf main angepasst"
|
||||
```
|
||||
|
||||
### 5. Konflikt provozieren
|
||||
|
||||
Merge `feature/version-b` in `main`:
|
||||
|
||||
```bash
|
||||
git merge feature/version-b
|
||||
```
|
||||
|
||||
Git meldet einen Konflikt. Öffne `konflikt-vorlage.txt` und schau dir die Konfliktmarker an.
|
||||
|
||||
### 6. Konflikt auflösen
|
||||
|
||||
Entscheide dich für eine Version (oder kombiniere beide) und entferne alle Konfliktmarker. Dann:
|
||||
|
||||
```bash
|
||||
git add konflikt-vorlage.txt
|
||||
git commit -m "fix: Merge-Konflikt in konflikt-vorlage.txt aufgelöst"
|
||||
```
|
||||
|
||||
### 7. Ergebnis prüfen
|
||||
|
||||
```bash
|
||||
git log --oneline --graph
|
||||
```
|
||||
|
||||
Du solltest einen Merge-Commit mit zwei Eltern-Commits sehen.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Erfolgskriterien
|
||||
|
||||
- [ ] Der Fast-Forward-Merge (Schritt 2) hat keinen Merge-Commit erstellt
|
||||
- [ ] `git merge feature/version-b` hat einen Konflikt gemeldet
|
||||
- [ ] Du hast die Konfliktmarker in der Datei gesehen (`<<<<<<<`, `=======`, `>>>>>>>`)
|
||||
- [ ] Der Konflikt ist aufgelöst und committed
|
||||
- [ ] `git log --oneline --graph` zeigt einen Merge-Commit mit zwei Linien
|
||||
- [ ] `git status` zeigt `nothing to commit, working tree clean`
|
||||
@@ -0,0 +1,5 @@
|
||||
Zeile 1: Diese Zeile wird nicht verändert.
|
||||
Zeile 2: Diese Zeile wird auch nicht verändert.
|
||||
Zeile 3: [HIER ÄNDERN] – Diese Zeile wird in beiden Branches unterschiedlich verändert.
|
||||
Zeile 4: Diese Zeile bleibt wieder gleich.
|
||||
Zeile 5: Ende der Vorlage.
|
||||
Reference in New Issue
Block a user