Merge-Konflikte
Kurz: Tritt in Git auf, wenn zwei Änderungen dieselbe Codezeile unterschiedlich verändert haben und Git nicht automatisch entscheiden kann, welche Version gilt.
Genauer: Passiert typischerweise beim Zusammenführen (“Merge”) zweier Branches. Git markiert die betroffenen Stellen im Code mit Konflikt-Markern (<<<<<<<, =======, >>>>>>>), und ein Mensch muss manuell entscheiden, welche Änderung übernommen wird, bevor der Merge abgeschlossen werden kann.
Im Detail
Konflikt-Marker lesen
<<<<<<< HEAD
const rabatt = 0.10;
=======
const rabatt = 0.15;
>>>>>>> feature/neuer-rabatt
Der Bereich zwischen <<<<<<< HEAD und ======= zeigt die Version im aktuellen Branch (meist der, in den gerade gemergt wird), der Bereich zwischen ======= und >>>>>>> <branch-name> die eingehende Version aus dem anderen Branch. Git kann Änderungen automatisch zusammenführen, solange sie unterschiedliche Zeilen betreffen — nur wenn dieselbe Zeile (oder direkt benachbarte Zeilen) auf beiden Seiten verändert wurde, kann Git nicht selbst entscheiden, welche Version “richtig” ist, und markiert die Stelle als Konflikt.
Konflikt auflösen
Der Entwickler muss dann manuell entscheiden: eine Seite komplett behalten, beide Änderungen sinnvoll kombinieren, oder etwas ganz Neues schreiben, das beide ursprünglichen Absichten berücksichtigt. Anschließend werden die Konflikt-Marker selbst entfernt (sie sind reiner Text, den Git nicht automatisch löscht) und der Stand als gelöst markiert (git add auf die betroffene Datei, dann git commit um den Merge abzuschließen). Moderne Code-Editoren (VS Code, IntelliJ) bieten dafür oft eine grafische Oberfläche mit Buttons wie “Accept Current”, “Accept Incoming” oder “Accept Both”, die das manuelle Bearbeiten der Marker überflüssig macht.
Ursachen und Vorbeugung
Konflikte häufen sich vor allem bei:
- Langlebigen Branches: die sich weit vom Hauptbranch entfernt haben, sodass beim finalen Merge viele unabhängige Änderungen aufeinandertreffen.
- Paralleler Arbeit an denselben Codestellen: mehrere Personen bearbeiten dieselbe Funktion/Datei gleichzeitig, ohne voneinander zu wissen.
- Automatisch formatiertem Code: wenn ein Code-Formatter (Prettier, Black) große Teile einer Datei umformatiert, erscheint praktisch die ganze Datei als “geändert”, was Konflikte mit anderen parallelen Änderungen wahrscheinlicher macht.
Häufiges, kleinschrittiges Mergen/Rebasen (den eigenen Branch regelmäßig mit dem aktuellen Hauptbranch synchronisieren, statt erst nach Wochen) hält die Diffs klein und reduziert damit sowohl die Wahrscheinlichkeit als auch die Komplexität von Konflikten — ein großer, seltener Merge nach Wochen isolierter Arbeit ist fast garantiert konfliktreicher als viele kleine, regelmäßige.