Strategien zur Lösung von Git-Konflikten
Einführung
Konflikte sind unvermeidlich in kollaborativer Entwicklung. Dieser Leitfaden geht über Grundlagen hinaus: Muster, Entscheidungslogik und Tooling für schnelle, sichere Auflösung.
Konflikttypen
| Typ | Beispiel | Ursache |
|---|---|---|
| Content | Gleiche Zeilen geändert | Parallele Edits |
| Add/Delete | Datei in einem gelöscht, im anderen geändert | Divergierende Refactors |
| Rename/Edit | Umbenannt + editiert | Asynchrone Großänderung |
| Binary | Bild beidseitig geändert | Nicht zeilenweise verschmelzbar |
| Directory/File | Verzeichnis ↔ Datei | Struktur-Umbau |
Allgemeiner Ablauf
Erkennen → Klassifizieren → Intention klären → Zusammenführen / wählen → Testen → CommitSchnelle Inspektion
bash
git status
git diff --name-only --diff-filter=U
git diff --mergeOurs vs Theirs
bash
# Unsere Version behalten
git checkout --ours path/file.txt
# Deren Version behalten
git checkout --theirs path/file.txt
git add path/file.txtSparsam nutzen – fachliche Korrektheit prüfen.
Strukturierte manuelle Zusammenführung
- Beide Seiten vollständig lesen
- Intention identifizieren (Fachlogik, Format, Hotfix?)
- Zielverhalten rekonstruieren
- Marker entfernen & Tests ausführen
git add→ Commit-Fortsetzung
Vorbeugung durch kleinere Commits
bash
git add -pGranulare, kohärente Commits reduzieren Konfliktfläche.
Strategisches Rebase für Langläufer
bash
git fetch origin
git rebase origin/mainTools
| Tool | Kommando | Hinweis |
|---|---|---|
| VS Code | Merge-Editor | Klarer Vergleich |
| Meld | git mergetool | Visuelle Diff/Merge |
| Beyond Compare | git mergetool | Kommerziell |
| IntelliJ | Gruppiert Konflikte | IDE-integriert |
Konfliktmarker-Beispiel
<<<<<<< HEAD (current: main)
applyDiscount(cart, 0.10)
=======
applyDiscount(cart, discountRate())
>>>>>>> feature/dynamic-discountEntscheidung: Dynamik mit Fallback:
js
applyDiscount(cart, discountRate() ?? 0.10)Binärkonflikte
bash
git checkout --theirs assets/logo.png
git add assets/logo.pngOder Asset regenerieren.
Abbrechen / Fortsetzen
bash
git merge --abort
git rebase --abort
git rebase --continueRerere (Reuse Recorded Resolution)
bash
git config --global rerere.enabled trueMerkt sich Lösungen und wendet sie wieder an.
Präventive Maßnahmen
| Technik | Nutzen |
|---|---|
| Einheitliches Formatting | Stil-Diffs weg |
| Kleine PRs | Weniger Überlappung |
| Frühe Branch-Synchronisation | Geringere Divergenz |
| Architektur-Abstimmung | Doppelarbeit verhindern |
| Feature Flags | Frühes Mergen unfertiger Arbeit |
Sicherheitsnetz
bash
./run-tests.sh
git diff --checkSchlechte Auflösung zurücknehmen
bash
git reflog
git reset --hard <hash>Zusammenfassung
Konflikte signalisieren parallele Innovation. Mit Systematik, Hygiene und Tools schrumpfen sie zu kleinen Unterbrechungen.
Nächste Schritte
- Undo-Strategien (
git-reset-revert-and-checkout-explained.md) - Temporäre Änderungen (
git-stash-and-temporary-changes.md)
Key Commands
bash
git diff --name-only --diff-filter=U
git checkout --ours <file>
git checkout --theirs <file>
git merge --abort
git rebase --continue