Wie kann ich meine Gabel synchron halten, ohne eine separate Fernbedienung hinzuzufügen?


302

Nehmen wir an, es gibt ein Repository someone/foobarauf GitHub, zu dem ich gegabelt habe me/foobar.

Wie ziehe ich neue Commits aus dem übergeordneten Repository direkt auf meinen Fork , ohne eine separate Fernbedienung hinzufügen zu müssen, und denke daran, regelmäßig von dort abzurufen?

Das Ziel ist:

  • git pull aus dem übergeordneten Repository abrufen
  • git push alles an meine Gabel schicken

26
Die überraschende Antwort von @Olufemi scheint zu tun, was Sie wollen, außer dass Sie, wie ChristianGosch in einem Kommentar feststellt, über Ihrem Zweig ein "Merge Commit" erhalten und "nichts zu vergleichen" nicht angezeigt wird. Das scheint für viele Projekte inakzeptabel, für die Sie Zweige erstellen möchten, damit sie ziehen können. Gibt es also wirklich keine Möglichkeit, diese grundlegendsten Workflows für Mitwirkende in Github auszuführen, ohne arkane Git-Befehle auf einem PC auszuführen? Oder sollte ich einfach mein ganzes Repo wegwerfen und jedes Mal neu gabeln, wenn ich etwas beitragen möchte?
Nealmcb




@nealmcb Wird das Problem mit einem "Merge Commit" oben in Ihrem Zweig nicht vermieden, wenn Sie die Basis neu festlegen?
Marko

Antworten:


586

Öffnen Sie das gegabelte Git-Repository me / foobar .

Klicken Sie auf Vergleichen :

Hier ist ein Beispielbild der Seite

Sie erhalten die Benachrichtigung:

Es gibt nichts zu vergleichen.
Jemand: Master ist auf dem neuesten Stand mit allen Commits von mir: Master . Versuchen Sie , die Basis für Ihren Vergleich zu wechseln .

Klicken Sie auf dieser Seite auf Basiswechsel wechseln :

Hier ist ein Beispiel auf der Seite

Dann können Sie alle Commits sehen, die nach dem Tag, an dem Sie sie gegabelt haben, an jemanden / Foobar gemacht wurden .

Klicken Sie auf Pull-Anfrage erstellen :

Hier ist eine Beispielseite

Geben Sie der Pull-Anfrage einen Titel und möglicherweise eine Beschreibung und klicken Sie auf Pull-Anfrage erstellen .

Scrollen Sie auf der nächsten Seite zum Ende der Seite und klicken Sie auf Pull-Anforderung zusammenführen und Zusammenführung bestätigen .

Dein Git-Repository me / foobar wird aktualisiert.

Bearbeiten: Rebase-Optionen werden hier angezeigt:

Geben Sie hier die Bildbeschreibung ein


50
Dies ist verwirrend, da Sie beim Wechseln des Basis-Githubs auf die Seite für das ursprüngliche Repo gelangen. Es scheint also, als würden Sie eine Pull-Anfrage an der Upstream-Gabel öffnen. Aber es funktioniert total.
Eduardo

8
Um die oben erwähnte verwirrende Situation zu vermeiden, klicken Sie besser auf die EditSchaltfläche und wechseln Sie manuell base forkzu me/foobarund head forkzu someone/foobar. Auf diese Weise ist es viel klarer
Macemers

26
Noch eine: Dies funktioniert einwandfrei, wenn Sie dies noch nicht getan haben, aber danach gibt es das "Merge Commit" über Ihrem Commit-Verlauf. Daher wird "nichts zu vergleichen" nicht angezeigt. Stattdessen muss man die Schaltfläche "Bearbeiten" verwenden und Basis und Gabel manuell austauschen, damit dies funktioniert.
Christian Gosch

26
Gibt es keine Möglichkeit, dieses lächerliche Merge-Commit loszuwerden?
Kumarharsh

17
@kumar_harsh Seit September 2016 gibt es jetzt eine "Rebase and Merge" -Option für Pull-Anforderungen, die das Merge-Commit vermeidet.
Waldyrious

41
git remote set-url origin git@github.com:someone/foobar
git remote set-url origin --push git@github.com:me/foobar

Es gibt jedoch eine Einschränkung:
Dies ist perfekt, wenn Sie der einzige sind, der Änderungen an Ihrer Gabel vornimmt.
Wenn es jedoch mit anderen Personen geteilt wird, müssen Sie möglicherweise von Ihrer Gabel ziehen. In diesem Fall ist eine separate Fernbedienung die einzige Lösung.

Edit:
Eigentlich Sie können git pull git@github.com:me/foobar , die entfernt die Einschränkung.
Sie haben die Wahl, an welche Sie sich leichter erinnern können.


8

Ich habe dazu eine ziemlich einfache Methode mit der GitHub-Web-Benutzeroberfläche verwendet:

  1. Öffnen Sie das ursprüngliche Git-Repository (nicht das gegabelte Git-Repository me/foobar).
  2. Wechseln Sie zum Ordner src und öffnen Sie die Datei, die Sie ändern möchten
  3. Klicken Sie auf das Stiftsymbol. Es wird automatisch ein Etikett in Ihrer persönlichen Gabel mit dem Namen "Patch-1" erstellt, das auf der aktuellen Version des Master-Repositorys basiert: Geben Sie hier die Bildbeschreibung ein
  4. Genießen! Geben Sie hier die Bildbeschreibung ein

3
Wenn Sie dies versuchen, wird im Grunde der Editor für die Datei im ursprünglichen Git-Repo geöffnet. Ich habe keine Schreibberechtigung (beabsichtigt) in das ursprüngliche Git-Repo. Es scheint, dass Sie für diese Methode die Datei ändern müssen, da es sonst keine Möglichkeit gibt, die Datei zu "speichern". Ohne das Speichern der Datei konnte ich nicht erreichen, dass Ihr Äquivalent des "Patch-1" -Zweigs in meinem gegabelten Repository angezeigt wird. Was vermisse ich hier?
Electro-Bunny

5

Die "Pull" App ist eine automatische Lösung zum Einrichten und Vergessen. Der Standardzweig Ihrer Gabel wird mit dem Upstream-Repository synchronisiert.

Besuchen Sie die URL, klicken Sie auf die grüne Schaltfläche "Installieren" und wählen Sie die Repositorys aus, in denen Sie die automatische Synchronisierung aktivieren möchten.

Der Zweig wird einmal pro Stunde direkt auf GitHub aktualisiert. Auf Ihrem lokalen Computer müssen Sie den Hauptzweig ziehen, um sicherzustellen, dass Ihre lokale Kopie synchron ist.

Auch beantwortet in https://stackoverflow.com/a/58965171/946850 .


1

Eine andere Möglichkeit ist die Verwendung der Update from upstreamRepoName/masterSchaltfläche in GitHub für Mac (und ich nehme an, GitHub für Windows).

Geben Sie hier die Bildbeschreibung ein


TIL: dass es Apps für GitHub jenseits der Weboberfläche gibt :-) [und es ist eine Schande, dass die Erfahrung über sie nicht einheitlich ist]
Tom Goodfellow

Ich sehe das nicht in Windows
Denis

1
@Denis das ist ihre alte App. Ich bin nicht sicher, ob ihre neue App es hat.
Steve Moser

Aha. Dies funktionierte in "GitHub Desktop" (für Mac, nicht sicher über Windows).
Michaelok

0

Ich weiß nicht, wie es geht, ohne eine weitere Fernbedienung hinzuzufügen, aber ich füge immer das Repo hinzu, von dem ich mich als upstreamFernbedienung gegabelt habe, damit ich einfach Folgendes tun kann:

git branch -a|grep remotes/upstream| while IFS="/" read p r b; do echo Syncing $r/$b to origin/$b; git push origin $r/$b:refs/heads/$b; done

Dadurch werden alle Zweige inkl. Synchronisiert. neue erstellen (entfernen Sie die, refs/heads/um nur vorhandene Zweige zu aktualisieren). Wenn einer Ihrer Zweige auseinander gegangen ist, wird ein Fehler für diesen Zweig ausgegeben.

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.