Bereinigen Sie einen Fork und starten Sie ihn vom Upstream neu

Lesezeit: 6 Minuten

Bereinigen Sie einen Fork und starten Sie ihn vom Upstream
tampe125

Ich habe ein Repository gegabelt, dann habe ich einige Änderungen vorgenommen und es sieht so aus, als hätte ich alles durcheinander gebracht.

Ich möchte es noch einmal von vorne beginnen und den aktuellen Upstream/Master als Basis für meine Arbeit verwenden.
Soll ich mein Repository rebasen oder es überhaupt löschen?

  • Sehr komplexe Antworten auf eine einfache Frage. Löschen Sie einfach alles und klonen Sie das Repository erneut.

    – Jaza

    5. Januar 2019 um 14:37 Uhr

  • @Yaza, nein, das könnte dir in manchen Szenarien noch mehr Ärger bereiten.

    – Shimmy Weitzhandler

    10. Juli 2019 um 20:16 Uhr


  • @shimmy, nicht wenn du wieder von vorne anfangen willst, wie OP gefragt hat.

    – Jaza

    28. August 2019 um 11:41 Uhr

Bereinigen Sie einen Fork und starten Sie ihn vom Upstream
VonC

Die einfachste Lösung wäre (mit ‘upstream‘ als entfernter Name, der auf das ursprüngliche geforkte Repo verweist):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(Ähnlich wie dies GitHub-Seite, Abschnitt „Was soll ich tun, wenn ich in einer schlechten Situation bin?“)

Beachten Sie, dass Sie Änderungen verlieren können, die auf der vorgenommen wurden master sich verzeigen (beides vor Ort, wegen der reset --hardund auf der entfernten Seite, wegen der push --force).

Eine Alternative wäre, wenn Sie Ihre Commits beibehalten möchten masterum diese Commits zusätzlich zum aktuellen abzuspielen upstream/master.
Ersetzen Sie das Reset-Teil durch a git rebase upstream/master. Sie müssen dann immer noch Push erzwingen.
Siehe auch “Was soll ich tun, wenn ich in einer schlechten Situation bin?


Eine vollständigere Lösung zum Sichern Ihrer aktuellen Arbeit (nur für den Fall) wird in „Git-Master-Zweig bereinigen und Commit in einen neuen Zweig verschieben“ beschrieben.

Siehe auch „Neue Updates aus dem ursprünglichen GitHub-Repository in das gegabelte GitHub-Repository ziehen“, um zu veranschaulichen, was „upstream” ist.

stromaufwärts


Hinweis: Aktuelle GitHub-Repos tun dies beschütze die master sich verzeigen gegen push --force.
Sie müssen also den Schutz aufheben master zuerst (siehe Bild unten) und dann Schützen Sie es erneut, nachdem Sie es gewaltsam gedrückt haben).

Geben Sie hier die Bildbeschreibung ein


Hinweis: Speziell auf GitHub gibt es jetzt (Februar 2019) eine Verknüpfung zum Löschen von Fork-Repositorys für Pull-Anforderungen, die Upstream zusammengeführt wurden.

  • hallo hat super geklappt! Übrigens ist die korrekte Reset-Syntax git reset --hard upstream/master

    – tampe125

    11. März 2012 um 12:11 Uhr

  • @ tampe125 Ausgezeichnet. Ich habe die Syntax von korrigiert git reset in der Antwort.

    – VonC

    11. März 2012 um 13:57 Uhr

  • @Benubird Ok, ich habe die Antwort bearbeitet, um das Relevante hinzuzufügen git remote add Befehl.

    – VonC

    13. August 2014 um 9:39 Uhr

  • ich habe fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree an git reset --hard upstream/master

    – Bogdan

    25. März 2020 um 8:40 Uhr

  • @ShimmyWeitzhandler Ja, durch Skript: stackoverflow.com/a/58372324/6309

    – VonC

    21. Juli 2020 um 5:08 Uhr

Ich liebe die Antwort von VonC. Hier ist eine einfache Version davon für Anfänger.

Es gibt eine Git-Fernbedienung namens origin was euch sicher allen bekannt ist. Grundsätzlich können Sie einem Git-Repo beliebig viele Remotes hinzufügen. Was wir also tun können, ist eine neue Fernbedienung einzuführen, die das ursprüngliche Repo ist, nicht die Gabel. Ich nenne es gerne original

Fügen wir unserem Fork Original-Repos als Remote hinzu.

git remote add original https://git-repo/original/original.git

Lassen Sie uns nun das ursprüngliche Repo abrufen, um sicherzustellen, dass wir die neueste Codierung haben

git fetch original

Stellen Sie, wie VonC vorgeschlagen hat, sicher, dass wir auf dem Master sind.

git checkout master

Um unseren Fork jetzt mit dem neuesten Code auf dem Original-Repo auf den neuesten Stand zu bringen, müssen wir nur noch unseren Master-Zweig in Übereinstimmung mit der Original-Fernbedienung hart zurücksetzen.

git reset --hard original/master

Und du bist fertig 🙂

  • Ich erhalte fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree. auf dem letzten Schritt. Irgendein Rat?

    – TomNorwegen

    13. Februar 2017 um 12:24 Uhr

  • Es scheint, dass Sie dadurch nur noch Aktien in der ursprünglichen Remote-Filiale haben. Ich nehme an, dass hier ein Schritt fehlt, um IHRE Gabel wieder auf die richtige Fernbedienung zurückzusetzen?

    – Ray Sülzer

    29. April 2017 um 20:42 Uhr

  • original ist besser als upstream (die Github-Dokumente verwenden), as origin/master ist “stromaufwärts” von local master. Reduziert Mehrdeutigkeiten. Ich frage mich, ob Sie es deshalb verwenden?

    – vaughn

    6. Juli 2017 um 9:58 Uhr


  • Genau dafür verwende ich es!

    – Ahmad Awais

    6. Juli 2017 um 17:36 Uhr

  • Ich habe diese Anweisungen befolgt und jetzt sagt git status: On branch master Your branch und ‘origin/master’ have diverged, and have 52 bzw. 5 different commits. (Verwenden Sie “git pull”, um den Remote-Zweig mit Ihrem zusammenzuführen) – aber ich möchte meine 5 Commits verwerfen. Was ist der nächste Schritt?

    – Stevey

    19. Juli 2017 um 23:45 Uhr

1646263091 785 Bereinigen Sie einen Fork und starten Sie ihn vom Upstream
Hugodby

Nach @VonC großartige Antwort. Ihre GitHub-Unternehmensrichtlinie lässt möglicherweise kein „Force Push“ auf Master zu.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

Wenn Sie eine Fehlermeldung wie diese erhalten, versuchen Sie bitte die folgenden Schritte.

Um Ihre Gabel effektiv zurückzusetzen, müssen Sie die folgenden Schritte ausführen:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

Öffnen Sie Ihren Fork auf GitHub, wählen Sie unter “Settings -> Branches -> Default branch” ‘new_master’ als neuen Default-Branch aus. Jetzt können Sie Push auf den ‚master‘-Zweig erzwingen:

git checkout master
git push --force origin

Dann müssen Sie in den GitHub-Einstellungen „master“ als Standard-Branch zurücksetzen. So löschen Sie „tmp_master“:

git push origin --delete tmp_master
git branch -D tmp_master

Andere Antworten, die vor dem Verlust Ihrer Änderung warnen, gelten weiterhin, seien Sie vorsichtig.

1646263091 341 Bereinigen Sie einen Fork und starten Sie ihn vom Upstream
Daniel Tonon

Wie es zu 100% durch die Sourcetree-GUI

(Nicht jeder macht gerne Dinge über die Git-Befehlszeilenschnittstelle)

Sobald dies eingerichtet ist, müssen Sie von da an nur noch die Schritte 7-13 ausführen.

Fetch > checkout master branch > reset to their master > Push changes to server

Schritte

  1. In der Menüleiste am oberen Bildschirmrand: „Repository“ > „Repository-Einstellungen“

„Repository“ in der oberen Menüleiste hervorgehoben

  1. “Addieren”

Schaltfläche "Hinzufügen" am unteren Rand des Dialogfelds

  1. Gehen Sie zurück zu GitHub und kopieren Sie die Klon-URL.

Schaltfläche „Klonen oder herunterladen“ auf der Github-Website, gefolgt von der Git-URL

  1. Fügen Sie die URL in das Feld “URL / Pfad” ein und geben Sie ihr einen sinnvollen Namen. Ich habe es „Meister“ genannt. Aktivieren Sie nicht das Kontrollkästchen “Standard-Fernbedienung”.. Sie können nicht direkt auf dieses Repository pushen.

Die Felder „Remote-Name“ und „URL/Pfad“ sind im Dialog „Remote-Details“ hervorgehoben

  1. Drücken Sie “OK” und Sie sollten sehen, dass es jetzt in Ihrer Liste der Repositories erscheint.

„Master“-Repository zur Liste der Repositories im Dialog „Repository-Einstellungen“ hinzugefügt

  1. Drücken Sie erneut “OK” und Sie sollten es in Ihrer Liste der “Fernbedienungen” sehen.

„Master“-Repository in der Remotes-Liste in der Seitenleiste hervorgehoben

  1. Klicken Sie auf die Schaltfläche “Abrufen” (oben links im Kopfbereich des Quellbaums)

Schaltfläche "Abrufen" im Kopfbereich

  1. Stellen Sie sicher, dass das Kontrollkästchen “Von allen Fernbedienungen abrufen” aktiviert ist, und drücken Sie “OK”.

Markierungsfeld "Von allen Remotes abrufen" im Dialogfeld "Abrufen" hervorgehoben

  1. Doppelklicken Sie auf Ihren “Master”-Zweig, um ihn auszuchecken, falls er noch nicht ausgecheckt ist.

  2. Suchen Sie den Commit, auf den Sie zurücksetzen möchten. Wenn Sie das Repo „Master“ genannt haben, möchten Sie höchstwahrscheinlich den Commit mit dem „Master/Master“-Tag darauf finden.

Beispiel für ein Commit mit einem „master/master“-Tag darauf

  1. Klicken Sie mit der rechten Maustaste auf den Commit > „Aktuellen Zweig auf diesen Commit zurücksetzen“.

  2. Setzen Sie im Dialog das Feld „Using mode:“ auf „Hard – discard all working copy changes“ und drücken Sie dann „OK“ (achten Sie darauf, alle Änderungen, die Sie nicht verlieren möchten, zuerst in einen separaten Zweig zu legen).

Feld „Using mode“ im Dialogfeld „Reset to commit“ hervorgehoben.  Es ist auf "alle Änderungen der Arbeitskopie verwerfen" eingestellt.

  1. Klicken Sie auf die Schaltfläche „Push“ (oben links im Header-Bereich des Quellbaums), um die Änderungen in Ihre Kopie des Repositorys hochzuladen.

Schaltfläche „Push“ im Kopfbereich

Du bist fertig!

917160cookie-checkBereinigen Sie einen Fork und starten Sie ihn vom Upstream neu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy