Zurücksetzen der Fernbedienung auf ein bestimmtes Commit

Ich möchte alle Änderungen, die nach dem Commit <commit-hash> gemacht wurden, verwerfen. Also habe ich das getan:

git reset --hard <commit-hash>

Jetzt möchte ich das Gleiche mit meinem Remote tun. Wie kann ich das machen? Ich habe einige Commits (und Pushes) nach <commit-hash> gemacht und ich möchte sie einfach alle verwerfen. Es ist einfach etwas schrecklich schief gelaufen und ich will es nicht noch schlimmer machen als es schon ist ;(

Ich möchte im Grunde mein origin/master zu <commit-hash> zurückspulen.

Lösung

Unter der Annahme, dass Ihr Zweig sowohl hier als auch in der Ferne master heißt, und dass Ihr Zweig in der Ferne origin heißt, könnten Sie dies tun:

 git reset --hard 
 git push -f origin master

Sie sollten dies jedoch vermeiden, wenn jemand anderes mit Ihrem entfernten Repository arbeitet und Ihre Änderungen übernommen hat. In diesem Fall wäre es besser, revert die Commits, die Sie nicht wollen, und dann wie gewohnt zu pushen.

Aktualisierung: Sie haben unten erklärt, dass andere Leute die Änderungen, die Sie gepusht haben, gezogen haben, also ist es besser, einen neuen Commit zu erstellen, der alle diese Änderungen rückgängig macht. In [Diese Antwort von Jakub Narębski] (https://stackoverflow.com/questions/1463340/revert-multiple-git-commits/1470452#1470452) gibt es eine gute Erklärung der Möglichkeiten, wie man das macht. Welche Methode am besten geeignet ist, hängt davon ab, wie viele Commits Sie rückgängig machen wollen, und welche Methode für Sie am sinnvollsten ist.

Da aus Ihrer Frage klar hervorgeht, dass Sie bereits git reset --hard verwendet haben, um Ihren master Zweig zurückzusetzen, müssen Sie vielleicht damit beginnen, git reset --hard ORIG_HEAD zu verwenden, um Ihren Zweig dorthin zurückzubringen, wo er vorher war. (Wie immer bei git reset --hard, stellen Sie sicher, dass git status sauber ist, dass Sie sich auf dem richtigen Zweig befinden und dass Sie git reflog als Werkzeug kennen, um scheinbar verlorene Commits wiederherzustellen.) Sie sollten auch überprüfen, dass ORIG_HEAD auf den richtigen Commit zeigt, mit git show ORIG_HEAD.

Fehlersuche:

Wenn Sie eine Meldung wie "! [remote rejected] a60f7d85 -> master (pre-receive hook declined)"

dann müssen Sie das Umschreiben des Zweigverlaufs für den betreffenden Zweig erlauben. In BitBucket heißt es zum Beispiel "Rewriting branch history is not allowed". Es gibt eine Checkbox mit dem Namen Allow rewriting branch history, die Sie ankreuzen müssen.

Kommentare (12)

Verwenden Sie die anderen Antworten, wenn es Ihnen nichts ausmacht, lokale Änderungen zu verlieren. Diese Methode kann immer noch Ihr Remote-System zerstören, wenn Sie den falschen Commit-Hash wählen, zu dem Sie zurückgehen wollen.

Wenn Sie nur wollen, dass die Remote mit einem Commit übereinstimmt, der bereits in Ihrem lokalen Zweig ist:

  1. Führen Sie kein Zurücksetzen durch.

  2. Benutzen Sie git log, um den Hash des Commits zu finden, den Sie in der entfernten Version haben wollen. Mit git log -p sehen Sie die Änderungen, oder mit git log --graph --all --oneline --decorate sehen Sie einen kompakten Baum. (Letzteres als Alias in Ihrer Shell zu haben, ist sehr praktisch).

  3. Kopiere den Hash.

  4. Führen Sie einen Befehl aus wie:

     git push --force  :

    z.B..

     git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
Kommentare (11)

Ich habe ein ähnliches Problem wie Ihres mit diesen Befehlen gelöst:

git reset --hard  
git push -f  : 
Kommentare (0)