Re: [PATCH v2 00/10] rebase -i: offer to recreate merge commits
From: Stefan Beller <hidden>
Date: 2018-01-30 18:47:11
On Mon, Jan 29, 2018 at 2:54 PM, Johannes Schindelin [off-list ref] wrote:
Once upon a time, I dreamt of an interactive rebase that would not
flatten branch structure, but instead recreate the commit topology
faithfully.
My original attempt was --preserve-merges, but that design was so
limited that I did not even enable it in interactive mode.
Subsequently, it *was* enabled in interactive mode, with the predictable
consequences: as the --preserve-merges design does not allow for
specifying the parents of merge commits explicitly, all the new commits'
parents are defined *implicitly* by the previous commit history, and
hence it is *not possible to even reorder commits*.
This design flaw cannot be fixed. Not without a complete re-design, at
least. This patch series offers such a re-design.
Think of --recreate-merges as "--preserve-merges done right". It
introduces new verbs for the todo list, `label`, `reset` and `merge`.
For a commit topology like this:
A - B - C
\ /
D
the generated todo list would look like this:
# branch D
pick 0123 A
label branch-point
pick 1234 D
label D
reset branch-point
pick 2345 B
merge 3456 D C
There are more patches in the pipeline, based on this patch series, but
left for later in the interest of reviewable patch series: one mini
series to use the sequencer even for `git rebase -i --root`, and another
one to add support for octopus merges to --recreate-merges.
Changes since v1:
- reintroduced "sequencer: make refs generated by the `label` command
worktree-local" (which was squashed into "sequencer: handle autosquash
and post-rewrite for merge commands" by accident)
- got rid of the universally-hated `bud` commandSorry if you got the impression for that. Maybe I was imprecise. I had no strong opinion one way or another, I merely pointed out the collision in abbreviation letters with the potential new 'break', IIRC. 'bud' was a special case for resetting to a specific revision (and labeling it?) Maybe we can have default labels, such that there is no need to reset to the first revision manually, but can just use these defaults in the merge. (I haven't thought about this in the big picture, just food for thought)
- as per Stefan's suggestion, the help blurb at the end of the todo list now lists the syntax - the no-rebase-cousins mode was made the default; This not only reflects the experience won from those years of using the Git garden shears, but was also deemed the better default in the discussion on the PR at https://github.com/git/git/pull/447 - I tried to clarify the role of the `onto` label in the commit message of `rebase-helper --make-script: introduce a flag to recreate merges` - fixed punctuation at the end of error(...) messages, and incorrect upper-case at the start - changed the generated todo lists to separate the label and the oneline in the `reset` command with a `#`, for readability - dropped redundant paragraph in the commit message that talked about support for octopus merges - avoided empty error message when HEAD could not be read during do_label() - merge commits are fast-forwarded only unless --force-rebase was passed - do_merge() now errors out a lot earlier when HEAD could not be parsed - the one-letter variables to hold either abbreviated or full todo list instructions in make_script_recreating_merges() were renamed to clearer names - The description of rebase's --recreate-merge option has been reworded; Hopefully it is a lot more clear now. Johannes Schindelin (9): sequencer: introduce new commands to reset the revision sequencer: introduce the `merge` command sequencer: fast-forward merge commits, if possible rebase-helper --make-script: introduce a flag to recreate merges rebase: introduce the --recreate-merges option sequencer: make refs generated by the `label` command worktree-local sequencer: handle autosquash and post-rewrite for merge commands pull: accept --rebase=recreate to recreate the branch topology rebase -i: introduce --recreate-merges=[no-]rebase-cousins Stefan Beller (1): git-rebase--interactive: clarify arguments
No need to honor me with authorship, as I just wrote that patch in a quick hurry to express the idea. But this is fine, too. The interdiff looks good to me, I'll review the patches now. Thanks, Stefan