4264 Stimmen

Rückgängigmachen eines Git-Rebase

Weiß jemand, wie man einen Git-Rebase leicht rückgängig machen kann?

Die einzige Möglichkeit, die mir einfällt, ist, manuell vorzugehen:

  • git checkout die übergeordnete Übergabe an beide Zweige
  • und erstellen Sie von dort aus einen temporären Zweig
  • alle Übertragungen von Hand auswählen
  • den Zweig, in dem ich neu erstellt habe, durch den manuell erstellten Zweig ersetzen

In meiner jetzigen Situation wird das funktionieren, weil ich leicht Commits aus beiden Zweigen erkennen kann (einer war mein Zeug, der andere das Zeug meines Kollegen).

Mein Ansatz erscheint mir jedoch suboptimal und fehleranfällig (nehmen wir an, ich hätte gerade mit 2 meiner eigenen Zweige neu geordnet).

Irgendwelche Ideen?

Klarstellung: Ich spreche von einem Rebase, bei dem eine Reihe von Übertragungen wiedergegeben wurden. Nicht nur einer.

16voto

Andrew Punkte 15913

Wenn Sie keinen Hard-Reset durchführen möchten ...

Sie können den Commit aus dem Reflog auschecken und ihn dann als neuen Zweig speichern:

git reflog

Suchen Sie den Commit kurz bevor Sie mit dem Rebasing begonnen haben. Möglicherweise müssen Sie weiter nach unten scrollen, um sie zu finden (drücken Sie Enter oder PageDown). Notieren Sie sich die HEAD-Nummer und ersetzen Sie 57:

git checkout HEAD@{57}

Überprüfen Sie den Zweig/die Commits, und wenn er korrekt ist, erstellen Sie einen neuen Zweig mit diesem HEAD:

git checkout -b new_branch_name

13voto

Matheus Felipe Punkte 2203

Nach der Lösung von @Allan und @Zearin, ich wünschte, ich könnte einfach einen Kommentar machen, aber ich habe nicht genug Ruf, so habe ich den folgenden Befehl verwendet:

Anstatt zu tun git rebase -i --abort (Beachten Sie die -i ) Ich musste einfach tun git rebase --abort ( ohne die -i ).

Mit beiden -i y --abort Gleichzeitig zeigt mir Git eine Liste von Verwendungen/Optionen an.

Mein bisheriger und aktueller Stand der Verzweigung mit dieser Lösung ist also:

matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

matbhz@myPc /my/project/environment (branch-123)
$

10voto

GuyStalks Punkte 111

Ein anderer Weg die keinen Hard-Reset erfordert ist es, einen neuen Zweig mit dem gewünschten Startpunkt zu erstellen.

Wie bei den anderen Lösungen verwenden Sie das Reflog, um den richtigen Ausgangspunkt zu finden.

git reflog

(Sie können auch verwenden git log -g hier für mehr Details)

Dann vermerken Sie den Verweis auf die SHA-Übertragung (z. B: e86a52b851e ).

Schließlich verwenden Sie den Befehl git branch.

git branch recover-branch e86a52b851e

Referenz: https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery#_data_recovery

6voto

devconsole Punkte 7556

Wenn Sie sich in einer Zweigstelle befinden, können Sie diese benutzen:

git reset --hard @{1}

Es gibt nicht nur ein Referenzprotokoll für HEAD (erhalten durch git reflog ), gibt es auch Reflogs für jeden Zweig (erhalten durch git reflog <branch> ). Wenn Sie also auf master entonces git reflog master werden alle Änderungen an diesem Zweig aufgelistet. Sie können sich auf diese Änderungen beziehen, indem Sie master@{1} , master@{2} , usw.

git rebase wird HEAD in der Regel mehrfach geändert, aber der aktuelle Zweig wird nur einmal aktualisiert.

@{1} ist einfach ein Abkürzung für den aktuellen Zweig also ist es gleich master@{1} wenn Sie auf master .

git reset --hard ORIG_HEAD wird nicht funktionieren, wenn Sie git reset während einer interaktiven rebase .

5voto

Hardev Punkte 9311

Nehmen wir an, ich stelle den Master-Zweig auf meinen Feature-Zweig um und erhalte 30 neue Commits, die etwas kaputt machen. Ich habe festgestellt, dass es oft am einfachsten ist, einfach die schlechten Commits zu entfernen.

git rebase -i HEAD~31

Interaktive Rebase für die letzten 31 Commits (es schadet nicht, wenn Sie zu viele auswählen).

Nehmen Sie einfach die Commits, die Sie loswerden wollen, und markieren Sie sie mit "d" anstelle von "pick". Jetzt werden die Commits gelöscht und der Rebase wird rückgängig gemacht (wenn Sie nur die Commits entfernen, die Sie gerade beim Rebase erhalten haben).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X