Message ID | 68bcd10949ec7767d1e0ee8e2f0730ca36bad1c5.1660576283.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | rebase --keep-base: imply --reapply-cherry-picks and --no-fork-point | expand |
"Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes: > From: Phillip Wood <phillip.wood@dunelm.org.uk> > > Given the name of the option it is confusing if --keep-base actually > changes the base of the branch without --fork-point being explicitly > given on the command line. Does it merely "imply"? As keep-base requests exactly the same base commit reused from the current history, doesn't fork-point a competing and conflicting request, i.e. "please compute an appropriate fork-point by looking at merge base with possibly rewound tips of upstream branch"? > + /* > + * --keep-base ignores config.forkPoint as it is confusing if > + * the branch base changes when using this option. > + */ The comment singles out config.forkPoint (Isn't that "rebase.forkPoint"???) as "confusing". Do we ignore rebase.forkPoint when --keep-base is given? Do we honor --fork-point from the command line when --keep-base is given? > + if (options.fork_point < 0) > + options.fork_point = 0;
"Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes: > @@ -1240,6 +1240,12 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) > die(_("options '%s' and '%s' cannot be used together"), "--keep-base", "--onto"); > if (options.root) > die(_("options '%s' and '%s' cannot be used together"), "--keep-base", "--root"); > + /* > + * --keep-base ignores config.forkPoint as it is confusing if > + * the branch base changes when using this option. > + */ > + if (options.fork_point < 0) > + options.fork_point = 0; Hmm..doesn't forkPoint decide the set of commits to be rebased, not the point at which the new commits are created? If yes, that doesn't seem to have much to do with --keep-base.
Hi Jonathan On 24/08/2022 23:18, Jonathan Tan wrote: > "Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes: >> @@ -1240,6 +1240,12 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) >> die(_("options '%s' and '%s' cannot be used together"), "--keep-base", "--onto"); >> if (options.root) >> die(_("options '%s' and '%s' cannot be used together"), "--keep-base", "--root"); >> + /* >> + * --keep-base ignores config.forkPoint as it is confusing if >> + * the branch base changes when using this option. >> + */ >> + if (options.fork_point < 0) >> + options.fork_point = 0; > > Hmm..doesn't forkPoint decide the set of commits to be rebased, not the > point at which the new commits are created? If yes, that doesn't seem to > have much to do with --keep-base. I think it depends a bit on how you look at it. You're right that --fork-point restricts the set of commits that are rebased, but it also effectively changes the branch base as it removes commits from the branch. Best Wishes Phillip
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index dc0c6c54e27..6d62e404268 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -218,7 +218,7 @@ leave out at most one of A and B, in which case it defaults to HEAD. merge base of `<upstream>` and `<branch>`. Running `git rebase --keep-base <upstream> <branch>` is equivalent to running - `git rebase --reapply-cherry-picks --onto <upstream>...<branch> <upstream> <branch>`. + `git rebase --reapply-cherry-picks --no-fork-point --onto <upstream>...<branch> <upstream> <branch>`. + This option is useful in the case where one is developing a feature on top of an upstream branch. While the feature is being worked on, the diff --git a/builtin/rebase.c b/builtin/rebase.c index b6b3e00e3b1..1a8344b890e 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -1240,6 +1240,12 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) die(_("options '%s' and '%s' cannot be used together"), "--keep-base", "--onto"); if (options.root) die(_("options '%s' and '%s' cannot be used together"), "--keep-base", "--root"); + /* + * --keep-base ignores config.forkPoint as it is confusing if + * the branch base changes when using this option. + */ + if (options.fork_point < 0) + options.fork_point = 0; } /* * --keep-base defaults to --reapply-cherry-picks as it is confusing if diff --git a/t/t3431-rebase-fork-point.sh b/t/t3431-rebase-fork-point.sh index 1d0b15380ed..70e81363569 100755 --- a/t/t3431-rebase-fork-point.sh +++ b/t/t3431-rebase-fork-point.sh @@ -50,7 +50,7 @@ test_rebase () { test_rebase 'G F E D B A' test_rebase 'G F D B A' --onto D -test_rebase 'G F B A' --keep-base +test_rebase 'G F C B A' --keep-base test_rebase 'G F C E D B A' --no-fork-point test_rebase 'G F C D B A' --no-fork-point --onto D test_rebase 'G F C B A' --no-fork-point --keep-base