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.

5885voto

CB Bailey Punkte 693084

Am einfachsten ist es, die Hauptübergabe des Zweigs zu finden, wie sie unmittelbar vor dem Beginn der Neuvergabe in der Datei reflog ...

git reflog

und den aktuellen Zweig darauf zurückzusetzen (mit den üblichen Vorbehalten, dass man sich absolut sicher sein muss, bevor man mit der Option --hard Option).

Angenommen, der alte Commit war HEAD@{2} im Schiedsrichterprotokoll:

git reset --hard HEAD@{2}

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

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

Sie können die Historie des alten Kopfes des Kandidaten überprüfen, indem Sie einfach eine git log HEAD@{2} ( Fenster: git log "HEAD@{2}" ).

Wenn Sie Reflogs pro Zweig nicht deaktiviert haben, sollten Sie einfach Folgendes tun können git reflog branchname@{1} da bei einem Rebase der Kopf des Zweigs abgetrennt wird, bevor er wieder an den endgültigen Kopf angehängt wird. Ich würde dies jedoch noch einmal überprüfen, da ich es in letzter Zeit nicht nachgeprüft habe.

Standardmäßig sind alle Reflogs für nicht-leere Repositories aktiviert:

[core]
    logAllRefUpdates = true

207 Stimmen

Git reflog ist großartig, aber denken Sie daran, dass Sie eine besser formatierte Ausgabe erhalten können mit git log -g (Tipp von Scott Chacon's progit.org/buch ).

3 Stimmen

Laut Allans Antwort unten a git rebase -i --abort ist ebenfalls erforderlich. Das oben Genannte allein ist nicht genug.

89 Stimmen

@Zach: git rebase --abort ( -i macht keinen Sinn bei --abort ) ist für den Abbruch eines Rebase, der nicht abgeschlossen wurde - entweder weil es Konflikte gab oder weil er interaktiv war oder beides; es geht nicht darum, einen erfolgreichen Rebase rückgängig zu machen, worum es in der Frage geht. Sie würden entweder rebase --abort o reset --hard je nachdem, in welcher Situation Sie sich befinden. Sie sollten nicht beides tun müssen.

2016voto

Pat Notz Punkte 196406

Tatsächlich speichert rebase Ihren Startpunkt auf ORIG_HEAD Das ist also in der Regel ganz einfach:

git reset --hard ORIG_HEAD

Allerdings ist die reset , rebase y merge alle speichern Ihr Original HEAD Zeiger in ORIG_HEAD Wenn Sie also seit dem Rebase, das Sie rückgängig machen wollen, einen dieser Befehle ausgeführt haben, müssen Sie das Reflog verwenden.

54 Stimmen

Für den Fall ORIG_HEAD nicht mehr nützlich ist, können Sie auch die branchName@{n} Syntax, wobei n ist die n-te vorherige Position des Verzweigungszeigers. Wenn Sie also zum Beispiel die Verzweigung featureA Zweig auf Ihr master Verzweigung, aber das Ergebnis der Umbasierung gefällt Ihnen nicht, dann können Sie einfach git reset --hard featureA@{1} um die Verzweigung wieder genau auf den Stand vor dem Zurücksetzen zurückzusetzen. Sie können mehr über die branch@{n}-Syntax lesen unter die offiziellen Git-Dokumente für Revisionen .

21 Stimmen

Das ist das Einfachste. Verfolgen Sie es mit einer git rebase --abort Allerdings.

15 Stimmen

@Seph Können Sie erläutern, warum Sie vorschlagen, sich mit git rebase --abort ?

531voto

Allan Punkte 4882

Charles' Antwort funktioniert, aber vielleicht möchten Sie dies tun:

git rebase --abort

um nach der reset .

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

190 Stimmen

Das war nicht die Frage. Die Frage lautet, wie man eine abgeschlossene Umbasierung rückgängig machen kann.

116voto

Aristotle Pagaltzis Punkte 106298

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 (z.B. weil Sie Ihr Repository in der Zwischenzeit zugemüllt haben oder es sich um einen frischen Klon handelt), können Sie den Zweig immer wieder neu basen. Der Schlüssel dazu ist die --onto Schalter.

Nehmen wir an, Sie hätten einen Themenzweig mit dem fantasievollen Namen topic dass Sie eine Abzweigung master wenn die Spitze des master war die 0deadbeef verpflichten. Irgendwann, während die topic Zweig, haben Sie git rebase master . Nun möchten Sie dies rückgängig machen. So geht's:

git rebase --onto 0deadbeef master topic

Dadurch werden alle Übertragungen auf topic die nicht auf master und wiederholen Sie sie auf dem 0deadbeef .

Mit --onto können Sie Ihre Geschichte in so ziemlich alles umgestalten jede beliebige Form .

Viel Spaß! :-)

3 Stimmen

Meiner Meinung nach ist dies die beste Option, weil sie so flexibel ist. Ich habe b1 von master abgezweigt, dann b1 in einen neuen Zweig b2 umgewandelt und wollte dann b1 wieder zurücknehmen, um wieder auf master zu basieren. Ich liebe Git einfach - danke!

2 Stimmen

Das ist hier die beste Option! Sie hat alle Änderungen, die ich an meinem aktuellen Zweig vorgenommen habe, beibehalten und alle unerwünschten entfernt!

0 Stimmen

Aus irgendeinem Grund Ihre Antwort machte mir klar, ich kann ein git rebase -i commitish und dann EDIT die Übertragung, die ich nicht zufrieden war mit :)

111voto

Maksym Punkte 4016

Für den Fall Sie haben Ihren Zweig in das entfernte Repository verschoben (in der Regel ist es origin) und dann haben Sie einen erfolgreichen rebase (ohne merge) durchgeführt ( git rebase --abort gibt "No rebase in progress") können Sie leicht Zweig zurücksetzen mit Befehl:

git reset --hard origin/{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

1 Stimmen

Bleiben Sie gesegnet, Bruder. Dies hat mein Problem gelöst

0 Stimmen

Sie haben meinen Tag gerettet.

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