Frage Rückgängigmachen einer Git-Rebase


Weiß jemand, wie man leicht eine git-Rebase rückgängig macht?

Der einzige Weg, der mir einfällt, ist, es manuell zu machen:

  • git check den Commit-Elternteil an beide Zweige
  • Erstellen Sie dann eine temporäre Verzweigung von dort
  • Cherry-Pick alle Commits von Hand
  • Ersetzen Sie den Zweig, in dem ich rebasiert habe, durch den manuell erstellten Zweig

In meiner derzeitigen Situation wird das funktionieren, weil ich Commits aus beiden Branchen leicht erkennen kann (einer war mein Zeug, der andere war mein Kollege).

Mein Ansatz erscheint mir jedoch als suboptimal und fehleranfällig (sagen wir mal, ich hatte gerade mit 2 meiner eigenen Filialen eine neue Version erstellt).

Irgendwelche Ideen?

Klarstellung: Ich spreche von einer Rebase, während der eine Reihe von Commits wiederholt wurde. Nicht nur eine.


2428
2017-09-25 17:59


Ursprung


Antworten:


Der einfachste Weg wäre, den Head Commit des Zweiges so zu finden, wie er unmittelbar vor dem Beginn des Rebases in der reflog...

git reflog

und den aktuellen Zweig auf ihn zurückzusetzen (mit den üblichen Vorbehalten, absolut sicher zu sein, bevor er mit der --hard Möglichkeit).

Angenommen, das alte Commit war HEAD@{5} im Ref-Protokoll:

git reset --hard HEAD@{5}

In Windows müssen Sie möglicherweise die Referenz angeben:

git reset --hard "HEAD@{5}"

Sie können die Geschichte des Kandidaten alten Kopf überprüfen, indem Sie einfach a git log HEAD@{5} (Windows:  git log "HEAD@{5}").

Wenn Sie Branch Reflogs nicht deaktiviert haben, sollten Sie einfach tun können git reflog branchname@{1} als ein Rebase löst den Zweig Kopf vor dem erneuten Anbringen an den endgültigen Kopf. Ich würde dies überprüfen, obwohl ich dies kürzlich nicht überprüft habe.

Standardmäßig sind alle Reflogs für Nicht-Bare-Repositories aktiviert:

[core]
    logAllRefUpdates = true

3360
2017-09-25 19:56



Eigentlich speichert Rebase Ihren Startpunkt auf ORIG_HEAD Das ist normalerweise so einfach wie:

git reset --hard ORIG_HEAD

Aber die reset, rebase und merge alle speichern dein Original HEAD Zeiger in ORIG_HEAD Wenn Sie also seit der Rebase, die Sie rückgängig machen möchten, einen dieser Befehle ausgeführt haben, müssen Sie den Reflog verwenden.


1166
2018-03-28 13:24



Charles Antwort funktioniert, aber Sie können dies tun:

git rebase --abort

aufräumen nach dem reset.

Andernfalls erhalten Sie möglicherweise die Nachricht "Interactive rebase already started".


317
2017-07-27 18:21



Das Zurücksetzen der Verzweigung auf das Dangling-Commit-Objekt seiner alten Spitze ist natürlich die beste Lösung, da es den vorherigen Zustand ohne Aufwand wiederherstellt. Aber wenn Sie diese Commits verloren haben (zB weil Sie Ihr Repository in der Zwischenzeit müllfrei gesammelt haben oder es sich um einen neuen Klon handelt), können Sie den Zweig immer erneut rebasieren. Der Schlüssel dazu ist die --onto Schalter.

Nehmen wir an, Sie hätten einen Themenzweig phantasievoll genannt topic, dass du abgezweigt hast master wenn die Spitze von master war das 0deadbeef verpflichten. Irgendwann während auf der topic Zweig, hast du git rebase master. Jetzt möchten Sie dies rückgängig machen. Hier ist wie:

git rebase --onto 0deadbeef master topic

Dadurch werden alle Commits ausgeführt topic das ist nicht an master und wiederhole sie oben auf 0deadbeef.

Mit --onto, Sie können Ihre Geschichte in ziemlich viel neu ordnen irgendeine Form.

Habe Spaß. :-)


74
2017-09-26 02:08



Ich habe ein Backup-Tag auf den Zweig gelegt, bevor ich irgendeine nichttriviale Operation mache (die meisten Rebasts sind trivial, aber ich würde das tun, wenn es irgendwo komplex aussieht).

Dann ist das Wiederherstellen so einfach wie git reset --hard BACKUP.


61
2018-05-12 20:57



Im Fall Sie hatten Ihren Zweig in das Remote-Repository verschoben (normalerweise ist es Herkunft) und dann haben Sie eine erfolgreiche Rebase (ohne Merge) (git rebase --abort gibt "No Rebase in progress") können Sie leicht Zweig zurücksetzen verwenden Befehl:

git reset --harte Herkunft / {branchName}

Beispiel:

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.

nothing to commit, working directory clean

52
2017-09-28 12:43



Falls Sie das Rebase nicht und in der Mitte abgeschlossen haben, funktioniert das Folgende:

git rebase --abort

48
2017-10-15 20:20



Denken Sie bei Mehrfach-Commits daran, dass jedes Commit auf den gesamten Verlauf verweist, der zu diesem Commit geführt hat. Also lesen Sie in Charles 'Antwort "das alte Commit" als "das neueste der alten Commits". Wenn Sie auf dieses Commit zurücksetzen, wird der gesamte Verlauf, der zu diesem Commit geführt hat, wieder angezeigt. Dies sollte tun, was Sie wollen.


13
2017-09-25 21:36



Verwenden reflog hat nicht für mich gearbeitet.

Was für mich funktionierte, war ähnlich wie beschrieben Hier. Öffnen Sie die Datei in .git / logs / refs, die nach dem Zweig benannt wurde, der rebasiert wurde, und suchen Sie nach der Zeile, die "rebase finihed" enthält.

5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

Überprüfen Sie das zweite Commit, das in der Zeile aufgeführt ist.

git checkout 88552c8f

Sobald dies bestätigt wurde, enthielt dies meine verlorenen Veränderungen. Ich verzweigte mich und stieß einen Seufzer der Erleichterung aus.

git log
git checkout -b lost_changes

13
2018-02-20 13:59



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

Anstatt zu tun git rebase -i --abort  (beachten Sie das -ich) Musste ich einfach machen git rebase --abort (ohne das -ich).

Mit beiden -i und --abort gleichzeitig veranlaßt Git, mir eine Liste der Benutzung / Optionen zu zeigen.

Also mein früherer und aktueller Zweigstatus mit dieser Lösung ist:

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

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

10
2018-03-11 21:26



Wenn Sie erfolgreich gegen Remote-Zweig rebasiert haben und nicht können git rebase --abort Sie können immer noch ein paar Tricks machen, um Ihre Arbeit zu speichern und haben keine Zwangsstöße. Angenommen, Ihre aktuelle Verzweigung, die fälschlicherweise rebasiert wurde, wird aufgerufen your-branch und verfolgt origin/your-branch

  • git branch -m your-branch-rebased # den aktuellen Zweig umbenennen
  • git checkout origin/your-branch # Checkout zum letzten Status, der bekannt ist
  • git checkout -b your-branch
  • prüfen git log your-branch-rebased, vergleichen mit git log your-branch und definieren Sie Commits, die fehlen your-branch
  • git cherry-pick COMMIT_HASH für jedes Commit in your-branch-rebased
  • Drücken Sie Ihre Änderungen. Bitte beachten Sie, dass zwei lokale Niederlassungen zugeordnet sind remote/your-branch und du solltest nur drücken your-branch

9
2018-06-23 09:23