Git Branch Ahead of Origin auflösen

GitBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie man mit einem gängigen Git-Szenario umgeht: wenn Ihr lokaler Branch dem Remote-Repository voraus ist (ahead). Diese Situation tritt ein, wenn Sie lokale Commits erstellen, diese aber noch nicht an das Remote-Repository gepusht haben. Am Ende dieses Labs werden Sie verstehen, wie Sie erkennen, wann Ihr Branch dem Remote voraus ist, und wie Sie Ihre lokalen und Remote-Repositories korrekt synchronisieren.

Lokale Änderungen vornehmen

In diesem Schritt werden Sie Änderungen an Ihrem lokalen Repository vornehmen, die noch nicht an das Remote-Repository gepusht wurden, wodurch das Szenario "ahead of origin" (dem Ursprung voraus) entsteht.

Repository einrichten

Zuerst müssen wir ein Repository einrichten, mit dem wir arbeiten können. Wir verwenden das git-playground-Repository als Ausgangspunkt. Da Sie Push-Berechtigungen benötigen, um dieses Lab abzuschließen, müssen Sie das Repository zuerst forken.

Das Repository forken

  1. Besuchen Sie https://github.com/labex-labs/git-playground in Ihrem Browser
  2. Klicken Sie oben rechts auf die Schaltfläche "Fork", um Ihre eigene Kopie des Repositorys zu erstellen
  3. Sobald Sie geforkt haben, notieren Sie Ihren GitHub-Benutzernamen – Sie werden ihn im nächsten Schritt benötigen

Ihr geforktes Repository klonen

Nun klonen wir Ihr geforktes Repository auf Ihren lokalen Rechner. Ersetzen Sie YOUR_USERNAME durch Ihren tatsächlichen GitHub-Benutzernamen:

cd ~/project
git clone https://github.com/YOUR_USERNAME/git-playground.git
cd git-playground

Nach dem Klonen überprüfen Sie, ob das Remote-Repository korrekt konfiguriert ist:

git remote -v

Sie sollten eine Ausgabe sehen, die Ihr geforktes Repository als origin Remote anzeigt:

origin  https://github.com/YOUR_USERNAME/git-playground.git (fetch)
origin  https://github.com/YOUR_USERNAME/git-playground.git (push)

Lokale und Remote-Repositories verstehen

Git arbeitet mit einem verteilten Modell, bei dem jeder Entwickler eine vollständige Kopie des Repositorys auf seinem lokalen Rechner hat. Lokal vorgenommene Änderungen müssen explizit mit dem Remote-Repository synchronisiert werden.

Überprüfen wir nun den aktuellen Status unseres Repositorys:

git status

Sie sollten eine Ausgabe ähnlich dieser sehen:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Dies bedeutet, dass Ihr lokales Repository derzeit mit dem Remote-Repository synchronisiert ist.

Eine neue Datei erstellen

Erstellen wir eine neue Datei in unserem Repository:

echo "This is a new file for our project." > new_file.txt

Nachdem die Datei erstellt wurde, müssen wir sie zur Staging Area (Zwischenspeicher) von Git hinzufügen:

git add new_file.txt

Nun committen wir diese Datei in unser lokales Repository:

git commit -m "Add new_file.txt"

Sie sollten eine Ausgabe sehen, die Ihren Commit bestätigt:

[master 1a2b3c4] Add new_file.txt
 1 file changed, 1 insertion(+)
 create mode 100644 new_file.txt

Überprüfung des Branch-Status

Nachdem wir einen lokalen Commit vorgenommen haben, überprüfen wir erneut den Status unseres Repositorys:

git status

Dieses Mal sollten Sie Folgendes sehen:

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Diese Meldung zeigt an, dass Ihr lokaler Branch einen Commit enthält, der noch nicht an das Remote-Repository gepusht wurde. Dies ist genau die Situation, die wir erzeugen wollten – Ihr Branch ist nun "ahead of origin".

Unterschiede der Branches anzeigen

Nachdem Ihr lokaler Branch dem Remote-Branch voraus ist, wollen wir nun untersuchen, wie man die spezifischen Unterschiede zwischen Ihrem lokalen und dem Remote-Branch anzeigt.

Branch-Referenzen verstehen

In Git referenziert man den Remote-Branch mit dem Format origin/branch-name. Der Begriff origin ist der Standardname für das Remote-Repository, und branch-name ist der Name des Branches (in unserem Fall ist es master).

Commit-Unterschiede anzeigen

Um die Commits zu sehen, die in Ihrem lokalen Branch existieren, aber nicht im Remote-Branch, verwenden Sie den folgenden Befehl:

git log origin/master..HEAD

Die Ausgabe zeigt Ihnen den/die Commit(s), der/die sich in Ihrem lokalen Branch (HEAD) befinden, aber nicht im Remote-Branch (origin/master):

commit 1a2b3c4d... (HEAD -> master)
Author: LabEx User <labex@example.com>
Date:   ...

    Add new_file.txt

Datei-Unterschiede anzeigen

Um zu sehen, welche Dateien sich zwischen Ihren lokalen und Remote-Branches unterscheiden, verwenden Sie:

git diff --name-status origin/master..HEAD

Die Ausgabe sollte Folgendes anzeigen:

A       new_file.txt

Dies deutet darauf hin, dass new_file.txt in Ihrem lokalen Branch hinzugefügt wurde, aber im Remote-Branch nicht existiert.

Die Unterschiedsvisualisierung verstehen

Um die tatsächlichen Inhaltsunterschiede zu sehen, können Sie verwenden:

git diff origin/master..HEAD

Dies zeigt die spezifischen Änderungen an jeder Datei:

diff --git a/new_file.txt b/new_file.txt
new file mode 100644
index 0000000..3b2aed8
--- /dev/null
+++ b/new_file.txt
@@ -0,0 +1 @@
+This is a new file for our project.

Diese Befehle helfen Ihnen zu verstehen, welche Änderungen sich genau in Ihrem lokalen Branch befinden, die noch nicht an das Remote-Repository gepusht wurden.

Änderungen auf Remote pushen

Nachdem Sie verstanden haben, welche Änderungen in Ihrem lokalen Branch vorhanden sind, ist es nun Zeit, Ihr lokales Repository mit dem Remote-Repository zu synchronisieren, indem Sie Ihre Änderungen pushen.

Git Push verstehen

Der Befehl git push sendet Ihre lokalen Commits an das Remote-Repository. Wenn Sie pushen, synchronisieren Sie den Remote-Branch mit Ihrem lokalen Branch, wodurch beide Branches identisch werden.

Ihre Änderungen pushen

Um Ihre lokalen Commits auf das Remote-Repository zu pushen, verwenden Sie:

git push origin master

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 324 bytes | 324.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/YOUR_USERNAME/git-playground.git
   abcd123..1a2b3c4  master -> master

Die Ausgabe zeigt:

  • Git hat die Objekte in Ihrem Commit gezählt und komprimiert
  • Die Änderungen wurden erfolgreich an das Remote-Repository gesendet
  • Die alten und neuen Commit-Hash-Identifikatoren
  • Der Branch, der aktualisiert wurde (master -> master)

Das Push überprüfen

Überprüfen wir nun erneut den Status unseres Repositorys:

git status

Jetzt sollten Sie sehen:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Dies bestätigt, dass Ihr lokaler Branch nun mit dem Remote-Branch synchronisiert ist. Die Meldung "ahead of origin" ist verschwunden, da beide Branches nun dieselben Commits enthalten.

Überprüfung des Remote-Repository-Inhalts

Wir können überprüfen, ob unsere Änderungen nun im Remote-Repository vorhanden sind, indem wir das Log des Remote-Branches untersuchen:

git log origin/master -1

Dieser Befehl zeigt den neuesten Commit auf dem Remote-Branch an, der nun unsere neue Datei enthalten sollte:

commit 1a2b3c4d... (HEAD -> master, origin/master)
Author: LabEx User <labex@example.com>
Date:   ...

    Add new_file.txt

Beachten Sie, dass sowohl HEAD -> master als auch origin/master nun auf denselben Commit zeigen, was bestätigt, dass beide Branches synchronisiert sind.

Erstellen und Auflösen mehrerer vorauslaufender Commits

In realen Szenarien haben Sie möglicherweise mehrere Commits, die Ihrem Remote-Branch voraus sind. Erstellen wir diese Situation und lernen wir, wie man sie auflöst.

Mehrere lokale Commits erstellen

Erstellen und committen wir mehrere Änderungen:

## Create a second file
echo "This is the second file." > second_file.txt
git add second_file.txt
git commit -m "Add second_file.txt"

## Modify the README
echo "### Additional Information" >> README.md
echo "This project demonstrates Git branch synchronization." >> README.md
git add README.md
git commit -m "Update README with additional information"

Überprüfen wir nun unseren Status:

git status

Sie sollten sehen:

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Unterschiede mehrerer Commits anzeigen

Sehen wir uns an, welche Commits wir lokal haben, die sich nicht auf dem Remote befinden:

git log origin/master..HEAD --oneline

Sie sollten Ihre beiden neuen Commits sehen:

abcd123 Update README with additional information
efgh456 Add second_file.txt

Mehrere Commits pushen

Um alle Ihre lokalen Commits mit dem Remote-Repository zu synchronisieren, verwenden Sie denselben Push-Befehl:

git push origin master

Die Ausgabe zeigt, dass beide Commits gepusht werden:

Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 574 bytes | 574.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
To https://github.com/YOUR_USERNAME/git-playground.git
   1a2b3c4..abcd123  master -> master

Überprüfen, ob alle Commits gepusht wurden

Überprüfen wir erneut unseren Status:

git status

Sie sollten sehen:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Dies bestätigt, dass alle Ihre lokalen Commits erfolgreich auf das Remote-Repository gepusht wurden.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man Situationen handhabt, in denen Ihr lokaler Git-Branch dem Remote-Branch voraus ist. Sie haben erfolgreich:

  1. Einen lokalen Commit erstellt, der Ihren Branch dem Remote-Branch voraus machte.
  2. Git-Befehle verwendet, um die spezifischen Unterschiede zwischen Ihrem lokalen und dem Remote-Branch anzuzeigen.
  3. Ihre Änderungen gepusht, um Ihre lokalen und Remote-Repositories zu synchronisieren.
  4. Mehrere Commits lokal erstellt und sie alle auf einmal an den Remote-Branch gepusht.

Diese Fähigkeiten sind für den täglichen Git-Workflow unerlässlich, da sie Ihnen helfen, Ihre lokalen und Remote-Repositories synchron zu halten, was für eine effektive Zusammenarbeit in Softwareentwicklungsprojekten von entscheidender Bedeutung ist. Denken Sie daran, dass die regelmäßige Synchronisation Ihrer Branches hilft, Konflikte zu vermeiden und die Zusammenarbeit reibungsloser zu gestalten.