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.

4voto

mrigendra Punkte 1298

Normalerweise mache ich Folgendes git reset #commit_hash

bis zum letzten Commit, bei dem rebase wohl keine Wirkung hatte.

entonces git pull

Jetzt sollte Ihr Zweig genau dem Masterzweig entsprechen und es sollten keine rebased Commits enthalten sein.

Jetzt kann man sich die Übertragungen auf diesem Zweig einfach herauspicken.

4voto

DylanYoung Punkte 2072

Es ärgert mich maßlos, dass keine dieser Antworten vollautomatisch ist, obwohl sie (zumindest größtenteils) automatisierbar sein sollte. Um hier Abhilfe zu schaffen, habe ich eine Reihe von Aliasen erstellt:

# Useful commands
#################

# Undo the last rebase
undo-rebase = "! f() { : git reset ; PREV_COMMIT=`git x-rev-before-rebase` && git reset --merge \"$PREV_COMMIT\" \"$@\";}; f"

# See what changed since the last rebase
rdiff = "!f() { : git diff ; git diff `git x-rev-before-rebase` "$@";}; f"

# Helpers
########
# Get the revision before the last rebase started
x-rev-before-rebase = !git reflog --skip=1 -1 \"`git x-start-of-rebase`\" --format=\"%gD\"

# Get the revision that started the rebase
x-start-of-rebase = reflog --grep-reflog '^rebase (start)' -1 --format="%gD"

Sie sollten in der Lage sein, dies so zu ändern, dass Sie eine beliebige Anzahl von Rebases zurückgehen können (das Jonglieren mit den Args ist der kniffligste Teil), was nützlich sein kann, wenn Sie eine Reihe von Rebases in schneller Folge durchführen und dabei etwas durcheinander bringen.

Vorbehalte

Es wird verwirrt, wenn eine Commit-Meldung mit "rebase (start)" beginnt (bitte tun Sie das nicht). Sie könnten die Regex widerstandsfähiger machen, um die Situation zu verbessern, indem Sie etwas wie dies für Ihre Regex anpassen:

--grep-reflog "^rebase (start): checkout " 

WARNUNG: nicht getestet (Regex muss möglicherweise angepasst werden)

Der Grund, warum ich das nicht getan habe, ist, dass ich nicht 100%ig sicher bin, dass ein Rebase toujours beginnt mit einem Checkout. Kann jemand dies bestätigen?

[Falls Sie sich für die Null ( : ) Befehle am Anfang der Funktion, um Bash-Vervollständigungen für die Aliase einzurichten]

1voto

user3638751 Punkte 73

Ich habe alle Vorschläge mit Reset und Reflog ohne Erfolg ausprobiert. Die Wiederherstellung des lokalen Verlaufs von IntelliJ löste das Problem der verlorenen Dateien

-1voto

Davi Mello Punkte 51

Verwendung der GUI von Visual Studio Code (auf einem Mac):

Menu GUI selection for rebase on Visual Studio Code

-5voto

stevek-pro Punkte 13546

Wenn Sie bei einem Git-Rebase etwas falsch machen, z. B. git rebase --abort solange Sie noch nicht gebundene Dateien haben, gehen diese verloren und git reflog wird nicht helfen. Das ist mir passiert, und Sie müssen hier über den Tellerrand hinausschauen. Wenn Sie wie ich Glück haben und IntelliJ Webstorm verwenden, können Sie right-click->local history und kann einen früheren Zustand Ihrer Dateien/Ordner wiederherstellen, egal welche Fehler Sie mit der Versionierungssoftware gemacht haben. Es ist immer gut, eine weitere Ausfallsicherung zu haben.

6 Stimmen

git rebase --abort eine aktive Umbasierung abbricht, wird nicht rückgängig machen eine Umbasierung. Außerdem ist es eine schlechte Idee, zwei VCS gleichzeitig zu verwenden. Es ist eine nette Funktion in Jetbrains Software, aber man sollte nicht beide verwenden. Es ist besser, nur Git zu lernen, besonders wenn man Fragen auf Stack Overflow zu Git beantwortet.

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