Ziehen Sie neue Updates aus dem ursprünglichen GitHub-Repository in das gegabelte GitHub-Repository


615

Ich habe jemandes Repository auf GitHub gegabelt und möchte meine Version mit Commits und Updates aktualisieren, die im ursprünglichen Repository vorgenommen wurden. Diese wurden gemacht, nachdem ich meine Kopie gegabelt hatte.

Wie kann ich die im Ursprung vorgenommenen Änderungen übernehmen und in mein Repository integrieren?


1
Mögliches Duplikat oder nur verwandt: Zusammenführen zwischen Gabeln in GitHub .

Falls es zusätzliche Tags gibt, die Sie möglicherweise synchronisieren möchten, führen Sie git push --force origin --tagsdie vorgeschlagenen Lösungen aus!
MediaVince

Antworten:


716

Sie müssen das ursprüngliche Repository (das von Ihnen gegabelte) als Remote hinzufügen.

Von der GitHub-Gabel-Manpage :

Gabel

Sobald der Klon abgeschlossen ist, hat Ihr Repo eine Fernbedienung mit dem Namen " origin", die auf Ihre Gabel auf GitHub zeigt.
Lassen Sie sich nicht vom Namen verwirren, dies deutet nicht auf das ursprüngliche Repo hin, aus dem Sie gegabelt haben. Um Ihnen zu helfen, den Überblick über dieses Repo zu behalten, fügen wir eine weitere Fernbedienung mit dem Namen "Upstream" hinzu:

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

Sie haben auch einen Rubinstein, der diese GitHub-Operationen erleichtern kann .

gegabelt

Siehe auch " Git-Gabel ist Git-Klon? ".


14
Siehe auch bassistance.de/2010/06/25/git-fu-updating-your-github-fork für eine schöne Zusammenfassung.
VonC

2
@syedrakib Ich bevorzuge ein git rebase upstream/master, aber ich habe die beiden Möglichkeiten in der Antwort hinzugefügt.
VonC

1
@PaBLoX Wenn Sie ein Repo gegabelt haben, arbeiten Sie an Ihrem Repo in Ihrem Zweig: Rebase und Force Push: Kein Chaos. Sogar eine laufende Pull-Anfrage würde korrekt aktualisiert.
VonC

2
@PaBLoX Sie erstellen kein Chaos: Sie git push --forceersetzen den Verlauf Ihres Zweigs auf GitHub durch Ihren lokalen Zweig, den Sie gerade neu gegründet haben. Da nur Sie traurigen Zweig verwenden, ist kein Chaos beteiligt.
VonC

2
Ich verstehe. Ich denke immer noch, dass es schwierig, nicht trivial und nicht intuitiv ist. Trotzdem ist es seltsam, dass meine Änderungen immer oben (zuletzt) ​​sind, während sie tatsächlich zuvor vorgenommen wurden. Die Lösung, die ich zuvor gepostet habe, sieht besser aus (auch immer noch nicht trivial). Das Problem ist, dass Commit-Hashes geändert werden (offensichtlich, da es ein neues übergeordnetes Element gibt) und viel Rauschen in Github erzeugen, wenn Probleme aufgerufen werden. Trotzdem überrascht es mich, dass es keine Möglichkeit gibt, mit Upstream auf dem neuesten Stand zu bleiben und Ihren eigenen Zweig zu verwalten, ohne sinnlose Zusammenführungs-Commits oder "Lügen" über den Verlauf zu erstellen.
Pablo Olmos de Aguilera C.

99

Zusätzlich zu VonCs Antwort können Sie sie noch weiter nach Ihren Wünschen anpassen.

Nach dem Abrufen aus dem Remote-Zweig müssten Sie die Commits noch zusammenführen. Ich würde ersetzen

$ git fetch upstream

mit

$ git pull upstream master

da Git Pull im Wesentlichen Git Fetch + Git Merge ist.


Was ist, wenn ich weiß, dass der Upstream-Zweig keine Änderungen an vorhandenen Dateien aufweist, sondern nur wenige Ressourcendateien hinzugefügt wurden? Muss ich noch zusammenführen?
Azec-PDF

4
Sicherlich wird es in diesem Fall nur einen schnellen Vorlauf geben
Domness

Wie kann man den Upstream-Master dazu bringen, alle lokalen Dateien zu überschreiben (also keine Zusammenführungskonflikte)? Der Upstream-Master führt in diesem Fall den Code an, also vertrauen wir darauf, dass er zu 100% ... dies geschafft hat
? Der

1
@snh_nl git rebase upstream masterBeachten Sie, dass dies nicht konfliktfrei ist, wenn Sie ausreichend davon abgewichen sind upstream/master. Siehe git-scm.com/docs/git-rebase (tl; dr: Dies setzt Ihren lokalen Master auf den von Upstream zurück und versucht dann, alle lokalen Commits vom Punkt der Divergenz an neu zusammenzuführen)
Cowbert

68

Dieses Video zeigt, wie Sie eine Gabel direkt von GitHub aus aktualisieren

Schritte:

  1. Öffne deine Gabel auf GitHub.
  2. Klicken Sie auf Pull Requests.
  3. Klicken Sie auf New Pull Request. Standardmäßig vergleicht GitHub das Original mit Ihrer Gabel, und es sollte nichts zu vergleichen geben, wenn Sie keine Änderungen vorgenommen haben.
  4. Klicken Sie auf switching the base. Jetzt vergleicht GitHub Ihre Gabel mit dem Original und Sie sollten die neuesten Änderungen sehen.
  5. Klicken Sie Create a pull requestfür diesen Vergleich auf und weisen Sie Ihrer Pull-Anfrage einen vorhersehbaren Namen zu (z. B. Aktualisierung vom Original).
  6. Klicke auf Create pull request.
  7. Scrollen Sie nach unten und klicken Sie Merge pull requestund führen Sie schließlich Confirmzusammen. Wenn Ihre Gabel keine Änderungen hatte, können Sie sie automatisch zusammenführen.

3
Leider erzeugt diese schöne grafische Methode zusätzliches Rauschen in Ihrer Gabel, wie oben in den Kommentaren für die akzeptierte Antwort erwähnt. Daher wird die Befehlszeilenmethode empfohlen: help.github.com/articles/syncing-a-fork
Jonathan Cross

Ich konnte nicht finden switching the baseOption
Alper

64

Verwenden:

git remote add upstream ORIGINAL_REPOSITORY_URL

Dadurch wird Ihr Upstream auf das Repository gesetzt, aus dem Sie gegabelt haben. Dann mach das:

git fetch upstream      

Dadurch werden alle Zweige einschließlich des Masters aus dem ursprünglichen Repository abgerufen.

Führen Sie diese Daten in Ihrer lokalen Hauptniederlassung zusammen:

git merge upstream/master

Übertragen Sie die Änderungen in Ihr gegabeltes Repository, dh in den Ursprung:

git push origin master

Voila! Sie sind mit der Synchronisierung des ursprünglichen Repositorys fertig.


Wie kann man den Upstream-Master dazu bringen, alle lokalen Dateien zu überschreiben (also keine Zusammenführungskonflikte)
? Der

Eine Möglichkeit besteht darin, einfach die lokale Kopie zu löschen und ein neues Klonen durchzuführen :)
ARK

1

Wenn Sie die GitHub-Desktopanwendung verwenden, befindet sich oben rechts eine Schaltfläche zum Synchronisieren. Klicken Sie darauf und dann Update from <original repo>oben links.

Wenn keine zu synchronisierenden Änderungen vorhanden sind, ist dies inaktiv.

Hier sind einige Screenshots , um dies zu vereinfachen.


1

Wenn es nichts zu verlieren gibt, können Sie auch einfach Ihre Gabel löschen. Gehen Sie einfach zu den Einstellungen ... Gehen Sie zum Abschnitt Gefahrenzone unten und klicken Sie auf Repository löschen. Anschließend werden Sie aufgefordert, den Repository-Namen und Ihr Kennwort einzugeben. Danach gabelst du einfach das Original wieder.


1

Wenn Sie es ohne CLI tun möchten, können Sie es vollständig auf der Github-Website tun.

  1. Gehen Sie zu Ihrem Fork-Repository.
  2. Klicken Sie auf New pull request.
  3. Stellen Sie sicher, dass Sie Ihren Fork als Basis-Repository und das ursprüngliche (Upstream-) Repository als Head-Repository festlegen. Normalerweise möchten Sie nur den Hauptzweig synchronisieren.
  4. Create new pull request.
  5. Wählen Sie den Pfeil rechts neben der Schaltfläche zum Zusammenführen aus und wählen Sie Rebase anstelle von Merge. Klicken Sie dann auf die Schaltfläche. Auf diese Weise wird kein unnötiges Zusammenführungs-Commit erzeugt.
  6. Erledigt.

0

Um Ihr gegabeltes Repository automatisch mit dem übergeordneten Repository zu synchronisieren, können Sie die Pull App auf GitHub verwenden.

Weitere Informationen finden Sie in der Readme-Datei .

Informationen zum erweiterten Setup, bei dem Sie Ihre am gespaltenen Repository vorgenommenen Änderungen beibehalten möchten, finden Sie in meiner Antwort auf eine ähnliche Frage hier .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.