You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 --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 v6:
- Reworded the REBASING MERGES section of the man page a bit (thanks, Martin &
Phillip!).
- The `reset` todo command now refuses to overwrite untracked files (thanks
Phillip!).
- The do_merge() function was prevented from leaking memory left and right.
- Added a nice advice for the case when todo commands were rescheduled.
- Refactored the way we get to the original line of any given todo command in
the todo list, simplifying even existing code to make it a lot more readable.
- Failed `label` and `reset` commands, as well as `merge` that failed before
even attempting to merge, are now rescheduled automatically (thanks
Phillip and Philip!).
- The do_merge() function no longer tries to commit when there are merge
conflicts (thanks Phillip!).
- When do_merge() failed to run the recursive merge, it no longer claims that
there were conflicts (thanks Phillip!).
- When the merge failed, we now write out the index before giving `rerere` a
chance (d'oh!).
Johannes Schindelin (15):
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 new commands to reset the revision
# This is a combination of 2 commits. # This is the 1st commit
message:
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 | 5 +-
Documentation/git-rebase.txt | 147 ++++-
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 | 869 +++++++++++++++++++++++--
sequencer.h | 7 +
t/t3421-rebase-topology-linear.sh | 1 +
t/t3430-rebase-merges.sh | 221 +++++++
14 files changed, 1288 insertions(+), 60 deletions(-)
create mode 100755 t/t3430-rebase-merges.sh
base-commit: fe0a9eaf31dd0c349ae4308498c33a5c3794b293
Submitted-As: https://public-inbox.org/git/cover.1524139900.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.1517266437.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.1518307771.git.johannes.schindelin@gmx.de
In-Reply-To: https://public-inbox.org/git/cover.1523362469.git.johannes.schindelin@gmx.de