20. August 2013

Merge-Konflikte beheben

Git führt beim Merge Änderungen automatisch zusammen, sofern unterschiedliche Dateien oder unterschiedliche Stellen in der selben Datei betroffen sind. Wurden in beiden Branches Änderungen an denselben Code-Zeilen committet, führt dies beim Merge zum Konflikt:

CONFLICT (content): Merge conflict in somefile.txt
Automatic merge failed; fix conflicts and then commit the result.

git versieht dann die konfliktbehafteten Stellen in den Dateien mit Markern - oben steht der aktive Branch, unten der zu mergende Branch:

<<<<<<< HEAD:somefile.txt
this change was done in master
=======
this change was done in newfeature
>>>>>>> newfeature:somefile.txt

Um den Merge abzuschließen, müssen die Konflikte behoben, die Marker entfernt, die Dateien dem Index hinzugefügt und die Änderungen committet werden.

edit somefile.txt
git add somefile.txt
git commit

Dabei ist zu beachten, dass Git währenddessen im Merge-Modus ist, zu erkennen am Kommandozeilen-Prompt. Dieser Modus wird erst wieder verlassen, wenn der Merge durchgeführt wurde; keinesfalls sollte man in diesem Zustand weiterarbeiten. Alternativ kann der Merge abgebrochen werden mit:

$ git merge --abort

Praktischerweise ist wiederholtes Mergen bei Git kein Problem. Da die bereits erfolgten Merges in der Historie dokumentiert sind, wird git nur die noch fehlenden Commits übernehmen.

Merge-Tools

Mit git mergetool können konfliktbehaftete Dateien im Working Tree an ein externes Tool übergeben werden. Dabei werden eine Vielzahl von Tools unterstützt:

$ git mergetool --tool-help
'git mergetool --tool=<tool>' may be set to one of the following:
        emerge, opendiff, vimdiff, vimdiff2, araxis, bc3, codecompare,
        deltawalker, diffuse, ecmerge, gvimdiff, gvimdiff2, kdiff3, meld,
        p4merge, tkdiff, tortoisemerge, xxdiff

Zum Beispiel:

$ git mergetool --tool=p4merge

p4merge als git mergetool

Mit git config kann ein Standard-Mergetool festgelegt werden:

$ git config --global merge.tool <mergetool>

Weitere Informationen

Aufgaben

  1. Wechseln Sie zum master-Branch und mergen Sie bug1, bug2 und feature1.