Zurücksetzen eines Remote-Git-Repositorys

111

Ich habe ein entferntes Git-Repository und muss die letzten nCommits in Vergessenheit geraten lassen.

Jake
quelle

Antworten:

135

Sie können git revert <commit>…für alle n Commits verwenden und dann wie gewohnt pushen, wobei der Verlauf unverändert bleibt.

Oder Sie können mit "zurückrollen" git reset --hard HEAD~n. Wenn Sie in ein öffentliches oder freigegebenes Repository pushen, können Sie aufgrund Ihres ursprünglichen Zweigs von anderen Arbeiten abweichen und diese unterbrechen. Git wird Sie daran hindern, aber Sie können git push -fdas Update erzwingen.

Elmarco
quelle
5
Sie können ein Rollback auf ein bestimmtes Commit durchführen, indem Sie git reset --hard [sha1]Folgendes verwenden: wobei sha1 die Commit-Hash-ID ist.
Pisaruk
7
Sie können get reset --hard nicht in einem Remote-Repository verwenden, da kein Arbeitsverzeichnis vorhanden ist. Die ursprüngliche Frage besagt nur, dass es ein Remote-Repo gibt, es wird kein lokales Repo erwähnt.
Hazok
2
Nur eine Anmerkung, Git Push-F wird alle lokalen Filialen zu ihren Fernbedienungen
zwingen
Beachten Sie bitte, dass bei Verwendung revertIhre Feature-Zweige als "bereits" zusammengeführt behandelt werden. Das ist , weil diese Zweige sind verschmolzen tatsächlich sind. Aber die Änderungen wurden rückgängig gemacht. Lösung: Kirsche-Pick oder die revert begehen zurückkehren .
Benedikt
@Benedikt bewirkt das reset --hardauch, dass die Feature-Zweige als bereits zusammengeführt behandelt werden? Ich gehe davon aus, dass dies nicht der Fall ist (wo revert).
Marcus Leon
37

elmarco ist richtig ... sein Vorschlag ist der beste für gemeinsam genutzte / öffentliche Repositories (oder zumindest öffentliche Zweige). Wenn es nicht geteilt wurde (oder Sie bereit sind, andere zu stören), können Sie auch einen bestimmten Verweis drücken:

git push origin old_master:master

Wenn es ein bestimmtes Commit SHA1 gibt (z. B. 1e4f99e in Kurzform), möchten Sie zu Folgendem zurückkehren:

git push origin 1e4f99e:master
Pat Notz
quelle
9

Glücklicherweise war ich in der Lage, Pat Notz 'Lösung zu verwenden, die das unerwünschte Commit vollständig beseitigte. Zunächst bekam ich jedoch den Fehler

error: failed to push some refs to 'ssh://[email protected]'
To prevent you from losing history, non-fast-forward updates were rejected*

Durch Hinzufügen der -fOption force ( ) wird dieser Fehler jedoch überschrieben

git push -f origin 52e36b294e:master
geedoubleya
quelle
3

Wenn Sie direkten Zugriff auf das Remote-Repo haben, können Sie immer Folgendes verwenden:

git reset --soft <sha1>

Dies funktioniert, da nicht versucht wird, das nicht vorhandene Arbeitsverzeichnis zu ändern. Weitere Details finden Sie in der Originalantwort:

Wie kann ich das letzte Commit in einem Git Bare-Repository aufheben?

Hazok
quelle
2
Warum sollte es --softüberhaupt notwendig sein? Sie könnten wahrscheinlich dasselbe mit einfachem git resetModus ohne das Modus-Flag tun .