rebase --merge: optionally skip upstreamed commits
authorJonathan Tan <jonathantanmy@google.com>
Sat, 11 Apr 2020 02:44:27 +0000 (02:44 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 11 Apr 2020 21:15:57 +0000 (14:15 -0700)
commit0fcb4f6b62c87a73971890070dea847b56176338
tree2856bf93aa397f1bb20a98129a2bc99ea2a315cb
parent50ed76148a96d6cf37549c0492e6da1ff85b9bd0
rebase --merge: optionally skip upstreamed commits

When rebasing against an upstream that has had many commits since the
original branch was created:

 O -- O -- ... -- O -- O (upstream)
  \
   -- O (my-dev-branch)

it must read the contents of every novel upstream commit, in addition to
the tip of the upstream and the merge base, because "git rebase"
attempts to exclude commits that are duplicates of upstream ones. This
can be a significant performance hit, especially in a partial clone,
wherein a read of an object may end up being a fetch.

Add a flag to "git rebase" to allow suppression of this feature. This
flag only works when using the "merge" backend.

This flag changes the behavior of sequencer_make_script(), called from
do_interactive_rebase() <- run_rebase_interactive() <-
run_specific_rebase() <- cmd_rebase(). With this flag, limit_list()
(indirectly called from sequencer_make_script() through
prepare_revision_walk()) will no longer call cherry_pick_list(), and
thus PATCHSAME is no longer set. Refraining from setting PATCHSAME both
means that the intermediate commits in upstream are no longer read (as
shown by the test) and means that no PATCHSAME-caused skipping of
commits is done by sequencer_make_script(), either directly or through
make_script_with_merges().

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-rebase.txt
builtin/rebase.c
sequencer.c
sequencer.h
t/t3402-rebase-merge.sh