From: Elijah Newren <newren@xxxxxxxxx> --root implies we want to rebase all commits since the beginning of history. --fork-point means we want to use the reflog of the specified upstream to find the best common ancestor between <upstream> and <branch> and only rebase commits since that common ancestor. These options are clearly contradictory, so throw an error (instead of segfaulting on a NULL pointer) if both are specified. Reported-by: Alexander Berg <alexander.berg@xxxxxxxx> Documentation-by: Alban Gruin <alban.gruin@xxxxxxxxx> Signed-off-by: Elijah Newren <newren@xxxxxxxxx> --- rebase: display an error if --root and --fork-point are both provided Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-771%2Fnewren%2Frebase-fork-point-root-error-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-771/newren/rebase-fork-point-root-error-v2 Pull-Request: https://github.com/git/git/pull/771 Range-diff vs v1: 1: c4508c7ddae ! 1: 307124b00d4 rebase: display an error if --root and --fork-point are both provided @@ Commit message segfaulting on a NULL pointer) if both are specified. Reported-by: Alexander Berg <alexander.berg@xxxxxxxx> + Documentation-by: Alban Gruin <alban.gruin@xxxxxxxxx> Signed-off-by: Elijah Newren <newren@xxxxxxxxx> + ## Documentation/git-rebase.txt ## +@@ Documentation/git-rebase.txt: When --fork-point is active, 'fork_point' will be used instead of + <branch>` command (see linkgit:git-merge-base[1]). If 'fork_point' + ends up being empty, the <upstream> will be used as a fallback. + + +-If either <upstream> or --root is given on the command line, then the +-default is `--no-fork-point`, otherwise the default is `--fork-point`. ++If <upstream> is given on the command line, then the default is ++`--no-fork-point`, otherwise the default is `--fork-point`. + + + If your branch was based on <upstream> but <upstream> was rewound and + your branch contains commits which were dropped, this option can be used + with `--keep-base` in order to drop those commits from your branch. +++ ++See also INCOMPATIBLE OPTIONS below. + + --ignore-whitespace:: + --whitespace=<option>:: +@@ Documentation/git-rebase.txt: In addition, the following pairs of options are incompatible: + * --preserve-merges and --empty= + * --keep-base and --onto + * --keep-base and --root ++ * --fork-point and --root + + BEHAVIORAL DIFFERENCES + ----------------------- + ## builtin/rebase.c ## @@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix) die(_("cannot combine '--keep-base' with '--root'")); Documentation/git-rebase.txt | 7 +++++-- builtin/rebase.c | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index f7a6033607f..fbad356c68e 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -414,12 +414,14 @@ When --fork-point is active, 'fork_point' will be used instead of <branch>` command (see linkgit:git-merge-base[1]). If 'fork_point' ends up being empty, the <upstream> will be used as a fallback. + -If either <upstream> or --root is given on the command line, then the -default is `--no-fork-point`, otherwise the default is `--fork-point`. +If <upstream> is given on the command line, then the default is +`--no-fork-point`, otherwise the default is `--fork-point`. + If your branch was based on <upstream> but <upstream> was rewound and your branch contains commits which were dropped, this option can be used with `--keep-base` in order to drop those commits from your branch. ++ +See also INCOMPATIBLE OPTIONS below. --ignore-whitespace:: --whitespace=<option>:: @@ -600,6 +602,7 @@ In addition, the following pairs of options are incompatible: * --preserve-merges and --empty= * --keep-base and --onto * --keep-base and --root + * --fork-point and --root BEHAVIORAL DIFFERENCES ----------------------- diff --git a/builtin/rebase.c b/builtin/rebase.c index bff53d5d167..287ac1aa21b 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -1652,6 +1652,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) die(_("cannot combine '--keep-base' with '--root'")); } + if (options.root && fork_point > 0) + die(_("cannot combine '--root' with '--fork-point'")); + if (action != ACTION_NONE && !in_progress) die(_("No rebase in progress?")); setenv(GIT_REFLOG_ACTION_ENVIRONMENT, "rebase", 0); base-commit: af6b65d45ef179ed52087e80cb089f6b2349f4ec -- gitgitgadget