Git, wie man eine Rebase zurücksetzt

98

Wie können Sie in Git eine Rebase zurücksetzen, wenn Sie damit nicht zufrieden sind?

Git hat keinen Trockenlauf für Rebase. Wenn ich eine Rebase durchgeführt habe und sie noch nicht gepusht habe, wie kann ich vorher zurücksetzen, als ob es nie passiert wäre?

user1615666
quelle
4
Git Rebase
Olibiaz
2
Was meinst du mit "gescheitert"? Haben Sie vervollständigen das Fütterungsmaterial, und Sie wissen nicht , wie die Ergebnisse? Oder sind Sie auf Konflikte gestoßen und wollten die Rebase in der Mitte stoppen? Ich nehme an den ehemaligen, da Sie nicht können einen Konflikt, unfertige rebase schieben, aber ich frage , weil sie zwei verschiedene Fragen.
Edward Thomson
ja, früher. Vielen Dank.
user1615666
3
Mögliches Duplikat von Rückgängigmachen einer Git-Rebase
Jon Schneider

Antworten:

203

Sie können das Reflog verwenden , um die erste Aktion zu finden, bevor die Rebase gestartet wurde, und dann --hard zurück zu ihr zurücksetzen. z.B

$ git reflog

b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...

$ git reset HEAD@{2} --hard

Jetzt sollten Sie zurück sein, bevor die Rebase gestartet wurde.

Um den richtigen Ort zum Zurücksetzen zu finden, wählen Sie einfach den Eintrag aus, der am nächsten oben liegt und nicht mit "rebase" beginnt.

Alternativer Ansatz

Wenn die Rebase das einzige ist, was Sie in der Verzweigung getan haben, dh Sie haben keine ungezwungenen Commits / Änderungen - dann können Sie die lokale Verzweigung einfach mit löschen git branch -Dund sie dann erneut auschecken :

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

Oder für den gleichen Effekt können Sie --hard auf den Ursprungszweig zurücksetzen:

$ git reset --hard origin/my-branch

Wenn Sie dies getan haben, während Sie andere nicht gedrückte Commits hatten, haben Sie diese verloren. Verwenden Sie in diesem Fall einfach den obigen Reflog-Ansatz, um zu dem Reflog-Eintrag zurückzukehren, in dem Sie die Festschreibung (en) vorgenommen haben.

Robbie
quelle
11
Eine weitere praktische Verknüpfung: Rebase wird ORIG_HEADauf den ursprünglichen Hashwert des Zweigs gesetzt, der neu basiert. Anstatt also die Nummer 2 für zu finden HEAD@{2}, können Sie einfach ORIG_HEAD... verwenden, aber nur, wenn dies ORIG_HEADnoch ungestört ist. Eine Reihe von Git-Befehlen setzen es (Rebase, Am, Reset und Merge unter verschiedenen Umständen).
Torek
1
Danke mein Herr! Große Hilfe dazu :)
Alec
1
danke mein quellcode zurück .... nach verwendung dieses $ git reset HEAD @ {2} --hard
reza rahmad
Erhält meine Gegenstimme für den Vorschlag, den lokalen Zweig einfach zu löschen und erneut abzurufen!
quicklikerabbit
1
Dies ist ein Lebensretter. Vielen Dank @Robbie
Nelson Katale
41

Rebase behält eine Sicherung des alten Status als ORIG_HEAD.
Sie können also die letzte Rebase zurücksetzen, indem Sie Folgendes ausführen:

git reset --hard ORIG_HEAD
Meligy
quelle
1
Wissen Sie zufällig, wo dieses Tag dokumentiert ist?
Ben S
Gibt es einen Nachteil oder ist es eine neue Funktion? Dies scheint so viel einfacher zu sein, als ein Reflog zu sichten.
1252748
Es ist nicht neu. Aber Sie würden es normalerweise direkt nach dem Rebase verwenden, können nach mehreren Rebases usw. nicht nachträglich zurückkehren. In diesen komplexen Situationen würden Sie nach dem Relog-Zeug suchen, aber nur nach "Ups, was habe ich gerade getan? Wie kann ich zurückkehren?" das jetzt?" es funktioniert gut.
Meligy