Re: creation of empty branches
From: Jeff King <hidden>
Date: 2016-06-15 22:55:18
Subsystem:
the rest · Maintainer:
Linus Torvalds
Possibly related (same subject, not in this thread)
- 2016-06-15 · creation of empty branches · Angelo Borsotti <hidden>
- 2016-06-15 · Re: creation of empty branches · Andrew Ardill <hidden>
On Wed, Nov 14, 2012 at 01:27:33PM -0800, Junio C Hamano wrote:
quoted
Instead of fatal: Not a valid object name: 'master'. perhaps fatal: Cannot create branch 'foo' from empty branch 'master'. To rename 'master' use 'git branch -m master foo'.The first new sentence is a definite improvement, but I do not think the advice in the second sentence is necessarily a good idea, because it is dubious that the user is likely to have wanted to rename 'master' to something else. "git branch foo master" (or its moral equivalent "git checkout -b foo" while on master) is a wish to have a history that ends in 'foo' *forked* from history of 'master', but because you do not even have anything on 'master' yet, you cannot fork the history, as you explained earlier (snipped). In that sense, 'empty branch' is a slight misnomer---as far as "git branch foo master" is concerned, the 'master' branch does not yet exist (and that is why we often call it an "unborn branch", not "empty"). fatal: cannot fork master's history that does not exist yet. would be more accurate description of the situation.
I agree with most of your reasoning. I think simply using Andrew's first
sentence is a little more clear to a new user, even though it may be
less technically precise, but I don't have a strong opinion.
That still leaves "checkout -b". I do not see it as a problem that "git
branch foo" does not work whereas "git checkout -b foo" does; we
special-case the latter because it can do something sensible, whereas
there is nothing sensible for "git branch foo" to do. However, I think
it is missing one piece:
-- >8 --
Subject: checkout: print a message when switching unborn branches
When we switch to a new branch using checkout, we usually output a
message indicating what happened. However, when we switch from an unborn
branch to a new branch, we do not print anything, which may leave the
user wondering what happened.
The reason is that the unborn branch is a special case (see abe1998),
and does not follow the usual switch_branches code path. Let's add a
similar informational message to the special case to match the usual
code path.
Signed-off-by: Jeff King <redacted>
---
Two possible tweaks:
1. The message is the same as "git checkout -b" when we are actually
moving to a new branch. We could optionally mention that the branch
is empty or unborn.
2. We do not check whether the old unborn branch has the same name as
the new one. So you get "Switched to a new branch..." if you try to
checkout the same branch. We'd have to pass more information into
the special case to detect this. I don't know if we care.
builtin/checkout.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 781295b..a9c1b5a 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c@@ -951,6 +951,9 @@ static int switch_unborn_to_new_branch(const struct checkout_opts *opts) strbuf_addf(&branch_ref, "refs/heads/%s", opts->new_branch); status = create_symref("HEAD", branch_ref.buf, "checkout -b"); strbuf_release(&branch_ref); + if (!opts->quiet) + fprintf(stderr, _("Switched to a new branch '%s'\n"), + opts->new_branch); return status; }