recreate-merges-v2
dscho
tagged this
29 Jan 22:53
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` command - 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 Documentation/config.txt | 8 + Documentation/git-pull.txt | 5 +- Documentation/git-rebase.txt | 14 +- builtin/pull.c | 14 +- builtin/rebase--helper.c | 13 +- builtin/remote.c | 2 + contrib/completion/git-completion.bash | 4 +- git-rebase--interactive.sh | 22 +- git-rebase.sh | 16 + refs.c | 3 +- sequencer.c | 699 ++++++++++++++++++++++++++++++++- sequencer.h | 7 + t/t3430-rebase-recreate-merges.sh | 208 ++++++++++ 13 files changed, 988 insertions(+), 27 deletions(-) create mode 100755 t/t3430-rebase-recreate-merges.sh base-commit: 5be1f00a9a701532232f57958efab4be8c959a29 Submitted-As: https://public-inbox.org/git/cover.1517266437.git.johannes.schindelin@gmx.de In-Reply-To: https://public-inbox.org/git/cover.1516225925.git.johannes.schindelin@gmx.de
Assets 2
-
2018-01-29T22:53:57Z -
2018-01-29T22:53:57Z -