Anwenden von Änderungen durch einen Rebase

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019 | TFS 2018

Visual Studio 2019 | Visual Studio 2022

Git verwaltet automatisch einen Verlauf Ihrer Entwicklungen in einem Branch, indem jeder neue Commit mit seinem Vorgänger verknüpft wird. Wenn Sie einen Branch mit einem anderen mergen, kann der Verlauf unübersichtlicher werden. Beispiel: Ein No-Fast-Forward-Merge kombiniert divergente Entwicklungslinien, indem ein Mergecommit mit mehreren Vorgängern erstellt wird. Umgekehrt kombiniert ein Git Rebase-Befehl divergente Entwicklungslinien, ohne einen Mergecommit zu erstellen, was zu einem einfacheren Commitverlauf führt, im Endeffekt allerdings weniger Informationen zum Merge enthält. Welchen Mergetyp Sie auswählen, hängt wahrscheinlich davon ab, ob Sie eine Aufzeichnung des Mergevorgangs beibehalten oder den Commitverlauf vereinfachen möchten.

In diesem Artikel wird erläutert, wann anstelle eines No-Fast-Forward-Mergevorgangs ein Rebase verwendet werden sollte. Außerdem werden Verfahren für die folgenden Aufgaben beschrieben:

  • Ausführen eines Rebasevorgangs für Ihren lokalen Branch
  • Ausführen eines Force Push-Vorgangs für Ihren lokalen Branch nach einem Rebase
  • Ausführen eines Interaktiven Rebasevorgangs zum Squashen lokaler Commits

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

Ausführen eines Rebasevorgangs für Ihren lokalen Branch

Git Rebase integriert Commits aus einem Quellbranch in Ihren aktuellen lokalen Branch (Zielbranch). Der Quellbranch bleibt unverändert. Zum Vergleich sind Git Rebase und weitere Mergetypen im folgenden Diagramm dargestellt.

Diagramm: Commits vorher und nachher bei Verwendung von Git Rebase

Bei 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. Eine weitere Möglichkeit dafür besteht darin, dass ein Rebasevorgang die Änderungen in Ihrem Zielbranch über dem Quellbranchverlauf wiederholt. Insbesondere ändert Git Rebase 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.

Wenn während eines Rebasevorgangs eine Quellbranchänderung einer Zielbranchänderung widerspricht, werden Sie von Git aufgefordert, den Mergekonflikt zu beheben. Sie können Mergekonflikte während eines Rebasevorgangs auf dieselbe Weise lösen wie Mergekonflikte während eines Mergevorgangs.

Rebase und No-Fast-Forward-Merge im Vergleich

Git Rebase führt zu einem einfacheren, aber weniger exakten Commitverlauf als ein No-Fast-Forward-Merge, der auch als Drei-Wege- oder True-Merge bezeichnet wird. Wenn Sie eine Aufzeichnung eines Mergevorgangs im Commitverlauf verwenden möchten, führen Sie einen No-Fast-Forward-Merge aus.

Wenn Sie die einzige Person sind, die an einem Feature- oder Bugfixbranch arbeitet, sollten Sie ein Rebase verwenden, um aktuelle Arbeit aus dem main-Branch regelmäßig darin zu integrieren. Mithilfe dieser Strategie können Sie sich über die aktuellen Arbeiten anderer informieren und eventuell auftretende Mergekonflikte direkt beheben. Durch die Ausführung eines Rebase implementieren Sie Ihr neues Feature oberhalb der letzten Arbeit im main-Branch, wodurch Sie einen linearen Commitverlauf erhalten.

Weitere Informationen zu Git Rebase und zu dessen Verwendung finden Sie unter Rebase und Merge im Vergleich.

Richtlinien zu Rebase und Force Push

Wenn Sie für einen lokalen Branch, den Sie zuvor gepusht haben, ein Rebase ausführen und dann den standardmäßigen Git Push-Befehl erneut ausführen, schlägt der Pushvorgang fehl. Durch den standardmäßigen Git Push-Befehl wird ein Fast-Forward-Merge angewendet, um Ihren lokalen Branch in den Remotebranch zu integrieren. Dieser Befehl schlägt nach einem Rebase fehl, da die Reihenfolge vorhandener Commits in Ihrem lokalen Zielbranch vom Rebasevorgang geändert wird, sodass er nicht mehr mit dem Verlauf des entsprechenden Remotebranchs übereinstimmt. In diesem Szenario ist Force Push erfolgreich, indem der Remotebranch überschrieben wird.

Git Rebase und Force Push sind leistungsstarke Tools, allerdings sollten Sie vor der Entscheidung, die Befehle zu verwenden, diese Richtlinien beachten:

  • Führen Sie keinen Rebase für einen lokalen Branch aus, der gepusht und für andere freigegeben wurde, es sei denn, Sie sind sicher, dass der freigegebene Branch von niemandem verwendet wird. Nach einem Rebase stimmt Ihr lokaler Branch nicht mehr mit dem Verlauf seines entsprechenden Remotebranchs überein.
  • Führen Sie keinen Force Push auf einen Remotebranch aus, der von anderen verwendet wird, da die lokale Version des Remotebranchs nicht mehr mit dem Verlauf des aktualisierten Remotebranchs übereinstimmt.
  • Ihr Team sollte sich einigen, welche Verwendungsszenarien für Rebase und Force Push gelten.

Tipp

Verwenden Sie für einen gemeinsamen Überprüfungsprozess einen Pull Request, um neue Arbeit in den Standardbranch eines Remoterepositorys zu mergen.

So führen Sie einen Rebase aus

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. Wählen Sie Git > Branches verwalten aus, um das Fenster Git-Repository zu öffnen.

    Screenshot: Option „Branches verwalten“ im Git-Menü von Visual Studio

  2. Klicken Sie im Fenster Git-Repository mit der rechten Maustaste auf den Zielbranch, und wählen Sie Check-Out aus.

    Screenshot: Option „Check-Out“ im Branchkontextmenü im Fenster „Git-Repository“ von Visual Studio

  3. Klicken Sie mit der rechten Maustaste auf den Quellbranch, und wählen Sie Rebase für <Zielbranch> ausführen auf <Quellbranch> aus.

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

  4. Visual Studio zeigt nach einem erfolgreichen Rebasevorgang eine Bestätigungsmeldung an.

    Screenshot: Bestätigungsmeldung für Rebasevorgang im Fenster „Git-Repository“ von Visual Studio

    Wenn der Rebasevorgang aufgrund von Mergekonflikten angehalten wird, werden Sie von Visual Studio benachrichtigt. Sie können entweder Konflikte lösen oder den Rebasevorgang abbrechen und zum Zustand vor dem Rebasevorgang zurückkehren.

    Screenshot: Meldung zu Rebasekonflikt im Fenster „Git-Repository“ von Visual Studio

Ausführen eines Force Push-Vorgangs für Ihren lokalen Branch nach einem Rebase

Wenn Sie ein Rebase für einen lokalen Branch ausführen, den Sie zuvor gepusht haben, verursacht ein nachfolgender standardmäßiger Git Push einen Fehler. Stattdessen können Sie für Ihren lokalen Branch einen Force Push ausführen, um seinen entsprechenden Remotebranch zu überschreiben, damit ihre Commitverläufe übereinstimmen.

Warnung

Ein Force Push darf niemals für einen Branch ausgeführt werden, an dem andere arbeiten. Weitere Informationen finden Sie unter Richtlinien zu Rebase und Force Push.

Um in Visual Studio einen Force Push auszuführen, müssen Sie zuerst die Force Push-Option aktivieren:

  1. Navigieren Sie zu Extras>Optionen>Quellcodeverwaltung>Globale Git-Einstellungen.

  2. Wählen Sie die Option „push --force-with-lease“ aktivieren aus.

Das --force-with-lease-Flag von Git Push ist sicherer als das --force-Flag, da es keinen Remotebranch überschreibt, der Commits enthält, die nicht in den lokalen Branch integriert sind, für den Sie einen Force Push ausführen.

  1. Wählen Sie im Fenster Git-Änderungen die Schaltfläche „Pushen“ aus, um den Commit zu pushen.

    Screenshot: Schaltfläche „Pushen“ mit Pfeil nach oben im Fenster „Git-Änderungen“ in Visual Studio.

    Alternativ können Sie im Git-Menü Pushen auswählen.

    Screenshot: Option „Pushen“ im Git-Menü in Visual Studio

  2. Wenn der Standardmäßige Git Push-Vorgang fehlschlägt, öffnet Visual Studio das Dialogfeld Git Push-Fehler. Wählen Sie Push erzwingen aus.

    Screenshot: Dialogfeld mit Git Push-Fehlermeldung in Visual Studio

  3. Visual Studio zeigt nach einem erfolgreichen Pushvorgang eine Bestätigungsmeldung an.

    Screenshot: Bestätigungsmeldung für Pushvorgang in Visual Studio

Ausführen eines Interaktiven Rebasevorgangs zum Squashen lokaler Commits

Wenn Sie an einem neuen Feature in Ihrem lokalen Featurebranch arbeiten, generieren Sie in der Regel mehrere Commits. Wenn Sie bereit sind, das neue Feature zu veröffentlichen, können Sie diese Commits in einem einzelnen Commit konsolidieren, um den Commitverlauf zu vereinfachen. Sie können einen interaktiven Rebase-Befehl verwenden, um mehrere Commits in einem einzelnen Commit zu squashen.

Visual Studio 2022 unterstützt keine interaktiven Rebasevorgänge. Verwenden Sie stattdessen die Git-Befehlszeile.

Hinweis

Azure DevOps-Benutzer können einen Squashmerge ausführen, um den Commitverlauf eines Topic-Branchs während eines Pull Requests zusammenzufassen.

Nächste Schritte