Hi Philip, George and Johannes
I really like the idea of being able to extend or rewind an existing
rebase to reedit commits.
On 31/03/2020 11:57, Philip Oakley wrote:
Hi george,
On 31/03/2020 01:00, George Spelvin wrote:
Thinking about Philip Oakley's suggestion, it dawned on me that
we can *already* do a nested rebase manually, and having a less
manual alias for the procedure would be reasonable.
Suppose the last four commits are O-A-B-C, and whether they were created
by this rebase or existed before is irrelevant.
If I want to rebase --nested -i O, then I --edit-todo and
Maybe `--rework` as a possible alternate option name, if the concept of
it being truly nested process does not work out?
or `--rewind` ?
prepend the following four lines:
reset O
pick A
pick B
pick C
If a nested rebase command does just that, I think it would cover my
use case. If it adds a comment saying "nested rebase ends here",
it's easy to cancel the nested rebase if there was a mistake.
A slightly fancier thing a nestrd rebase could do is see if any of the
newly created picks are also used in merges that were already in the todo
list. In that case, follow the pick by a label command and update the
later merge to refer to the label.
If we're going to support rewinding a rebase that creates merges then
this is a prerequisite otherwise it wont work properly. It will also
need to update any existing labels that refer to a commits that get
rewritten when rewinding.
When cancelling the nested rebase we need to take care to restore any
labels to their previous value if they have been updated by the nested
rebase. We also need to restore the list or rewritten commits so that we
don't report that we've rewritten the commits from the nested rebase
that we're aborting. These two requirements unfortunately make it
difficult to implement the nested rebase just by updating the todo list.
It needs to save the current labels (and reference the commits somewhere
so they don't get gc'd) and the rewritten-list. `git rebase --abort` (or
whatever we end up using to abort the nested part of the rebase) needs
to restore the labels and rewritten-list. I think it should probably
restore the todo list as well - if the original part of the todo list
gets edited during the nested rebase should we drop those changes to the
list or keep them when the nested rebase is aborted?
Best Wishes
Phillip