Ein Durchlauf des Tutorials Merge-Konflikte lösen: warum das Mergen von Alices Änderung mit Ihrer kollidiert, wie Sie die Konfliktmarker lesen und den Merge abschließen.
Dieses Szenario versetzt Sie in eine sehr verbreitete Teamsituation: Sie und ein Teammitglied haben dieselbe Zeile geändert, und Git braucht Ihre Hilfe, beides zu kombinieren. Sie holen die Arbeit Ihres Teammitglieds, mergen sie in Ihren Branch, lösen den Konflikt von Hand und schließen den Merge ab.
Die Situation
Git mergt Änderungen an verschiedenen Zeilen von selbst; dieselbe Zeile auf beiden Seiten geändert ist ein Konflikt.
Sie sind auf dem Branch feature/update-subtitle und haben dort den Hero-Untertitel in index.html umgeschrieben. Inzwischen hat Ihre Kollegin Alice ihre eigene Änderung an genau dieser Untertitel-Zeile auf main gepusht.
Zwei verschiedene Edits derselben Zeile auf zwei Branches. Git kann Änderungen an unterschiedlichen Stellen fast-forwarden oder automatisch mergen, aber wenn beide Seiten dieselbe Zeile ändern, kann es nicht raten, welche gewinnt. Das ist ein Merge-Konflikt, und nur Sie können das Ergebnis bestimmen.
Ein Konflikt ist kein Fehler Ihrerseits. Es ist Git, das pausiert, damit ein Mensch entscheidet, weil beide Bearbeitungen für sich genommen valide sind.
Schritt für Schritt durchgehen
Einen Konflikt lösen: die Datei bearbeiten, stagen, dann commiten.
main aktuell holen
git checkout main
git pull
Auf main wechseln und pullen bringt Alices Untertitel-Änderung vom Remote, sodass Ihr lokales main ihre Arbeit hat.
main in Ihren Feature-Branch mergen
git checkout feature/update-subtitle
git merge main
Git versucht, Alices Untertitel-Zeile mit Ihrer zu kombinieren, scheitert genau an dieser Zeile und meldet einen Konflikt in index.html. Der Merge hält hier an.
Die Datei öffnen und die Marker lesen
Der Konfliktbereich sieht so aus:
<<<<<<< HEAD
Ihre Version des Untertitels
=======
Alices Version des Untertitels
>>>>>>> main
HEAD ist Ihr Branch; der Teil nach ======= ist die eingehende Änderung von main.
Lösen und den Merge abschließen
git add index.html
git commit
Bearbeiten Sie index.html, sodass nur der eine, finale Untertitel enthalten ist, und löschen Sie die Zeilen <<<<<<<, ======= und >>>>>>>. Die Datei zu stagen sagt Git, dass der Konflikt erledigt ist, und der Commit hält den Merge fest.
Konfliktmarker lesen
Die drei Marker und die zwei Seiten, die sie umschließen.
Die drei Marker erscheinen immer in derselben Reihenfolge:
<<<<<<< HEAD bis ======= ist Ihre Seite.
======= bis >>>>>>> ist die eingehende Seite.
- Lösen heißt, den gewünschten Inhalt zu lassen und alle drei Markerzeilen zu entfernen.
git status listet während eines Konflikts die noch zu lösenden Dateien unter „Unmerged paths". Wenn diese Liste leer ist, können Sie commiten.
Lassen Sie keine Markerzeile in der Datei. Ein vergessenes ======= wird als echter Inhalt commitet und macht die Seite kaputt. Suchen Sie vor dem Stagen in der Datei nach den Markern.
Wenn Sie neu anfangen möchten
Wenn eine Auflösung außer Kontrolle gerät, können Sie den gesamten Merge abbrechen und in den Zustand davor zurückkehren:
git merge --abort
Merge-Konflikt-Befehle, die Sie wirklich brauchen
Über dieses Szenario hinaus sind dies die Befehle, die jedes Mal auftauchen, wenn Sie auf einen Konflikt stoßen:
- Sehen, welche Dateien im Konflikt stehen —
git status oder git diff --name-only --diff-filter=U für nur die Liste
- Den Konflikt öffnen — die Datei bearbeiten und die Marker
<<<<<<<, =======, >>>>>>> entfernen, den finalen Wortlaut behalten
- Eine Seite einer Datei komplett übernehmen —
git checkout --ours <file> (Ihr Branch) oder git checkout --theirs <file> (der eingehende Branch), dann git add <file>
- Den Merge abschließen — die gelösten Dateien mit
git add stagen, dann git commit (oder git merge --continue)
- Aufgeben und zurückgehen —
git merge --abort stellt den Zustand von vor dem Merge wieder her
Am schnellsten fühlen Sie sich sicher, wenn Sie hier im Terminal absichtlich einen Konflikt erzeugen und ihn auf ein paar verschiedene Arten lösen: von Hand, mit --ours und mit --theirs.