Merge-Konflikte: Was sie sind und wie man mit ihnen umgeht

Avatar of Tobias Günther
Tobias Günther am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Dieser Artikel ist Teil unserer Serie „Erweiterte Git-Kenntnisse“. Folgen Sie Tower auf Twitter oder abonnieren Sie deren Newsletter, um über die nächsten Artikel informiert zu werden.

Merge-Konflikte… Niemand mag sie. Manche fürchten sie sogar. Aber sie sind eine Tatsache im Leben, wenn man mit Git arbeitet, besonders wenn man mit anderen Entwicklern zusammenarbeitet. In den meisten Fällen sind Merge-Konflikte nicht so beängstigend, wie man vielleicht denkt. In diesem vierten Teil unserer Serie „Erweiterte Git-Kenntnisse“ sprechen wir darüber, wann sie auftreten können, was sie tatsächlich sind und wie man sie löst.

Wie und wann Merge-Konflikte auftreten

Der Name verrät es schon: Ein Merge-Konflikt kann auftreten, wenn Sie Änderungen aus einer anderen Quelle in Ihren aktuellen Arbeitszweig integrieren (oder „mergen“). Beachten Sie, dass die Integration nicht nur das Mergen von Zweigen umfasst. Konflikte können auch bei einem Rebase oder einem interaktiven Rebase auftreten, wenn Sie in Git Cherry-Picking betreiben (d. h. wenn Sie einen Commit von einem Zweig auswählen und auf einen anderen anwenden), wenn Sie git pull ausführen oder sogar beim erneuten Anwenden eines Stashs.

All diese Aktionen führen eine Art von Integration durch, und das ist der Zeitpunkt, an dem Merge-Konflikte auftreten können. Natürlich bedeutet das nicht, dass jede dieser Aktionen jedes Mal zu einem Merge-Konflikt führt – Gott sei Dank! Aber wann genau treten Konflikte auf?

Tatsächlich sind die Fusionsfähigkeiten von Git einer seiner größten Vorteile: Das Zusammenführen von Zweigen funktioniert meistens problemlos, da Git in der Regel in der Lage ist, Dinge selbst herauszufinden und zu wissen, wie Änderungen integriert werden.

Es gibt jedoch Situationen, in denen *widersprüchliche* Änderungen vorgenommen werden – und hier kann die Technologie einfach nicht entscheiden, was richtig oder falsch ist. Diese Situationen erfordern eine Entscheidung von einem Menschen. Zum Beispiel, wenn genau dieselbe Codezeile in zwei Commits, auf zwei verschiedenen Zweigen geändert wurde, hat Git keine Möglichkeit zu wissen, welche Änderung Sie bevorzugen. Eine etwas weniger verbreitete Situation: Eine Datei wird in einem Zweig geändert und in einem anderen gelöscht. Git fragt Sie dann, was zu tun ist, anstatt einfach zu raten, was am besten funktioniert.

So erkennen Sie, wann ein Merge-Konflikt aufgetreten ist

Wie erkennen Sie also, ob ein Merge-Konflikt aufgetreten ist? Machen Sie sich keine Sorgen – Git wird es Ihnen sagen und auch Vorschläge zur Lösung des Problems machen. Es wird Ihnen sofort mitteilen, wenn ein Merge oder Rebase fehlschlägt. Wenn Sie beispielsweise Änderungen committet haben, die mit den Änderungen eines anderen Benutzers in Konflikt stehen, informiert Sie Git im Terminal über das Problem und teilt Ihnen mit, dass der automatische Merge fehlgeschlagen ist.

$ git merge develop
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

Sie sehen, dass ich hier auf einen Konflikt gestoßen bin und Git mich sofort über das Problem informiert. Selbst wenn ich diese Meldung übersehen hätte, werde ich beim nächsten Aufruf von git status an den Konflikt erinnert.

Wenn Sie mit einer Git-Desktop-GUI wie Tower arbeiten, stellt die Anwendung sicher, dass Sie keine Konflikte übersehen.

Auf jeden Fall: Machen Sie sich keine Sorgen, dass Sie Merge-Konflikte *nicht* bemerken!

So heben Sie einen Merge-Konflikt auf und beginnen neu

Sie können einen Merge-Konflikt nicht ignorieren – stattdessen müssen Sie ihn beheben, bevor Sie mit Ihrer Arbeit fortfahren können. Grundsätzlich haben Sie die folgenden beiden Optionen:

  • Den Konflikt/die Konflikte lösen
  • Die Aktion, die den/die Konflikt(e) verursacht hat, abbrechen oder rückgängig machen

Bevor wir uns der Lösung von Konflikten widmen, sprechen wir kurz darüber, wie Sie die Aktion rückgängig machen und neu beginnen können (es ist sehr beruhigend zu wissen, dass dies möglich ist). In vielen Fällen ist dies so einfach wie die Verwendung des Parameters --abort, z. B. in Befehlen wie git merge --abort und git rebase --abort. Dies macht den Merge/Rebase rückgängig und stellt den Zustand vor dem Auftreten des Konflikts wieder her.

Dies funktioniert auch dann, wenn Sie bereits mit der Behebung der konfliktbehafteten Dateien begonnen haben, und selbst dann, wenn Sie feststellen, dass Sie in einer Sackgasse stecken, können Sie den Merge immer noch rückgängig machen. Dies sollte Ihnen das Vertrauen geben, dass Sie wirklich nichts falsch machen können. Sie können immer abbrechen, zu einem sauberen Zustand zurückkehren und neu beginnen.

Wie Merge-Konflikte in Git wirklich aussehen

Schauen wir uns an, wie ein Konflikt unter der Haube wirklich aussieht. Es ist an der Zeit, diese kleinen Plagegeister zu entmystifizieren und sie besser kennenzulernen. Sobald Sie einen Merge-Konflikt verstehen, können Sie aufhören, sich Sorgen zu machen.

Als Beispiel betrachten wir den Inhalt einer Datei index.html, die derzeit einen Konflikt aufweist.

Screenshot of an open code editor with HTML markup for a navigation that contains an unordered list of links. There are three lines of text injected by Git, the first says HEAD, the second is a line of equals signs, and the last says develop.

Git markiert die problematischen Bereiche in der Datei freundlicherweise. Sie sind von <<<<<<< und >>>>>>> umgeben. Der Inhalt nach dem ersten Marker stammt aus unserem aktuellen Arbeitszweig (HEAD). Die Zeile mit sieben Gleichheitszeichen (=======) trennt die beiden widersprüchlichen Änderungen. Schließlich werden die Änderungen aus dem anderen Zweig angezeigt (in unserem Beispiel develop).

Ihre Aufgabe ist es, diese Zeilen zu bereinigen und den Konflikt zu lösen: in einem Texteditor, in Ihrer bevorzugten IDE, in einer Git-Desktop-GUI oder in einem Diff & Merge-Tool.

So lösen Sie einen Konflikt in Git

Es spielt keine Rolle, welches Werkzeug oder welche Anwendung Sie zur Behebung eines Merge-Konflikts verwenden – wenn Sie fertig sind, muss die Datei genau so aussehen, wie Sie sie haben möchten. Wenn Sie alleine arbeiten, können Sie sich leicht entscheiden, eine Codeänderung zu verwerfen. Wenn die widersprüchliche Änderung jedoch von jemand anderem stammt, müssen Sie möglicherweise mit dieser Person sprechen, bevor Sie entscheiden, welcher Code beibehalten werden soll. Vielleicht ist es Ihrer, vielleicht ist es der eines anderen, und vielleicht ist es eine Kombination aus beidem.

Der Prozess der Bereinigung der Datei und der Sicherstellung, dass sie enthält, was Sie tatsächlich möchten, muss keine Magie beinhalten. Sie können dies einfach tun, indem Sie Ihren Texteditor oder Ihre IDE öffnen und Ihre Änderungen vornehmen.

Manchmal stellen Sie jedoch fest, dass dies nicht der effizienteste Weg ist. Dann können spezielle Werkzeuge Zeit und Mühe sparen. Es gibt zum Beispiel verschiedene Git-Desktop-GUIs, die bei der Behebung von Merge-Konflikten hilfreich sein können.

Nehmen wir Tower als Beispiel. Es bietet einen speziellen „Konflikt-Assistenten“, der diese ansonsten abstrakten Situationen visuell aufbereitet. Dies hilft, besser zu verstehen, woher die Änderungen stammen, welche Art von Modifikation aufgetreten ist und letztendlich die Situation zu lösen.

Besonders bei komplizierteren Konflikten kann es großartig sein, ein spezielles Diff & Merge-Tool zur Hand zu haben. Es kann Ihnen helfen, Diffs noch besser zu verstehen, indem es erweiterte Funktionen wie spezielle Formatierung und verschiedene Darstellungsmodi (z. B. nebeneinander, in einer einzigen Spalte zusammengefasst usw.) bietet.

Es gibt mehrere Diff & Merge-Tools auf dem Markt (hier sind einige für Mac und für Windows). Sie können Ihr bevorzugtes Tool mit dem Befehl git config konfigurieren. (Konsultieren Sie die Dokumentation des Tools für detaillierte Anweisungen.) Im Falle eines Konflikts können Sie es aufrufen, indem Sie einfach git mergetool eingeben. Als Beispiel verwende ich die Kaleidoscope-App auf meinem Mac.

Nachdem Sie die Datei bereinigt haben – entweder manuell in einem Texteditor, in einer Git-Desktop-GUI oder mit einem Merge-Tool – können Sie die Datei wie jede andere Änderung committen. Indem Sie git add <Dateiname> eingeben, informieren Sie Git, dass der Konflikt behoben wurde.

Wenn alle Merge-Konflikte gelöst und dem Staging-Bereich hinzugefügt wurden, erstellen Sie einfach einen regulären Commit. Und damit ist die Konfliktlösung abgeschlossen.

Keine Panik!

Wie Sie sehen, ist ein Merge-Konflikt nichts, worüber Sie sich Sorgen machen müssen und schon gar kein Grund zur Panik. Sobald Sie verstehen, was *tatsächlich* passiert ist, um den Konflikt zu verursachen, können Sie entscheiden, die Änderungen rückgängig zu machen oder den Konflikt zu lösen. Denken Sie daran, dass Sie nichts kaputt machen können – selbst wenn Sie feststellen, dass Sie bei der Behebung eines Konflikts einen Fehler gemacht haben, können Sie ihn immer noch rückgängig machen: Rollen Sie einfach zum Commit vor der großen Katastrophe zurück und beginnen Sie erneut.

Wenn Sie tiefer in erweiterte Git-Tools eintauchen möchten, schauen Sie sich gerne mein (kostenloses!) „Advanced Git Kit“ an: Es ist eine Sammlung von kurzen Videos zu Themen wie Branching-Strategien, Interactive Rebase, Reflog, Submodules und vielem mehr.