Zum Inhalt springen
Git & GitHub Anfänger 30 min

Merge-Konflikte lösen

Lerne, wie Merge-Konflikte entstehen und wie du sie sicher und sauber löst - Schritt für Schritt.

Aktualisiert:

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:

  1. Zwei Branches die gleiche Zeile in der gleichen Datei aendern
  2. Git nicht weiss, welche Aenderung die richtige ist
  3. 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
MarkerBedeutung
<<<<<<< HEADBeginn des Konflikts - deine Version (aktueller Branch)
=======Trennlinie zwischen den beiden Versionen
>>>>>>> branch-nameEnde 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
ButtonAktion
Accept Current ChangeBehalt deine Version
Accept Incoming ChangeUebernimm die andere Version
Accept Both ChangesBehalte beide (untereinander)
Compare ChangesZeige 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

  1. Erzeuge absichtlich einen Merge-Konflikt und loese ihn
  2. Loese den gleichen Konflikt nochmal, aber uebernimm die andere Version
  3. Uebe das Abbrechen eines Merges mit git merge --abort
  4. Erzeuge einen Konflikt in zwei Dateien gleichzeitig und loese beide
  5. 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 add und git commit
  • git merge --abort bricht 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.

Zurück zum Git & GitHub Kurs