Reinigen Sie eine Gabel und starten Sie sie von oben neu

396

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

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

tampe125
quelle
4
Sehr komplexe Antworten auf eine einfache Frage. Löschen Sie einfach alles und klonen Sie das Repository erneut.
Yaza
1
@Yaza, nein, dies könnte in einigen Szenarien noch mehr Probleme verursachen.
Shimmy Weitzhandler
@shimmy, nicht wenn du wieder von vorne anfangen willst wie OP gefragt.
Yaza

Antworten:

796

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

Beachten Sie, dass Sie Änderungen verlieren können, die in der masterVerzweigung vorgenommen wurden (sowohl lokal aufgrund der reset --hardals auch auf der Remote-Seite aufgrund der push --force).

Eine Alternative wäre, wenn Sie Ihre Commits beibehalten möchten, masterdiese Commits zusätzlich zum aktuellen wiederzugeben upstream/master.
Ersetzen Sie das Rücksetzteil durch a git rebase upstream/master. Sie müssen dann noch Druck 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) finden Sie unter " Bereinigen des Git-Hauptzweigs und Verschieben eines Commits in einen neuen Zweig ".

Siehe auch " Neue Updates aus dem ursprünglichen GitHub-Repository in das gespaltene GitHub-Repository ziehen ", um zu veranschaulichen, was " upstream" ist.

stromaufwärts


Hinweis: Aktuelle GitHub-Repos schützen den masterZweig davor push --force.
Sie müssen also masterzuerst den Schutz aufheben (siehe Bild unten) und ihn dann nach dem Druck auf die Kraft erneut schützen .

Geben Sie hier die Bildbeschreibung ein


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

VonC
quelle
4
Hallo, es hat super funktioniert! Übrigens ist die korrekte Reset-Syntaxgit reset --hard upstream/master
tampe125
1
@ tampe125 Ausgezeichnet. Ich habe die Syntax von git resetin der Antwort festgelegt.
VonC
fatal: 'upstream' scheint kein Git-Repository zu sein
Benubird
@Benubird, das ist der Name der Fernbedienung, die auf das ursprüngliche Repo verweist (das, das Sie gegabelt haben): Siehe das Diagramm und die " git remote" Befehle in stackoverflow.com/a/3903835/6309 .
VonC
Richtig, aber aus Ihrer Frage geht nicht hervor, wie das eingerichtet werden soll, da "Upstream" standardmäßig nicht in der Befehlszeile definiert ist, da ich über Github gegabelt habe.
Benubird
31

Liebe VonCs Antwort. Hier ist eine einfache Version für Anfänger.

Es gibt eine Git-Fernbedienung namens, von originder Sie sicher alle wissen. Grundsätzlich können Sie einem Git-Repo so viele Fernbedienungen hinzufügen, wie Sie möchten. Wir können also eine neue Fernbedienung einführen, die das ursprüngliche Repo und nicht die Gabel ist. Ich nenne es gerneoriginal

Fügen wir unserer Gabel Original-Repos als Fernbedienung hinzu.

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

Holen wir uns jetzt das Original-Repo, um sicherzustellen, dass wir das neueste codiert haben

git fetch original

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

git checkout master

Um unsere Gabel mit dem neuesten Code für das Original-Repo auf den neuesten Stand zu bringen, müssen wir lediglich unseren Hauptzweig gemäß der Originalfernbedienung hart zurücksetzen.

git reset --hard original/master

Und du bist fertig :)

Ahmad Awais
quelle
2
Ich komme fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.zum letzten Schritt. Irgendein Rat?
TomNorway
Es sieht so aus, als ob Sie nur noch den ursprünglichen Remote-Zweig auf Lager haben. Ich gehe davon aus, dass hier ein Schritt zum Zurücksetzen IHRER Gabel auf die richtige Fernbedienung fehlt.
Ray Suelzer
1
originalist besser als upstream(was Github-Dokumente verwenden), ebenso origin/masterwie "Upstream" von lokal master. Reduziert Mehrdeutigkeiten. Ich frage mich, ob Sie es deshalb benutzen.
Vaughan
1
Genau deshalb benutze ich es!
Ahmad Awais
2
Ich habe diese Anweisungen befolgt und jetzt sagt der Git-Status: Auf Zweigstellen-Master Ihre Zweigstelle und 'Ursprung / Master' sind auseinander gegangen und haben jeweils 52 bzw. 5 verschiedene 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?
user3562927
6

Nach @VonC tolle Antwort. Ihre GitHub-Unternehmensrichtlinie erlaubt möglicherweise keinen "Force Push" für den Master.

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

Wenn Sie eine Fehlermeldung wie diese erhalten, führen Sie bitte die folgenden Schritte aus.

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 Ihre Gabel auf GitHub und wählen Sie unter "Einstellungen -> Zweige -> Standardzweig" 'new_master' als neuen Standardzweig. Jetzt können Sie den 'Master'-Zweig erzwingen:

git checkout master
git push --force origin

Dann müssen Sie 'master' als Standardzweig in den GitHub-Einstellungen 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 Ihres Wechsels warnen, gelten weiterhin. Seien Sie vorsichtig.

Hugodby
quelle
4

Wie es 100% über die Sourcetree GUI geht

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

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

Abrufen> Checkout-Hauptzweig> Auf Master zurücksetzen> Änderungen an Server übertragen

Schritte

  1. In der Menüsymbolleiste oben auf dem Bildschirm: "Repository"> "Repository-Einstellungen"

"Repository" in der oberen Menüleiste hervorgehoben

  1. "Hinzufügen"

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

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

Klicken Sie auf der Github-Website auf die Schaltfläche "Klonen oder Herunterladen", gefolgt von der Git-URL

  1. Fügen Sie die URL in das Feld "URL / Pfad" ein und geben Sie einen sinnvollen Namen ein. Ich nannte es "Meister". Aktivieren Sie nicht das Kontrollkästchen "Standardfernbedienung" . Sie können nicht direkt in dieses Repository pushen.

Die Felder "Remote-Name" und "URL / Pfad" werden im Dialogfeld "Remote-Details" hervorgehoben

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

Das Repository "master" wurde der Liste der Repositorys im Dialogfeld "Repository-Einstellungen" hinzugefügt

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

"Master" -Repository in der Fernbedienungsliste 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".

Das Kontrollkästchen "Von allen Fernbedienungen abrufen" ist im Dialogfeld "Abrufen" markiert

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

  2. Suchen Sie das Commit, auf das Sie zurücksetzen möchten. Wenn Sie das Repo "master" genannt haben, möchten Sie höchstwahrscheinlich das Commit mit dem Tag "master / master" finden.

Beispiel für ein Commit mit einem "master / master" -Tag

  1. Klicken Sie mit der rechten Maustaste auf das Commit> "Aktuellen Zweig auf dieses Commit zurücksetzen".

  2. Setzen Sie im Dialogfeld das Feld "Verwendungsmodus:" auf "Alle Änderungen an Arbeitskopien verwerfen" und drücken Sie "OK" (stellen Sie sicher, dass alle Änderungen, die Sie nicht verlieren möchten, zuerst in einem separaten Zweig gespeichert werden).

Das Feld "Verwenden des Modus" wird im Dialogfeld "Auf Festschreiben zurücksetzen" hervorgehoben.  Es ist auf "Alle Änderungen an der Arbeitskopie verwerfen" eingestellt.

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

"Push" -Taste im Header-Bereich

Du bist fertig!

Daniel Tonon
quelle