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

[PATCH] git-checkout: disallow --detach on unborn branch

From
Chris Webb <chris@arachsys.com>
Date
Jun 26, 2012, 15:06 UTC
Message-ID
<b9069a6c6af42f4771c5a5c1c812800c21926622.1340723202.git.chris@arachsys.com>
In-Reply-To
<20120626150436.GU9682@arachsys.com>

abe199808c (git checkout -b: allow switching out of an unborn branch) introduced a bug demonstrated by

  git checkout --orphan foo
  git checkout --detach
  git symbolic-ref HEAD
which gives 'refs/heads/(null)'.

This happens because we strbuf_addf(&branch_ref, "refs/heads/%s", opts->new_branch) when opts->new_branch can be NULL for --detach.

Catch and forbid this case, adding a test to t2017 to catch it in future.

Signed-off-by: Chris Webb <chris@arachsys.com>
---
 builtin/checkout.c         |    2 ++
 t/t2017-checkout-orphan.sh |    6 ++++++
 2 files changed, 8 insertions(+)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index e8c1b1f..3980d5d 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -915,6 +915,8 @@ static int switch_unborn_to_new_branch(struct checkout_opts *opts)
 	int status;
 	struct strbuf branch_ref = STRBUF_INIT;
 
+	if (!opts->new_branch)
+		die(_("You are on a branch yet to be born"));
 	strbuf_addf(&branch_ref, "refs/heads/%s", opts->new_branch);
 	status = create_symref("HEAD", branch_ref.buf, "checkout -b");
 	strbuf_release(&branch_ref);
diff --git a/t/t2017-checkout-orphan.sh b/t/t2017-checkout-orphan.sh
index 0e3b858..655f278 100755
--- a/t/t2017-checkout-orphan.sh
+++ b/t/t2017-checkout-orphan.sh
@@ -116,4 +116,10 @@ test_expect_success '--orphan refuses to switch if a merge is needed' '
 	git reset --hard
 '
 
+test_expect_success 'cannot --detach on an unborn branch' '
+	git checkout master &&
+	git checkout --orphan new &&
+	test_must_fail git checkout --detach
+'
+
 test_done
-- 
1.7.10
Previous: Chris WebbNext: Junio C Hamano
Message 16 of 29 in “Editing the root commit”
  1. Chris WebbJun 19, 2012
  2. Junio C HamanoJun 19, 2012
  3. Chris WebbJun 19, 2012
  4. Chris WebbJun 20, 2012
  5. Junio C HamanoJun 20, 2012
  6. Jeff KingJun 20, 2012
  7. Chris WebbJun 20, 2012
  8. Jeff KingJun 20, 2012
  9. Chris WebbJun 22, 2012
  10. Junio C HamanoJun 22, 2012
  11. Chris WebbJun 22, 2012
  12. Chris WebbJun 22, 2012
  13. Junio C HamanoJun 22, 2012
  14. Chris WebbJun 23, 2012
  15. git-commit bug (was Re: Editing the root commit)Chris Webb, Jun 26, 2012
  16. git-checkout: disallow --detach on unborn branchChris Webb, Jun 26, 2012
  17. Junio C HamanoJun 26, 2012
  18. Chris WebbJun 26, 2012
  19. 1/2 rebase -i: support --root without --ontoChris Webb, Jun 26, 2012
  20. Junio C HamanoJun 26, 2012
  21. Chris WebbJun 26, 2012
  22. Junio C HamanoJun 26, 2012
  23. Chris WebbJun 26, 2012
  24. Junio C HamanoJun 26, 2012
  25. Chris WebbJun 26, 2012
  26. 2/2 Add tests for rebase -i --root without --ontoChris Webb, Jun 26, 2012
  27. Chris WebbJun 20, 2012
  28. Martin von ZweigbergkJun 25, 2012
  29. jaseem abidJun 19, 2012

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.