Hi Philip
On 01/04/2020 17:43, Philip Oakley wrote:
Hi Phillip,
On 31/03/2020 14:36, Phillip Wood wrote:
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` ?
A possibility, though it feels a bit narrow in suggesting the capabilities
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.
I would agree that the `label` instruction would need expanding to allow
arbitrary refs (e.g. specific oids and other branches) to be labelled
rather than just a presumed 'HEAD' ref. I did notice the man page
doesn't actually define the format of the extra instructions (there was
fun with awkward chars in label names on Windows).
I'm of the opinion that we don't re-label/rename the previous labels -
they are what they are, but we do offer the ability to provide new
labels. Hence the extension to the label format to allow the labelling
of arbitrary refs, not just HEAD, along with showing existing progress,
so folks can _see_ the new oids etc.
I'm not sure I understand how this would work. Say in the example below
I decide I want to rework abc while editing fgh and run 'git rebase
--rework abc^'. If we don't update the labels automatically how do I
ensure that the merge will pick up the reworked abc as it's parent.
#pick abc
#label topic
#reset cde
edit fgh
merge topic
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.
I'm against the original conceptual idea of 'nesting' (or rewinding).
What's done is done, it's in the object store, as is all the old
original work, so we have a wider foundation to build from. Clearly we
are not in a clean work-state, with the half complete jobs, so it's more
of a recovery activity than clean coding (from the user perspective).
I don't like the idea of nesting either but I think it would be useful
to be able to get back to a known state when the changes I make with
'rebase --rework' turn out to be a bad idea so I don't throw away all
the work that I did before running 'rebase --rework'. I've been using a
script that rewinds and I've got myself into situations where a
speculative change made while rewinding turned out to be a bad idea and
I want to get back to the state before the last rewind. When working on
a patch series I can rewind multiple times before completing the rebase
as I jump back and forth modifying and rewording each patch.
Best Wishes
Phillip
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?
If we haven't aborted, then we just have the actual sequence of work,
with some of the commits, ultimately, being left as unconnected stubs
(once their temporary tips have gone upon completion of the rebase -
could they be explicitly dropped?). On completion, those abandoned
commits could be explicitly marked as having been removed in the various
book-keeping lists and logs (if it was useful and helpful). I think this
is a different conceptual view of the work of the rebase - resolve process.
Best Wishes
Phillip
--
Philip