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
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
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 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