Quantcast
Channel: Undoing a git rebase - Stack Overflow
Viewing all articles
Browse latest Browse all 21

Answer by DylanYoung for Undoing a git rebase

$
0
0

It annoys me to no end that none of these answers is fully automatic, despite the fact that it should be automatable (at least mostly). I created a set of aliases to try to remedy this:

# Useful commands################## Undo the last rebaseundo-rebase = "! f() { : git reset ; PREV_COMMIT=`git x-rev-before-rebase` && git reset --merge \"$PREV_COMMIT\" \"$@\";}; f"# See what changed since the last rebaserdiff = "!f() { : git diff ; git diff `git x-rev-before-rebase` "$@";}; f"# Helpers######### Get the revision before the last rebase startedx-rev-before-rebase = !git reflog --skip=1 -1 \"`git x-start-of-rebase`\" --format=\"%gD\"# Get the revision that started the rebasex-start-of-rebase = reflog --grep-reflog '^rebase (start)' -1 --format="%gD"

You should be able to tweak this to allow going back an arbitrary number of rebases pretty easily (juggling the args is the trickiest part), which can be useful if you do a number of rebases in quick succession and mess something up along the way.

Caveats

It will get confused if any commit messages begin with "rebase (start)" (please don't do this). You could make the regex more resilient to improve the situation by matching something like this for your regex:

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

WARNING: not tested (regex may need adjustments)

The reason I haven't done this is because I'm not 100% that a rebase always begins with a checkout. Can anyone confirm this?

[If you're curious about the null (:) commands at the beginning of the function, that's a way of setting up bash completions for the aliases]


Viewing all articles
Browse latest Browse all 21

Latest Images

Trending Articles





Latest Images