Re: 'HEAD' is not a commit (according to git-checkout)
Am 21.05.20 um 21:16 schrieb Jeff King:
Show 45 quoted lines
> 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).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);