Wie aktualisiere ich ein von GitHub geforktes Repository?

Ich habe vor kurzem ein Projekt geforkt und mehrere Korrekturen vorgenommen. Ich habe dann einen Pull-Request erstellt, der dann akzeptiert wurde.

Ein paar Tage später wurde eine weitere Änderung von einem anderen Mitwirkenden vorgenommen. Meine Abspaltung enthält diese Änderung also nicht.

Wie kann ich diese Änderung in meinen Fork bekommen? Muss ich meine Abspaltung löschen und neu erstellen, wenn ich weitere Änderungen beisteuern möchte? Oder gibt es eine Schaltfläche zum Aktualisieren?

Lösung

In Ihrem lokalen Klon des geforkten Repositorys können Sie das ursprüngliche GitHub-Repository als "Remote" hinzufügen. ("Remotes" sind so etwas wie Spitznamen für die URLs von Repositories - origin ist z.B. einer.) Dann können Sie alle Zweige aus diesem Upstream-Repository abrufen und Ihre Arbeit auf die Upstream-Version umstellen, um weiter daran zu arbeiten. In Form von Befehlen könnte das wie folgt aussehen:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

Wenn Sie die Geschichte Ihres Master-Zweiges nicht umschreiben wollen (zum Beispiel weil andere Leute ihn geklont haben könnten), dann sollten Sie den letzten Befehl durch git merge upstream/master ersetzen. Um jedoch weitere Pull Requests zu erstellen, die so sauber wie möglich sind, ist es wahrscheinlich besser, rebase zu machen.


Wenn Sie Ihren Zweig auf upstream/master rebased haben, müssen Sie eventuell den Push erzwingen, um ihn in Ihr eigenes Repository auf GitHub zu pushen, das Sie gegabelt haben. Du würdest das mit tun:

git push -f origin master

Sie müssen das -f nur beim ersten Mal nach dem Re-Based verwenden.

Kommentare (28)

Seit Mai 2014 ist es möglich, einen Fork direkt von GitHub aus zu aktualisieren. Dies funktioniert seit September 2017 immer noch, Aber es führt zu einem schmutzigen Commit-Verlauf.

  1. Öffnen Sie Ihren Fork auf GitHub.
  2. Klicken Sie auf Pull Requests.
  3. Klicken Sie auf Neuer Pull Request. Standardmäßig vergleicht GitHub das Original mit Ihrem Fork, und es sollte nichts zu vergleichen sein, wenn Sie keine Änderungen vorgenommen haben.
  4. Klicken Sie auf Switching the base, wenn Sie diesen Link sehen. Andernfalls setze den base fork Dropdown auf deinen Fork und den head fork auf den Upstream. Jetzt vergleicht GitHub Ihren Fork mit dem Original und Sie sollten alle aktuellen Änderungen sehen.
  5. Erstellen Sie eine Pull-Anfrage und geben Sie Ihrer Pull-Anfrage einen vorhersehbaren Namen (z.B. Update from original).
  6. Scrollen Sie nach unten zu Merge pull request, aber klicken Sie noch nichts an.

Jetzt haben Sie drei Optionen, aber jede führt zu einem nicht ganz sauberen Commit-Verlauf.

  1. Die Standardeinstellung erzeugt einen hässlichen Merge Commit.
  2. Wenn Sie auf das Dropdown-Menü klicken und "Squash and merge" wählen, werden alle dazwischen liegenden Commits zu einem einzigen zusammengefügt. Das ist meistens etwas, was Sie nicht wollen.
  3. Wenn du auf Rebase and merge klickst, werden alle Commits "mit" dir gemacht, die ursprünglichen PRs werden mit deinem PR verlinkt und GitHub zeigt an Dieser Zweig ist X Commits voraus, Y Commits hinter.

Sie können also Ihr Projektarchiv über die GitHub-Weboberfläche mit seinem Upstream auf dem neuesten Stand halten, aber dadurch wird Ihr Commit-Verlauf beschmutzt. Bleiben Sie stattdessen bei der Kommandozeile - es ist einfach.

Kommentare (15)

Hier ist das offizielle Dokument von GitHub über Syncing a fork:

Syncing a fork

Die Einrichtung

Bevor Sie synchronisieren können, müssen Sie ein Remote-Repository hinzufügen, das auf das Upstream-Repository verweist. Sie haben dies vielleicht schon beim ursprünglichen Fork getan.

*Tipp: Das Synchronisieren Ihres Forks aktualisiert nur Ihre lokale Kopie des Repositorys; es aktualisiert nicht Ihr Repository auf GitHub.

$ git remote -v

Liste der aktuellen Remotes

origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git

Eine neue Fernbedienung einrichten

$ git remote -v

Überprüfe neue Fernbedienung

origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

Synchronisieren

Es sind zwei Schritte erforderlich, um Ihr Repository mit dem Upstream zu synchronisieren: zuerst müssen Sie vom entfernten Repository holen, dann müssen Sie den gewünschten Zweig mit Ihrem lokalen Zweig zusammenführen.

Abholen

Das Holen aus dem entfernten Projektarchiv bringt dessen Zweige und die dazugehörigen Übertragungen ein. Diese werden in Ihrem lokalen Repository unter speziellen Zweigen gespeichert.

$ git fetch upstream

Holt die Zweige des Upstream-Repositorys

remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

Wir haben jetzt den Master-Zweig des Upstreams in einem lokalen Zweig gespeichert, upstream/master

$ git branch -va

Alle lokalen und remote-tracking Zweige auflisten

* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

Merging

Nun, da wir das Upstream-Repository geholt haben, wollen wir dessen Änderungen in unseren lokalen Zweig zusammenführen. Dadurch wird dieser Zweig mit dem Upstream synchronisiert, ohne dass unsere lokalen Änderungen verloren gehen.

$ git checkout master

checkt unseren lokalen Master-Zweig aus

Switched to branch 'master'

$ git merge upstream/master

Merge upstream's master in unseren eigenen

Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

Wenn Ihr lokaler Zweig keine eindeutigen Commits hatte, führt git stattdessen einen "Fast-Forward" durch:

$ git merge upstream/master Aktualisieren von 34e91da..16c56ad Schnellvorlauf README.md | 5 +++-- 1 Datei geändert, 3 Einfügungen(+), 2 Löschungen(-)

Tipp: Wenn Sie Ihr Repository auf GitHub aktualisieren möchten, folgen Sie den Anweisungen hier

Kommentare (5)