Wie kann ich den Hauptzweig auf ein Tag in Git zurücksetzen?

86

Wir haben Niederlassungen Ursprung und entwickeln. Der Ausgangszustand des Masters wurde mit markiert tag_ABC.

Wir haben nur wenige Änderungen am Entwicklungszweig vorgenommen und den Ursprung vorangetrieben. Dann haben wir versehentlich die Entwicklung zum Meister zusammengeführt und zum Ursprung gedrängt.

Jetzt möchten wir den Master auf den Checkpoint zurücksetzen tag_ABC. Wie können wir das machen?

Manjunath Manoharan
quelle

Antworten:

161

Du kannst tun

git checkout master
git reset --hard tag_ABC
git push --force origin master

Bitte beachten Sie, dass dies den vorhandenen Verlauf im Upstream-Repo überschreibt und Probleme für andere Entwickler verursachen kann, die dieses Repo ausgecheckt haben.

Paweł Obrok
quelle
5
Auf diese Weise werden alle Zweige mit Gewalt geschoben. Vielleicht möchten Sie versuchengit push --force origin master
Danza
1
Um zum vorherigen Commit zurückzukehren, können Sie einengit reset --hard HEAD^
Geoff
1
BTW git reset --hard HEAD^kann mehrmals verwendet werden, um jeweils ein Commit zurückzusetzen, und git push --force origin masterkann dann verwendet werden, wenn es sich um ein Remote-Commit handelt .
Luke Wenke
Auch um den Hauptzweig der lokalen Kopien anderer Leute auf die frühere Version zurückzusetzen, verwenden Sie git pullundgit reset --hard origin/master
Luke Wenke
Ein kleiner Rat nach dieser Rückkehr könnte dem Team gesagt werden: Ziehen Sie aus der Hauptniederlassung! Vielen Dank!!
JRichardsz
81

Dies ist keine direkte Antwort auf die Frage, aber diese Seite wird wieder angezeigt, wenn nach Möglichkeiten gesucht wird, den Code eines Zweigs in eine Tag-Version zurückzusetzen.

Eine andere Möglichkeit besteht darin, einen Unterschied zwischen dem aktuellen Status des Zweigs und dem Tag zu erstellen, zu dem Sie zurückkehren möchten, und diesen dann auf den Zweig anzuwenden. Dies hält den Versionsverlauf korrekt und zeigt die Änderungen an, die eingehen und dann wieder herauskommen.

Angenommen, Ihr Zweig heißt master und das Tag, zu dem Sie zurückkehren möchten, heißt 1.1.1

git checkout 1.1.1
git diff master > ~/diff.patch
git checkout master
cat ~/diff.patch | git apply
git commit -am 'Rolled back to version 1.1.1'
git push origin master
John
quelle
17
Dies sollte die akzeptierte Antwort sein, da sie den Verlauf intakt hält und keine Probleme für andere verursacht, die das Repo ausgecheckt haben.
OpenUserX03
1
Das scheint elegant. Aber ich habe versucht, den qa-Zweig auf ein vorheriges Tag zurückzusetzen und habe gerade Patch-Fehlermeldungen erhalten. $ cat ../diff_qa.patch | git apply <stdin>: 55: nachfolgendes Leerzeichen. <stdin>: 336: Leerzeichen nachlaufen. <stdin>: 12692: nachfolgendes Leerzeichen. <stdin>: 12695: nachfolgendes Leerzeichen. <li> {{$ tag ['rank'] + 1}}: <stdin>: 12706: nachfolgendes Leerzeichen. Fehler: Patch fehlgeschlagen: .env.wholo: 1
Rickatech
Ich habe mehrere Lösungen ausprobiert, aber keine davon hat funktioniert. Dieser wirkte wie ein Zauber. Vielen Dank @John
Strabek
Dies ist der richtige Weg. Es ist zerstörungsfrei und bewahrt die gesamte Geschichte
Nitin Bansal
Das funktioniert bei mir nicht. Ich kann die ersten 3 Befehle ohne Probleme ausführen, aber wenn ich das tue cat ~/diff.patch | git apply, sagt es mir error: unrecognized input. Irgendeine Idee? @NitinBansal vielleicht seit du kürzlich kommentiert hast?
Experience111