Branches mergen und Konflikte lösen
Einführung
Branching isoliert Arbeit; Merging führt sie wieder zusammen. Hier lernst du sichere Merges, Strategien und selbstbewusstes Auflösen von Konflikten.
Voraussetzungen
- Grundworkflow (
add,commit,push) - Branch-Erstellung/Wechsel bekannt
- Verständis von Commit-Historie /
git log
Lernziele
- Feature-Branches in Mainline mergen
- Fast-Forward vs Non-Fast-Forward unterscheiden
- Konflikte erkennen, ansehen, lösen
- Merge abbrechen oder neu starten
- Best Practices zur Minimierung von Konflikten anwenden
Mentales Modell
Merge erzeugt i.d.R. einen neuen Commit mit zwei Eltern, außer Fast-Forward ist möglich. Git macht einen Three-Way-Merge:
BASE (gemeinsamer Vorfahr)
HEAD (aktueller Branch)
OTHER (einzumergender Branch)Diffs BASE→HEAD und BASE→OTHER: nicht überlappend = automatisch; Überschneidung = Konflikt.
Fast-Forward vs Merge-Commit
| Szenario | Resultat | Wann | Vorteile | Nachteile |
|---|---|---|---|---|
| Fast-forward | Zeiger verschiebt sich | Ziel strikt voraus | Lineare Historie | Verlust Branch-Kontext |
| Merge-Commit | Neuer Commit (2 Eltern) | Divergierende Historien | Sichtbarer Integrationspunkt | Extra Commits / Rauschen |
Erzwingen eines Merge-Commits:
bash
git merge --no-ff feature/loginBasis-Workflow
bash
git checkout main
git pull origin main
git merge feature/login
git push origin mainVorschau
bash
git log --oneline main..feature/login
git merge --no-commit --no-ff feature/login
# Rückgängig
git merge --abortKonflikt-Beispiel
git checkout main
git merge feature/rate-limit
# CONFLICT ...Marker:
<<<<<<< HEAD
"rateLimit": 200,
=======
"rateLimit": 500,
>>>>>>> feature/rate-limitKonflikte untersuchen
bash
git status
git diff
git diff --name-only --diff-filter=UResolve → Marker entfernen →
bash
git add config/app.json
git commitOder individuelle Message:
bash
git commit -m "Merge feature/rate-limit: adjust to 300"Abbrechen
bash
git merge --abortWichtige Optionen
| Option | Zweck |
|---|---|
--no-ff | Merge-Commit erzwingen |
--squash | Änderungen bündeln, kein Merge-Commit |
--no-commit | Stop vor Commit |
--abort | Merge zurücksetzen |
-X ours | Bei Konflikten HEAD bevorzugen |
-X theirs | Fremd-Branch bevorzugen |
Squash-Beispiel:
bash
git checkout main
git merge --squash feature/search
git commit -m "Add search"Visualisierung
bash
git log --graph --oneline --decorateMergetools
bash
git mergetoolKonfliktprävention
- Häufig pull / rebase
- Kleine, fokussierte Branches
- Formatierung nicht mit Logik mischen
- Einheitliche Lint/Order
- Früh über große Refactors sprechen
Binärkonflikte
bash
git checkout --ours path/to/asset.png
git checkout --theirs path/to/asset.png
git add path/to/asset.pngHäufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| Wiederholte Konflikte | Lang lebender Branch | Früher rebasen/mergen |
| Große Konfliktblöcke | Format + Logik gemischt | Format getrennt committen |
| Unerwarteter Merge-Commit | Policy / Default | git pull --ff-only |
| Verlorene Änderungen | Vor Staging verworfen | git reflog nutzen |
Checkliste vor Merge
- [ ] CI grün
- [ ] Review erfolgt
- [ ] Aktualisiert gegen
main - [ ] Keine Debug-Artefakte / Secrets
- [ ] Saubere Messages
Zusammenfassung
Verstehe Merge-Typ, prüfe anstehende Commits, löse Konflikte präzise, committe klar. Hygiene reduziert Reibung.
Nächste Schritte
- Rebase vs Merge
- Konfliktstrategien
Key Commands
bash
git merge <branch>
git merge --no-ff <branch>
git merge --squash <branch>
git merge --abort
git diff --name-only --diff-filter=U
git log --graph --oneline --decorate