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]