Lösen von Mergekonflikten

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

Bei Ausführung eines Merge- oder Rebasevorgangs wird Git aufgefordert, Änderungen, die in einem Branch vorgenommen wurden, mit Änderungen an einem anderen Branch zu kombinieren. Häufig führt Git einen Merge- oder Rebasevorgang automatisch ohne Ihre Unterstützung durch. Wenn Git jedoch feststellt, dass eine Änderung, die in einem Branch vorgenommen wurde, einer Änderung in einem anderen Branch widerspricht, werden Sie aufgefordert, den Konflikt zu lösen. Ein Mergekonflikt kann auftreten, wenn eine Dateizeile in den zusammengeführten Branches unterschiedlich bearbeitet wurde oder wenn ein Branch eine Datei ändert und ein anderer Branch sie löscht. Die Vorgehensweise zum Auflösen von Mergekonflikten gilt sowohl für Git Merge als auch für Git Rebase.

Sie können Mergekonflikte in Visual Studio oder über Befehlszeile mit einem beliebigen Text-Editor lösen.

Eine Übersicht über den Git-Workflow finden Sie im Azure Repos Git-Tutorial.

Dieser Artikel enthält Erläuterungen zu Verfahren für die folgenden Aufgaben:

  • Grundlegendes zu Mergekonflikten
  • Lösen von Mergekonflikten

Grundlegendes zu Mergekonflikten

Git Merge oder Git Rebase integriert Commits aus einem Quellbranch in Ihren aktuellen lokalen Branch (Zielbranch). Git Merge führt entweder einen Fast-Forward- oder No-Fast-Forward-Mergevorgang aus. Der No-Fast-Forward-Mergevorgang wird auch als Drei-Weg-Merge oder echter Mergevorgang bezeichnet. Git Rebase ist ein andere Art von Merge. Diese Mergetypen sind im folgenden Diagramm dargestellt.

Diagramm: Vor und nach dem Commit bei Verwendung von Git Merge und Git Rebase.

Wenn für Git Merge die Spitze des Zielbranchs im Quellbranchs vorhanden ist, wird standardmäßig ein Fast-Forward Mergevorgang ausgeführt. Andernfalls wird standardmäßig ein No-Fast-Forward-Mergevorgang ausgeführt.

Bei einem Fast-Forward-Merge kann es nie zu einem Mergekonflikt kommen, da Git keinen Fast-Forward-Mergevorgang anwendet, wenn die Spitze des Zielbranchs vom Quellbranch abweicht. Standardmäßig verwendet Git nach Möglichkeit ein Fast-Forward-Merge. Git wendet z. B. ein Fast-Forward-Merge auf einen lokalen Branch an, den Sie lediglich durch Pullen aus dem entsprechenden Remotebranch aktualisieren.

Bei einem No-Fast-Forward-Merge wird ein neuer „Mergecommit“ des Zielbranchs generiert, der Änderungen im Quellbranch in Änderungen des Zielbranchs integriert. Die anwendbaren Änderungen sind die Änderungen, die nach dem letzten, für beide Branches gemeinsamen Commit vorgenommen wurden. Im obigen Diagramm ist Commit C das letzte gemeinsame Commit in beiden Branches. Wenn eine Quellbranchänderung einer Zielbranchänderung widerspricht, fordert Git Sie auf, den Mergekonflikt zu beheben. Der Mergecommit (L) enthält die integrierten Quellbranch- und Zielbranchänderungen. Die Quell- und Zielbranchspitzen (K und E) sind die übergeordneten Elemente des Mergecommits. Im Commitverlauf Ihres Branchs ist ein Mergecommit ein nützlicher Marker für einen Mergevorgang, der deutlich zeigt, welche Branches zusammengeführt wurden.

Bei einem Git Rebase wird der Commitverlauf des Zielbranchs neu sequenziert, sodass er alle Commits im Quellbranch gefolgt von allen Commits im Zielbranch seit dem letzten gemeinsamen Commit enthält. Im obigen Diagramm ist Commit C das letzte gemeinsame Commit in beiden Branches. Eine weitere Möglichkeit dafür besteht darin, dass ein Rebasevorgang die Änderungen in Ihrem Zielbranch über dem Quellbranchverlauf wiederholt. Wenn eine Quellbranchänderung einer Zielbranchänderung widerspricht, fordert Git Sie auf, den Mergekonflikt zu beheben. Wie beim Fast-Forward-Merge wird beim Rebase kein Mergecommit erstellt. Insbesondere ändert eine Rebasevorgang die Reihenfolge der vorhandenen Commits im Zielbranch, was bei den anderen Mergestrategien nicht der Fall ist. Im obigen Diagramm enthält Commit K' die gleichen Änderungen wie K, verfügt aber über eine neue Commit-ID, da er mit dem Commit E anstelle von C verknüpft ist.

Bei Git Merge und Git Rebase wird nur der Zielbranch geändert. Der Quellbranch bleibt unverändert. Wenn dabei ein Mergekonflikt auftritt, müssen Sie diesen auflösen, um den Merge- oder Rebasevorgang durchzuführen. Alternativ können Sie den Merge-/Rebasevorgang abbrechen und den Zielbranch in den vorherigen Zustand zurücksetzen.

Weitere Informationen zu Mergeoptionen und -strategien finden Sie im Git-Referenzhandbuch und in der Dokumentation zu Git-Mergestrategien.

Gründe für das Lösen von Mergekonflikten

Git Merge und Git Rebase werden im Git-Workflow ausgiebig verwendet. Bei der Arbeit an einem lokalen Featurebranch oder Bugfixbranch haben sich folgende Verfahren bewährt:

  1. Halten Sie Ihren lokalen main-Branch mit dem seinem entsprechenden Remoterepository auf dem aktuellen Stand, indem Sie regelmäßig pullen, um Remotecommits abzurufen und zusammenzuführen.
  2. Integrieren Sie lokale main-Branchaktualisierungen mit einem Rebase oder Merge in Ihren lokalen Featurebranch.
  3. Sichern Sie Ihre Arbeit im lokalen Featurebranch, indem Sie sie an den entsprechenden Remotebranch pushen.
  4. Erstellen Sie nach Fertigstellung des Features einen Pull Request, um den Remotefeaturebranch mit dem main-Remotebranch zusammenzuführen.

Durch die häufige Integration von Remoteänderungen in Ihr lokales Repository sind Sie stets über die letzten Arbeiten anderer Personen informiert, sodass Sie auftretende Mergekonflikte umgehend lösen können.

Lösen von Mergekonflikten

Die Vorgehensweise zum Auflösen von Mergekonflikten gilt sowohl für Git Merge als auch für Git Rebase. Obwohl in den folgenden Schritten beschrieben wird, wie Mergekonflikte bei einem Mergevorgang gelöst werden, können Sie Mergekonflikte bei einem Rebasevorgang auf ähnliche Weise lösen.

Tipp

Wenn es sich bei dem Quellbranch um einen Remotenachverfolgungsbranch handelt, muss sichergestellt sein, dass der Branch auf dem neuesten Stand ist, indem Sie vor einem Merge ein Git Fetch ausführen. Sie können auch den Git Pull-Befehl ausführen, der ein Git Fetch mit einem Git Merge kombiniert.

Visual Studio 2022 bietet Git-Versionskontrolle mithilfe des Git-Menüs, Git-Änderungen sowie über Kontextmenüs im Projektmappen-Explorer. Visual Studio 2019, Version 16.8, bietet auch die Team Explorer-Git-Benutzeroberfläche. Weitere Informationen finden Sie auf der Registerkarte Visual Studio 2019 – Team Explorer.

  1. Checken Sie den Zielbranch im Bereich Branches im Fenster Git-Repository aus. Klicken Sie dann mit der rechten Maustaste auf den Quellbranch, und wählen Sie Mergen von <Quellbranch> in <Zielbranch> aus.

    Screenshot: Option „Mergen“ im Branchkontextmenü im Fenster „Git-Repository“ von Visual Studio.

  2. Visual Studio benachrichtigt Sie, wenn Git den Mergevorgang aufgrund von Konflikten angehalten hat. In diesem Fall können Sie entweder die Konflikte lösen oder den Mergevorgang abbrechen und zum Zustand vor dem Mergevorgang zurückkehren. Im Abschnitt Nicht gemergte Änderungen im Fenster Git-Änderungen wird die Liste der Dateien mit Mergekonflikten angezeigt. Doppelklicken Sie bei einer Datei mit Mergekonflikten in ihrem Inhalt auf die Datei, um sie im Merge-Editor zu öffnen.

    Screenshot: Dateien mit Mergekonflikten im Fenster „Git-Änderungen“ von Visual Studio.

  3. Im Merge-Editor werden im Bereich Eingehend die Version der Quellbranchdatei, im Bereich Aktuell die Version der Zielbranchdatei und im Bereich Ergebnis die resultierende Mergedatei angezeigt. Um bestimmte Quell- oder Zielbranchänderungen anzuwenden, aktivieren Sie das Kontrollkästchen neben den in Konflikt stehenden Zeilen, die Sie beibehalten möchten. Sie können die Mergedatei auch direkt im Bereich Ergebnis bearbeiten. Wählen Sie Merge akzeptieren aus, nachdem Sie alle Mergekonflikte in der aktuellen Datei behoben haben. Wiederholen Sie diesen Schritt für jede Datei mit Inhaltskonflikten.

    Screenshot: Merge-Editor in Visual Studio.

  4. Klicken Sie für eine Datei, die in einem Branch bearbeitet und im anderen gelöscht wurde, mit der rechten Maustaste auf die Datei, und wählen Sie die gewünschte Branchaktion aus.

    Screenshot: Kontextmenüs für eine Datei mit Konflikt im Fenster „Git-Änderungen“ von Visual Studio.

  5. Geben Sie im Fenster „Git-Änderungen“ eine Commitnachricht ein, und wählen Sie Gestaffelt committen aus, um den Mergevorgang durchzuführen, nachdem Sie alle Mergekonflikte für alle Dateien behoben haben.

    Screenshot: Commitnachricht und Schaltfläche „Gestaffelt committen“ im Fenster „Git-Änderungen“ in Visual Studio.

Nächste Schritte