Brechen Sie eine Rebase vollständig ab

255

Ich habe eine Rebase wie folgt durchgeführt:

git rebase --onto master new_background_processing export_background_processing

Das hat nicht das getan, was ich wollte, also habe ich einen Reset durchgeführt:

git reset --hard HEAD@{1}

Ich habe meinen Zweig wieder in den Zustand versetzt, in dem er war, aber ich habe diese Nachricht erhalten, als ich git status eingegeben habe:

# You are currently rebasing branch 'export_background_processing' on 'e378641'.

Wie kann ich diese Rebase vollständig abbrechen? Ich bin mir nicht sicher, was das per se bedeutet.

Graham Jackson
quelle
16
git rebase --abort
Micha Wiedenmann
6
Git 2.12 bietet jetzt git rebase --quit. Siehe meine Antwort unten
VonC

Antworten:

407

Verwenden Sie git rebase --abort. Aus der offiziellen Linux-Kernel-Dokumentation fürgit rebase :

git rebase --continue | --skip | --abort | --edit-todo

quelle
5
In meinem Fall hat das git rebase --abortnicht funktioniert, weil ich etwas durcheinander gebracht habe. Ich habe nur folgenden Fehler erhalten : error: could not read '.git/rebase-apply/head-name': directory of file does not exist. Der git rebase --quit beschriebene Balg hat mein Problem gelöst.
Kout
84

Im Falle einer früheren Rebase, die Sie nicht ordnungsgemäß abgebrochen haben, haben Sie jetzt (Git 2.12, Q1 2017) git rebase --quit

Siehe Commit 9512177 (12. November 2016) von Nguyễn Thái Ngọc Duy ( pclouds) . (Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 06cd5a1 , 19. Dezember 2016)

rebase: --quitZur Bereinigungsbasis hinzufügen, alles andere unberührt lassen

Es gibt Fälle, in denen Sie sich entscheiden, eine laufende Rebase abzubrechen und etwas anderes zu tun, aber vergessen, zuerst " git rebase --abort" zu tun . Oder die Rebase läuft schon so lange, bis Sie sie vergessen haben. Wenn Sie feststellen, dass es (z. B. durch Starten einer weiteren Rebase) bereits zu spät ist, Ihre Schritte zurückzuverfolgen. Die Lösung ist normalerweise

rm -r .git/<some rebase dir>

und mach weiter mit deinem Leben.
Es kann jedoch zwei verschiedene Verzeichnisse für geben <some rebase dir>(und es erfordert offensichtlich einige Kenntnisse darüber, wie Rebase funktioniert), und der .gitTeil " " kann viel länger dauern, wenn Sie sich nicht im obersten Verzeichnis befinden oder sich in einem verknüpften Arbeitsbaum befinden. Und " rm -r" ist sehr gefährlich .git, ein Fehler könnte die Objektdatenbank oder andere wichtige Daten zerstören.

Geben Sie " git rebase --quit" für diesen Anwendungsfall an und ahmen Sie einen Präzedenzfall nach, der " git cherry-pick --quit" ist.


Vor Git 2.27 (Q2 2020) wurde der von " git merge --autostash" erstellte Stash-Eintrag , um den anfänglichen schmutzigen Zustand beizubehalten, versehentlich auf " git rebase --quit" verworfen , was korrigiert wurde.

Siehe Commit 9b2df3e (28. April 2020) von Denton Liu ( Denton-L) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 3afdeef , 29. April 2020)

rebase: Autostash-Eintrag in stash reflogon speichern--quit

Unterzeichnet von: Denton Liu

In a03b55530a (" merge: Teach - Autostash Option", 2020-04-07, Git v2.27.0 - Merge in Stapel 5 aufgeführt ) wurde die --autostashOption für eingeführt git merge.

(Siehe " Kann" git pull"anstehende Änderungen automatisch speichern und einfügen? ")

Insbesondere wenn git merge --quitein Autostash-Eintrag ausgeführt wird, wird er im Stash-Reflog gespeichert.

Dies steht im Gegensatz zu dem aktuellen Verhalten, bei git rebase --quitdem der Autostash-Eintrag einfach aus der Existenz entfernt wird.

Übernehmen Sie das Verhalten von git merge --quitin git rebase --quitund speichern Sie den Autostash-Eintrag im Stash-Reflog, anstatt ihn nur zu löschen.

VonC
quelle
3
Dies ist sehr nützlich, um den Nebeneffekt des Zurücksetzens des Arbeitsverzeichnisses zu vermeiden, wenn Änderungen über a vorgenommen werden git rebase, anstatt sie zu verlieren, wie ich es gerade getan habe: P.
Warlike Schimpanse
12

Sie haben Glück, dass Sie die Rebase nicht abgeschlossen haben, also können Sie es trotzdem tun git rebase --abort. Wenn Sie die Rebase abgeschlossen hätten (sie schreibt den Verlauf neu ), wären die Dinge viel komplexer gewesen. Ziehen Sie in Betracht, die Spitzen von Zweigen zu markieren, bevor Sie potenziell schädliche Vorgänge ausführen (insbesondere das Umschreiben des Verlaufs). Auf diese Weise können Sie zurückspulen, wenn etwas explodiert.

vonbrand
quelle
8

Wenn Sie "Rebasing" , "Bereits gestartete Rebase" sind und abbrechen möchten , kommentieren Sie einfach (#)alle im Rebase-Editor aufgelisteten Commits.

Als Ergebnis erhalten Sie eine Befehlszeilenmeldung

Nothing to do
Almas Adilbek
quelle