Aktualisieren von Code mit Fetch, Merge und Pull

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

Visual Studio 2019 | Visual Studio 2022

Wenn an einem Projekt mehrere Benutzer mitwirken, halten Sie Ihr lokales Git-Repository auf dem neuesten Stand, indem Sie Arbeitsdaten herunterladen und integrieren, die andere Personen in das Remoterepository des Projekts hochgeladen haben. Mit den folgenden Git-Befehlen wird Ihr lokales Repository aktualisiert:

  • Git Fetch lädt alle neuen Commits herunter, die andere in das Remoterepository hochgeladen haben. Die Remotenachverfolgungsbranches im lokalen Repositorycache werden aktualisiert, während lokale Branches unverändert bleiben.
  • Git Merge integriert Commits aus einem oder mehreren Quellbranches in einen Zielbranch.
  • Git Rebase integriert Commits aus einem Quellbranch in einen Zielbranch, verwendet jedoch eine andere Strategie als Git Merge.
  • Git Pull führt Fetch und dann Merge oder Rebase aus, um abgerufene Commits in Ihren aktuellen lokalen Branch zu integrieren.

Visual Studio verwendet eine Teilmenge dieser Git-Befehle, wenn Sie Ihr lokales Repository mit einem Remoterepository synchronisieren.

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

In diesem Artikel werden Schritte für die folgenden Aufgaben erläutert:

  • Herunterladen von Änderungen mit Fetch
  • Aktualisieren von Branches mit Merge oder Rebase
  • Herunterladen von Änderungen und Aktualisieren von Branches mit Pull

Herunterladen von Änderungen mit Fetch

Mit Git Fetch werden Remotebranchcommits und referenzierte Dateiobjekte heruntergeladen, die nicht in Ihrem lokalen Repository vorhanden sind, und Remotenachverfolgungsbranches im lokalen Repositorycache aktualisiert. Remotenachverfolgungsbranches sind lokal zwischengespeicherte schreibgeschützte Kopien von Remotebranches und gehören nicht zu Ihren lokalen Branches. Git Fetch aktualisiert nicht Ihre lokalen Branches. Wenn beispielsweise ein mit origin gekennzeichnetes Remoterepository über einen bugfix3-Branch verfügt, aktualisiert Git Fetch den Remotenachverfolgungsbranch mit dem Namen origin/bugfix3 und nicht Ihren lokalen bugfix3-Branch. Sie können Remotenachverfolgungsbranches für folgende Aufgaben verwenden:

  • Vergleichen eines Remotenachverfolgungsbranchs mit einem lokalen Branch, um abgerufene Änderungen zu überprüfen
  • Zusammenführen eines Remotenachverfolgungsbranchs in einen lokalen Branch
  • Erstellen eines neuen lokalen Branchs aus einem Remotenachverfolgungsbranch

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 im Fenster Git-Änderungen die Option Fetch aus. Wählen Sie dann ausgehend/eingehend aus, um das Fenster Git-Repository zu öffnen.

    Screenshot: Fetch-Schaltflächen und Link „Eingehend“ im Fenster „Git-Änderungen“ von Visual Studio 2019

    Sie können Fetch auch im Git-Menü auswählen.

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

  2. Im Fenster Git-Repository werden abgerufene Commits im Abschnitt Eingehend angezeigt. Wählen Sie einen abgerufenen Commit aus, um die Liste der geänderten Dateien in diesem Commit anzuzeigen. Wählen Sie eine geänderte Datei aus, um die geänderten Inhalte in einer Vergleichsansicht anzuzeigen.

    Screenshot: Menü „Git-Repository“ in Visual Studio 2019

Tipp

Fetch löscht keine Remotenachverfolgungsbranches in Ihrem lokalen Repositorycache, die keine Remoteentsprechung mehr haben. So konfigurieren Sie Visual Studio, um veraltete Remotenachverfolgungsbranches während eines Fetch-Vorgangs zu löschen:

  • Wählen Sie Extras>Optionen>Quellcodeverwaltung>Globale Git-Einstellungen aus.
  • Legen Sie die Option Remotebranches während des Abrufvorgangs löschen auf True fest.

Nach einem Git Fetch-Vorgang können Sie einen lokalen Branch mit dem entsprechenden Remotenachverfolgungsbranch vergleichen, um festzustellen, was am Remotebranch geändert wurde. Wenn Sie Ihren aktuellen lokalen Branch mit den abgerufenen Änderungen aktualisieren möchten, können Sie einen Git Merge- oder Git Rebase-Befehl ausführen. Alternativ können Sie Git Pull ausführen, wodurch Git Fetch mit Git Merge oder Git Rebase kombiniert wird. Sowohl Git Merge als auch Git Rebase aktualisieren einen Zielbranch, indem Commits aus einem Quellbranch darauf angewendet werden. Git Merge und Git Rebase verwenden jedoch unterschiedliche Strategien. Weitere Informationen finden Sie unter Aktualisieren von Branches mit Merge oder Rebase und Wann sollte Rebase anstelle von Merge verwendet werden?

Aktualisieren von Branches mit Merge oder Rebase

Git Merge und Git Rebase integrieren Commits aus einem Quellbranch in Ihren aktuellen lokalen Branch (Zielbranch). Git Merge führt entweder einen Fast-Forward- oder No-Fast-Forward-Merge-Vorgang 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 Merge-Typen sind im folgenden Diagramm dargestellt.

Diagramm: Commits vorher und nachher bei Verwendung von Merge und Rebase

Git Merge und Git Rebase werden ausgiebig im Git-Workflow 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.

Dieser Ansatz bietet folgende Möglichkeiten:

  • Informieren Sie sich über aktuelle Arbeiten anderer, die Ihre Arbeit beeinflussen könnten.
  • Lösen Sie direkt etwaige Konflikte zwischen Ihrer Arbeit und der anderer Beteiligter.
  • Wenden Sie Ihr neues Feature auf aktuelle Projektinhalte an.
  • Lassen Sie Ihre Arbeit per Pull Request überprüfen.

Zusammenführen

Wenn bei Git Merge die Spitze des Zielbranchs im Quellbranch enthalten 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-Git 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 seinem entsprechenden Remotebranch aktualisieren.

Bei einem No-Fast-Forward-Git 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 Git Merge wird nur der Zielbranch geändert. Der Quellbranch bleibt unverändert. Wenn dabei ein Mergekonflikt auftritt, müssen Sie diesen auflösen, um den Mergevorgang durchzuführen. Alternativ können Sie den Mergevorgang 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.

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 Git Fetch ausführen.

  1. Wählen Sie in der Menüleiste Git > Branches verwalten aus, um das Fenster Git-Repository zu öffnen.

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

  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 Fenster „Git-Repository“ von Visual Studio 2019

  3. Klicken Sie mit der rechten Maustaste auf den Quellbranch, und wählen Sie Mergen von <Quellbranch> in <Zielbranch> aus.

    Screenshot: Merge-Option im Fenster „Git-Repository“ von Visual Studio 2019

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

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

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

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

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 die Änderungen durch einen Git Rebase-Vorgang in Ihrem Zielbranch über dem Quellbranchverlauf wiederholt. Wenn eine Quellbranchänderung einer Zielbranchänderung widerspricht, werden Sie von Git aufgefordert, den Mergekonflikt zu beheben. Von einem Git Rebase-Vorgang wird kein Mergecommit erstellt. 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.

Bei 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 Rebasevorgang durchzuführen. Alternativ können Sie den Rebasevorgang abbrechen und den Zielbranch in den vorherigen Zustand zurücksetzen.

Wenn Sie als einziger an Ihrem Feature- oder Bugfixbranch arbeiten, sollten Sie Git Rebase verwenden, um neue main-Branchcommits darin zu integrieren. Verwenden Sie andernfalls Git Merge. Weitere Informationen zu Git Rebase und zu dessen Verwendung finden Sie unter Anwenden von Änderungen durch einen Rebase und Rebase vs. Merge.

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 dem Rebase Git Fetch ausführen.

  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 2019

  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 2019

  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 2019

  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 2019

    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 2019

Herunterladen von Änderungen und Aktualisieren von Branches mit Pull

Git Pull kombiniert standardmäßig Git Fetch und Git Merge, um Ihren aktuellen lokalen Branch von seinem entsprechenden Remotebranch zu aktualisieren. Git Pull kann optional Git Rebase anstelle von Git Merge ausführen.

Im Gegensatz zu Git Fetch aktualisiert Git Pull Ihren aktuellen lokalen Branch unmittelbar nach dem Herunterladen neuer Commits aus dem Remoterepository. Verwenden Sie Git Pull, wenn Sie wissen, dass Sie Ihren aktuellen lokalen Branch direkt nach Git Fetch aktualisieren möchten.

Tipp

So gehen Sie vor, um Visual Studio beim Pullen für die Verwendung eines Rebasevorgangs anstelle eines Mergevorgangs zu konfigurieren:

  1. Wechseln Sie im Git-Menü zu Extras>Optionen>Quellcodeverwaltung>Globale Git-Einstellungen.
  2. Legen Sie die Option Während des Pullvorgangs Rebase für lokalen Branch ausführen auf True fest.
  1. Wählen Sie im Fenster Git-Änderungen die Option Pull aus.

    Screenshot: Schaltfläche „Pull“ im Fenster „Git-Änderungen“ in Visual Studio 2019

    Sie können Pull auch im Git-Menü auswählen.

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

  2. Wenn der Pullvorgang abgeschlossen ist, wird eine Bestätigungsmeldung angezeigt.

    Screenshot: Bestätigungsmeldung für Pullvorgang im Fenster „Git-Änderungen“ in Visual Studio 2019

    Wenn beim Mergen im Rahmen des Pullvorgangs Konflikte auftreten, werden Sie von Visual Studio benachrichtigt. Sie können entweder Konflikte lösen oder den Mergevorgang abbrechen und zum Zustand vor dem Mergevorgang zurückkehren.

    Screenshot: Meldung zu Pullkonflikt im Fenster „Git-Änderungen“ in Visual Studio 2019

Hinweis

Durch den Sync-Befehl werden in Visual Studio ein Pull- und dann ein Push-Vorgang ausgeführt, um einen lokalen und einen Remotebranch zu synchronisieren. Weitere Informationen zur Verwendung der Synchronisierung finden Sie unter Verwenden der Git-Optionen zum Fetchen, Pullen, Pushen und Synchronisieren für die Versionskontrolle in Visual Studio.

Nächste Schritte