git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: 'HEAD' is not a commit (according to git-checkout)

From
René Scharfe <l.s.r@web.de>
Date
May 23, 2020, 07:07 UTC
Message-ID
<9f26099a-e77b-ede4-bee3-27382a5a0875@web.de>
In-Reply-To
<20200521191626.GC1308489@coredump.intra.peff.net>
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).
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);
Previous: Jeff KingNext: Jeff King
Message 3 of 16 in “'HEAD' is not a commit (according to git-checkout)”
  1. Dana DahlstromMay 21, 2020
  2. Jeff KingMay 21, 2020
  3. René ScharfeMay 23, 2020
  4. Jeff KingMay 23, 2020
  5. 1/2 checkout: add tests for -b and --trackRené Scharfe, May 24, 2020
  6. Jeff KingMay 27, 2020
  7. René ScharfeMay 28, 2020
  8. 2/2 checkout: improve error messages for -b with extra argumentRené Scharfe, May 24, 2020
  9. Jeff KingMay 27, 2020
  10. René ScharfeMay 24, 2020
  11. Junio C HamanoMay 24, 2020
  12. Jeff KingMay 27, 2020
  13. Junio C HamanoMay 27, 2020
  14. Randall S. BeckerMay 27, 2020
  15. Jeff KingMay 27, 2020
  16. René ScharfeMay 21, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.