git reflog is the SINGLE most undersold feature of get. It's a global, perpetual undo function (less garbage collection, which I understand to be discouraged).
If you start depending on reflog just remember that changes in there are subject to garbage collection. Commits can be permanently deleted after they are 2 weeks old (by the default settings), so that's how long you can depend on them staying alive in the reflog.
Of course you can always give a branch name or tag to any commit to keep it alive too.
git reflog
Now you can feel free rebase with abandon.