[PATCH 0/8] rebase -i: offer to recreate merge commits
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Jan 18, 2018, 15:35 UTC
- Message-ID
- <cover.1516225925.git.johannes.schindelin@gmx.de>
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
\ /
Dthe 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 CThere 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.
Johannes Schindelin (8): 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: 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
Documentation/config.txt | 8 + Documentation/git-pull.txt | 5 +- Documentation/git-rebase.txt | 13 +- builtin/pull.c | 14 +- builtin/rebase--helper.c | 13 +- builtin/remote.c | 2 + contrib/completion/git-completion.bash | 4 +- git-rebase--interactive.sh | 6 + git-rebase.sh | 16 + refs.c | 3 +- sequencer.c | 697 ++++++++++++++++++++++++++++++++- sequencer.h | 9 + t/t3430-rebase-recreate-merges.sh | 208 ++++++++++ 13 files changed, 977 insertions(+), 21 deletions(-) create mode 100755 t/t3430-rebase-recreate-merges.sh
base-commit: 2512f15446149235156528dafbe75930c712b29e Published-As: https://github.com/dscho/git/releases/tag/recreate-merges-v1 Fetch-It-Via: git fetch https://github.com/dscho/git recreate-merges-v1
-- 2.15.1.windows.2.1430.ga56c4f9e2a9