524 Stimmen

Bereinigen Sie einen Fork und starten Sie ihn vom Upstream aus neu

Ich habe ein Repository geforkt, dann habe ich einige Änderungen vorgenommen und es sieht so aus, als ob ich alles durcheinander gebracht habe.

Ich möchte noch einmal von vorne anfangen und den aktuellen Upstream/Master als Grundlage für meine Arbeit verwenden.
Sollte ich mein Repository neu erstellen oder es überhaupt löschen?

1039voto

VonC Punkte 1117238

Die einfachste Lösung wäre (mit ' upstream ' als Remote-Name, der auf das ursprüngliche Repository 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 bei dieser GitHub-Seite, Abschnitt "Was soll ich tun, wenn ich mich in einer schlechten Situation befinde?" )

Beachten Sie, dass Sie Änderungen, die Sie auf dem master Zweigstelle (sowohl lokal, wegen der reset --hard und auf der anderen Seite, wegen der push --force ).

Eine Alternative wäre, wenn Sie Ihre Commits auf master um diese Übertragungen zusätzlich zur aktuellen upstream/master .
Ersetzen Sie das Rückstellteil durch ein git rebase upstream/master . Sie müssen dann immer noch den Druck erhöhen.
Siehe auch " Was sollte ich tun, wenn ich mich in einer schwierigen Situation befinde? "


Eine umfassendere Lösung, bei der Sie Ihre aktuelle Arbeit sichern (nur für den Fall), finden Sie in " Aufräumen des Git-Master-Zweigs und Verschieben einiger Commits in den neuen Zweig ".

Siehe auch " Neue Aktualisierungen aus dem ursprünglichen GitHub-Repository in das geforkete GitHub-Repository ziehen " zur Veranschaulichung dessen, was " upstream " ist.

upstream


Hinweis: Aktuelle GitHub-Repos tun Schutz der master Zweigstelle gegen push --force .
Sie müssen also den Schutz aufheben master zuerst (siehe Abbildung unten) und dann sie nach dem gewaltsamen Eindrücken wieder zu schützen ).

enter image description here


Hinweis: Auf GitHub gibt es speziell die jetzt (Februar 2019) eine Abkürzung zum Löschen von geforkten Repos für Pull Requests, die stromaufwärts zusammengeführt wurden.

43voto

Ahmad Awais Punkte 28098

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

Es gibt eine Git-Remote namens origin die Sie sicher alle kennen. Grundsätzlich können Sie so viele Fernzugänge zu einem Git-Repository hinzufügen, wie Sie wollen. Was wir also tun können, ist, eine neue Remotestruktur einzuführen, die das ursprüngliche Projektarchiv und nicht den Fork darstellt. Ich nenne es gerne original

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

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

Holen wir uns nun das Original-Repository, um sicherzustellen, dass wir den neuesten Code haben

git fetch original

Wie VonC vorgeschlagen hat, stellen Sie sicher, dass wir auf dem Master sind.

git checkout master

Um unseren Fork auf den neuesten Stand zu bringen, müssen wir nur unseren Master-Zweig in Übereinstimmung mit dem Original-Remote zurücksetzen.

git reset --hard original/master

Und schon sind Sie fertig :)

11voto

Hugodby Punkte 1064

Nach @VonC großartige Antwort. Ihre GitHub-Firmenpolitik erlaubt möglicherweise kein "Force Push" auf Master.

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 "Einstellungen -> Zweige -> Standardzweig" 'new_master' als neuen Standardzweig. Jetzt können Sie einen Push auf den "master"-Zweig erzwingen:

git checkout master
git push --force origin

Dann müssen Sie in den GitHub-Einstellungen "master" als Standardzweig 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 des Wechselgeldes warnen, gelten immer noch, seien Sie vorsichtig.

6voto

Daniel Tonon Punkte 7885

Wie man es zu 100% durch die Sourcetree GUI

(Nicht jeder mag es, Dinge über die Git-Befehlszeilenschnittstelle zu erledigen)

Sobald dies eingerichtet ist, brauchen Sie nur noch die Schritte 7-13 auszuführen.

Holen > Auschecken des Masterzweigs > Zurücksetzen auf den Masterzweig > Änderungen auf den Server übertragen

Schritte

  1. In der Menü-Symbolleiste am oberen Rand des Bildschirms: "Repository" > "Repository-Einstellungen"

"Repository" highlighted in the top menu bar

  1. "Hinzufügen"

"Add" button at the bottom of the dialog

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

"Clone or Download" button on the Github website followed by the git url

  1. Fügen Sie die URL in das Feld "URL / Pfad" ein und geben Sie ihr einen sinnvollen Namen. Ich habe sie "Master" genannt. Aktivieren Sie nicht das Kontrollkästchen "Standardfernbedienung". . Es ist nicht möglich, direkt in dieses Repository zu pushen.

"Remote name" and "URL / Path" fields highlighted in the"Remote details" dialog

  1. Drücken Sie auf "OK" und Sie sollten es jetzt in Ihrer Liste der Repositories sehen.

"master" repository added to the list of repositories in the "Repository settings" dialog

  1. Drücken Sie erneut auf "OK", und Sie sollten sehen, dass sie in Ihrer Liste der "Fernbedienungen" erscheint.

"master" repository highlighted in remotes list in side bar

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

"Fetch" button in the header area

  1. Vergewissern Sie sich, dass das Kontrollkästchen "Von allen Fernbedienungen abrufen" aktiviert ist, und drücken Sie "ok".

"Fetch from all remotes" checkbox highlighted in the "Fetch" dialog

  1. Doppelklicken Sie auf Ihren "Master"-Zweig, um ihn auszuchecken, wenn er nicht bereits ausgecheckt ist.

  2. Suchen Sie den Commit, auf den Sie zurücksetzen wollen. Wenn Sie das Projektarchiv "master" genannt haben, werden Sie wahrscheinlich den Commit mit dem Tag "master/master" suchen.

Example of a commit with a "master/master" tag on it

  1. Klicken Sie mit der rechten Maustaste auf die Übertragung > "Aktuelle Verzweigung auf diese Übertragung zurücksetzen".

  2. Setzen Sie im Dialogfeld das Feld "Verwendungsmodus:" auf "Hart - alle Änderungen der Arbeitskopie verwerfen" und drücken Sie dann auf "OK" (stellen Sie sicher, dass Sie alle Änderungen, die Sie nicht verlieren wollen, zuerst in einen separaten Zweig legen).

"Using mode" field highlighted in the "Reset to commit" dialog. It is set to "discard all working copy changes"

  1. Klicken Sie auf die Schaltfläche "Push" (oben links im Kopfbereich des Quellbaums), um die Änderungen in Ihre Kopie des Repos hochzuladen.

"Push" button in the header area

Sie sind fertig!

1voto

Craig Hicks Punkte 1394

VonCs Antwort lautet

Seien Sie sich bewusst, dass Sie Änderungen am Master-Zweig verlieren können (sowohl lokal, wegen reset --hard, als auch auf der entfernten Seite, wegen push --force).

Ich werde also nur beschreiben, wie man einen neuen Zweig im bestehenden Fork erstellt, der die main Zweig des Projektarchivs, von dem ursprünglich abgezweigt wurde.

Warum dies wichtig sein kann: Angenommen, Sie haben bereits einen anderen Pull Request für eine andere Funktion aus dem gleichen Fork eingereicht. Oder jemand anderes hat sich von Ihrer Abspaltung abgespalten. Dann ist ein Hard Reset schlecht.

Angenommen, die Abzweigung aus der Ferne heißt upstream .

git fetch upstream main
git switch -c upstreamb/main/track upstream/main

Sie werden in einer neuen Niederlassung sein upstreamb/main/track

% git branch 
...
* upstreamb/main/track
% git pull upstream main
From github.com:XXXX/YYYY
 * branch                  main       -> FETCH_HEAD
Already up to date.

Beachten Sie, dass / im Namen der Verzweigung ist erlaubt. Um Verwirrung und Mehrdeutigkeit zu vermeiden, habe ich Folgendes hinzugefügt b auf "Upstream", um anzuzeigen, dass es sich um einen lokalen Zweig handelt.

Jetzt können Sie einen neuen Feature-Zweig aus der Spur erstellen, und Sie können git difftool oder was auch immer, um das aufgegebene Werk selektiv zu vergleichen und zu kopieren, falls erforderlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X