Merge-Konflikte lösen
Lerne, wie Merge-Konflikte entstehen und wie du sie sicher und sauber löst - Schritt für Schritt.
Merge-Konflikte klingen beaengstigend, sind aber voellig normal und gehoeren zum Alltag mit Git. Sie entstehen, wenn zwei Branches die gleiche Stelle im Code aendern und Git nicht automatisch entscheiden kann, welche Version richtig ist. In diesem Kapitel lernst du, Konflikte sicher zu loesen.
Wie entstehen Merge-Konflikte?
Ein Konflikt entsteht, wenn:
- Zwei Branches die gleiche Zeile in der gleichen Datei aendern
- Git nicht weiss, welche Aenderung die richtige ist
- Git dich um Hilfe bittet
Beispiel: So entsteht ein Konflikt
main: <h1>Willkommen</h1> → <h1>Willkommen auf meiner Seite</h1>
feature: <h1>Willkommen</h1> → <h1>Hallo und Willkommen!</h1>
Beide Branches haben die gleiche Zeile unterschiedlich geaendert. Git kann nicht wissen, welche Version du behalten moechtest.
Wann gibt es KEINE Konflikte?
- Zwei Branches aendern verschiedene Dateien
- Zwei Branches aendern verschiedene Stellen in der gleichen Datei
- Nur ein Branch aendert eine Datei, der andere nicht
Einen Konflikt provozieren
Lass uns absichtlich einen Konflikt erzeugen, damit du lernst, ihn zu loesen:
# Neues Projekt erstellen
mkdir konflikt-demo
cd konflikt-demo
git init
# Startdatei erstellen
cat > index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<title>Meine Seite</title>
</head>
<body>
<h1>Willkommen</h1>
<p>Dies ist meine Webseite.</p>
</body>
</html>
EOF
git add index.html
git commit -m "Initiale Webseite erstellt"
Branch A aendert die Ueberschrift
git switch -c feature/neuer-titel
# Ueberschrift aendern
# Aendere <h1>Willkommen</h1> zu <h1>Hallo und Willkommen!</h1>
git add index.html
git commit -m "feat: Ueberschrift geaendert"
Branch B (main) aendert ebenfalls die Ueberschrift
git switch main
# Gleiche Zeile anders aendern
# Aendere <h1>Willkommen</h1> zu <h1>Willkommen auf meiner Seite</h1>
git add index.html
git commit -m "feat: Ueberschrift aktualisiert"
Merge ausloesen
git merge feature/neuer-titel
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Git sagt uns klar: Es gibt einen Konflikt in index.html!
Konflikte erkennen
git status zeigt Konflikte
git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -m")
Konflikte in der Datei
Oeffne index.html in deinem Editor:
<!DOCTYPE html>
<html>
<head>
<title>Meine Seite</title>
</head>
<body>
<<<<<<< HEAD
<h1>Willkommen auf meiner Seite</h1>
=======
<h1>Hallo und Willkommen!</h1>
>>>>>>> feature/neuer-titel
<p>Dies ist meine Webseite.</p>
</body>
</html>
Die Konflikt-Marker verstehen
<<<<<<< HEAD
Deine Aenderung (aktueller Branch = main)
=======
Deren Aenderung (eingehender Branch = feature/neuer-titel)
>>>>>>> feature/neuer-titel
| Marker | Bedeutung |
|---|---|
<<<<<<< HEAD | Beginn des Konflikts - deine Version (aktueller Branch) |
======= | Trennlinie zwischen den beiden Versionen |
>>>>>>> branch-name | Ende des Konflikts - eingehende Version |
Konflikte loesen - Schritt fuer Schritt
Schritt 1: Entscheide, was bleiben soll
Du hast vier Optionen:
Option A: Deine Version behalten
<h1>Willkommen auf meiner Seite</h1>
Option B: Ihre Version behalten
<h1>Hallo und Willkommen!</h1>
Option C: Beide kombinieren
<h1>Hallo und Willkommen auf meiner Seite!</h1>
Option D: Etwas voellig Neues schreiben
<h1>Willkommen bei Max Mustermann</h1>
Schritt 2: Konflikt-Marker entfernen
Entferne die Marker <<<<<<<, ======= und >>>>>>> und behalte nur den gewuenschten Code:
<!DOCTYPE html>
<html>
<head>
<title>Meine Seite</title>
</head>
<body>
<h1>Hallo und Willkommen auf meiner Seite!</h1>
<p>Dies ist meine Webseite.</p>
</body>
</html>
Schritt 3: Geloeste Datei stagen
git add index.html
Schritt 4: Merge-Commit erstellen
git commit -m "Merge: Ueberschriften-Konflikt geloest"
[main e5f6a7b] Merge: Ueberschriften-Konflikt geloest
Schritt 5: Ergebnis pruefen
git log --oneline --graph
* e5f6a7b (HEAD -> main) Merge: Ueberschriften-Konflikt geloest
|\
| * b2c3d4e (feature/neuer-titel) feat: Ueberschrift geaendert
* | a1b2c3d feat: Ueberschrift aktualisiert
|/
* 5c2a1b3 Initiale Webseite erstellt
Konflikte mit VS Code loesen
VS Code erkennt Merge-Konflikte automatisch und zeigt hilfreiche Buttons:
<<<<<<< HEAD (Current Change)
<h1>Willkommen auf meiner Seite</h1>
=======
<h1>Hallo und Willkommen!</h1>
>>>>>>> feature/neuer-titel (Incoming Change)
Accept Current Change | Accept Incoming Change | Accept Both Changes | Compare Changes
| Button | Aktion |
|---|---|
| Accept Current Change | Behalt deine Version |
| Accept Incoming Change | Uebernimm die andere Version |
| Accept Both Changes | Behalte beide (untereinander) |
| Compare Changes | Zeige die Unterschiede nebeneinander |
Merge abbrechen
Wenn du unsicher bist oder die Konflikte zu komplex sind:
git merge --abort
Das setzt alles auf den Zustand vor dem Merge zurueck. Du kannst es spaeter nochmal versuchen.
Konflikte mit Kommandozeilen-Tools loesen
Nur ihre Version uebernehmen
git checkout --theirs index.html
git add index.html
Nur deine Version behalten
git checkout --ours index.html
git add index.html
Merge-Tool verwenden
git mergetool
Git oeffnet ein grafisches Tool (falls konfiguriert), das die Konflikte visuell darstellt.
# VS Code als Merge-Tool konfigurieren
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
Konflikte in mehreren Dateien
Bei groesseren Merges kann es Konflikte in mehreren Dateien geben:
git status
Unmerged paths:
both modified: index.html
both modified: style.css
both modified: script.js
Loesung: Jede Datei einzeln bearbeiten und stagen:
# 1. index.html loesen und stagen
# ... Konflikte in index.html bearbeiten ...
git add index.html
# 2. style.css loesen und stagen
# ... Konflikte in style.css bearbeiten ...
git add style.css
# 3. script.js loesen und stagen
# ... Konflikte in script.js bearbeiten ...
git add script.js
# 4. Merge-Commit erstellen
git commit -m "Merge: Konflikte in HTML, CSS und JS geloest"
Konflikte vermeiden
1. Kleine, fokussierte Branches
Je kleiner ein Branch, desto unwahrscheinlicher sind Konflikte:
# Gut: Ein kleiner, fokussierter Branch
git switch -c fix/navigation-link
# Eine Aenderung, schnell mergen
# Schlecht: Ein riesiger Branch mit vielen Aenderungen
git switch -c feature/komplettes-redesign
# Wochenlange Arbeit, garantiert Konflikte
2. Regelmaessig main mergen
Halte deinen Feature-Branch aktuell:
git switch feature/navigation
git merge main
# Kleine Konflikte frueh loesen, statt grosse spaeter
3. Kommunikation im Team
Sprecht ab, wer an welchen Dateien arbeitet. Viele Konflikte lassen sich durch gute Kommunikation vermeiden.
4. Klare Code-Struktur
Wenn jede Funktion in einer eigenen Datei liegt, gibt es weniger Konflikte als wenn alles in einer Datei steht.
Uebungen
- Erzeuge absichtlich einen Merge-Konflikt und loese ihn
- Loese den gleichen Konflikt nochmal, aber uebernimm die andere Version
- Uebe das Abbrechen eines Merges mit
git merge --abort - Erzeuge einen Konflikt in zwei Dateien gleichzeitig und loese beide
- Nutze VS Code, um einen Konflikt mit den eingebauten Buttons zu loesen
Was kommt als Naechstes?
Im naechsten Kapitel geht es um GitHub! Du lernst, wie du ein Konto erstellst, dein erstes Repository auf GitHub anlegst und deinen lokalen Code in die Cloud bringst.
Zusammenfassung
- Merge-Konflikte entstehen, wenn die gleiche Zeile in zwei Branches unterschiedlich geaendert wird
- Konflikte werden durch Marker (
<<<<<<<,=======,>>>>>>>) in der Datei angezeigt - Du loest Konflikte, indem du den gewuenschten Code behaltst und die Marker entfernst
- Nach dem Loesen:
git addundgit commit git merge --abortbricht einen Merge sicher ab- VS Code bietet komfortable Buttons zum Loesen von Konflikten
- Kleine Branches und regelmaessiges Mergen vermeiden Konflikte
Pro-Tipp: Merge-Konflikte sind kein Zeichen dafuer, dass du etwas falsch gemacht hast! Sie sind ein normaler Teil der Teamarbeit. Je oefter du sie loest, desto routinierter wirst du. Uebe absichtlich das Erzeugen und Loesen von Konflikten - dann schrecken sie dich im echten Projekt nicht mehr.