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?
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.
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.
Update from original
).Jetzt haben Sie drei Optionen, aber jede führt zu einem nicht ganz sauberen Commit-Verlauf.
Dieser Zweig ist X Commits voraus, Y Commits hinter <original fork>
.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.
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