Am 21.05.20 um 21:16 schrieb Jeff King: > Something like this works: > > diff --git a/builtin/checkout.c b/builtin/checkout.c > index e9d111bb83..6559ac666b 100644 > --- a/builtin/checkout.c > +++ b/builtin/checkout.c > @@ -1553,6 +1553,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix, > { > struct branch_info new_branch_info; > int parseopt_flags = 0; > + int got_start_point = 0; > > memset(&new_branch_info, 0, sizeof(new_branch_info)); > opts->overwrite_ignore = 1; > @@ -1661,6 +1662,8 @@ static int checkout_main(int argc, const char **argv, const char *prefix, > !opts->new_branch; > int n = parse_branchname_arg(argc, argv, dwim_ok, > &new_branch_info, opts, &rev); > + if (n) > + got_start_point = 1; > argv += n; > argc -= n; > } else if (!opts->accept_ref && opts->from_treeish) { > @@ -1689,7 +1692,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix, > * Try to give more helpful suggestion. > * new_branch && argc > 1 will be caught later. > */ > - if (opts->new_branch && argc == 1) > + if (opts->new_branch && !got_start_point && argc == 1) > die(_("'%s' is not a commit and a branch '%s' cannot be created from it"), > argv[0], opts->new_branch); > > > to produce: > > $ git checkout -b work -t master HEAD > fatal: '--track' cannot be used with updating paths > > $ git checkout -b work master HEAD > fatal: Cannot update paths and switch to branch 'work' at the same time. > > which are both correct. I wonder if there's a more elegant way to do it, > though (probably not, as there's definitely some heuristic parsing going > on to determine which checkout mode we're in; the new switch/restore > alternatives don't suffer as much from this). Perhaps: diff --git a/builtin/checkout.c b/builtin/checkout.c index e9d111bb83..24336e1017 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -1689,7 +1689,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix, * Try to give more helpful suggestion. * new_branch && argc > 1 will be caught later. */ - if (opts->new_branch && argc == 1) + if (opts->new_branch && argc == 1 && !new_branch_info.commit) die(_("'%s' is not a commit and a branch '%s' cannot be created from it"), argv[0], opts->new_branch);