-
Notifications
You must be signed in to change notification settings - Fork 159
Description
The problem: during an interactive rebase, the user might realize that they want to redo (part of) the rebase, e.g. to resolve merge conflicts in a different way, say, by re-picking the latest three commits. Usually one would do git rebase -i HEAD~3, but that does not work because we are already in a rebase.
What I typically do is to create a throw-away worktree with git worktree add --detach, call git rebase -i HEAD~3 in that worktree, then copy the output of git rev-parse HEAD, then remove the worktree, and call git reset --hard <commit> in the original worktree.
That is fraught with danger, though, and very inconvenient.
The proposed solution: a new git rebase -i --nested [...] option. The --nested option would allow
This would generate the todo list as usual, but then prepend it to the current todo list. At the end, it would insert a new command that indicates that the nested rebase is now complete, and at the same time provides enough information to allow git rebase --abort to abort the nested rebase.
Some care will have to be taken in case of combining --nested with --rebase-merges: that will potentially override the onto label. In that instance, at the end of the nested rebase we would have to re-set the onto label to the original value.
It is not yet possible to call label <name> <commit>, only label <name>. We would have to introduce the former form to make it possible to re-set the onto label. Or use reset <commit> and then label <name>, but that is somewhat ugly.