recreate-merges-v8
dscho
tagged this
21 Apr 10:29
Junio, I think this is now ready for `next`. Thank you for your patience and help with this. Once upon a time, I dreamed of an interactive rebase that would not linearize all patches and drop all merge commits, 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 --rebase-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 -C 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 --rebase-merges. And then one to allow for rebasing merge commits in a smarter way (this one will need a bit more work, though, as it can result in very complicated, nested merge conflicts *very* easily). Changes since v7: - Touched up all the documentation (it was a mistake to copy-edit the --preserve-merges description, for example). - Disentangled the rescheduling of label/reset/merge from the one of the pick/fixup/squash code path (thanks Phillip!). - When the merge failed, we now write out .git/rebase-merge/patch. - An `exec git cherry-pick` or `exec git revert` will no longer mess with refs/rewritten/ in sequencer_remove_state() (d'oh....). Johannes Schindelin (14): sequencer: avoid using errno clobbered by rollback_lock_file() sequencer: make rearrange_squash() a bit more obvious sequencer: refactor how original todo list lines are accessed sequencer: offer helpful advice when a command was rescheduled sequencer: introduce the `merge` command sequencer: fast-forward `merge` commands, if possible rebase-helper --make-script: introduce a flag to rebase merges rebase: introduce the --rebase-merges option sequencer: make refs generated by the `label` command worktree-local sequencer: handle post-rewrite for merge commands rebase --rebase-merges: avoid "empty merges" pull: accept --rebase=merges to recreate the branch topology rebase -i: introduce --rebase-merges=[no-]rebase-cousins rebase -i --rebase-merges: add a section to the man page Phillip Wood (1): rebase --rebase-merges: add test for --keep-empty Stefan Beller (1): git-rebase--interactive: clarify arguments Documentation/config.txt | 8 + Documentation/git-pull.txt | 6 +- Documentation/git-rebase.txt | 160 ++++- builtin/pull.c | 14 +- builtin/rebase--helper.c | 13 +- builtin/remote.c | 18 +- contrib/completion/git-completion.bash | 4 +- git-rebase--interactive.sh | 22 +- git-rebase.sh | 16 + refs.c | 3 +- sequencer.c | 891 +++++++++++++++++++++++-- sequencer.h | 7 + t/t3421-rebase-topology-linear.sh | 1 + t/t3430-rebase-merges.sh | 244 +++++++ 14 files changed, 1347 insertions(+), 60 deletions(-) create mode 100755 t/t3430-rebase-merges.sh base-commit: fe0a9eaf31dd0c349ae4308498c33a5c3794b293 Submitted-As: https://public-inbox.org/git/cover.1524306546.git.johannes.schindelin@gmx.de In-Reply-To: https://public-inbox.org/git/cover.1523362469.git.johannes.schindelin@gmx.de In-Reply-To: https://public-inbox.org/git/cover.1518307771.git.johannes.schindelin@gmx.de In-Reply-To: https://public-inbox.org/git/cover.1516225925.git.johannes.schindelin@gmx.de In-Reply-To: https://public-inbox.org/git/cover.1517266437.git.johannes.schindelin@gmx.de In-Reply-To: https://public-inbox.org/git/cover.1519680483.git.johannes.schindelin@gmx.de In-Reply-To: https://public-inbox.org/git/cover.1524139900.git.johannes.schindelin@gmx.de