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

Re: error: src refspec refs/heads/master matches more than one.

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Feb 20, 2014, 04:17 UTC
Message-ID
<530581D5.4040507@alum.mit.edu>
In-Reply-To
<xmqqtxbwdwt2.fsf@gitster.dls.corp.google.com>
On 02/18/2014 08:51 PM, Junio C Hamano wrote:
Show 19 quoted lines
> John Keeping <john@keeping.me.uk> writes:
> 
>> There's already the arbitrary set of prefixes in
>> refs.c::prettify_refname() and refs.c::ref_rev_parse_rules().  I can see
>> how a user might think that since "git log refs/heads/name" is
>> equivalent to "git log master" then "git branch refs/heads/name" should
>> be equivalent to "git branch name".
> 
> Not quite, I am afraid.  Branch names used for "git branch <name>"
> and "git checkout <name>" are like the Lvalue of an assignment, as
> opposed to extended SHA-1 expressions to express any commit
> (e.g. 'master^0', 'refs/heads/master', or 'master') that correspond
> to the Rvalues used in an expression.  Because "git checkout" can
> take a branch name or an arbitrary commit object name, there needs a
> way for the users to disambiguate.
> 
> Saying that "git checkout refs/heads/name" must be equivalent to
> "git checkout name" is like arguing that assignment "value+0 = x"
> should be valid because "value+0" is a valid value.

Your logic is impeccable...and yet the user's logic is also quite reasonable. I fell into this trap when I started using Git, and so did most (all?) of my colleagues.

I think the problem is partly caused by the visual and semantic
similarity between references and Unix pathnames.  For pathnames, the
file that is called "filename.txt" in my current context has an
unambiguous, canonical name that might be "/home/mhagger/filename.txt".
 My first mental model of Git references was that "branch" and
"refs/heads/branch" are synonyms, and that the latter is somehow the
"unambiguous" and "canonical" way to write it.  I think this mental
model is what led me to make the universal beginner's mistake
    git branch refs/heads/mybranch

It took me a while to figure out how to fix the situation, and the whole experience was very frustrating.

I wonder whether we could give a way to specify a reference in an unambiguous, canonical fashion like I expected, for example by using a leading slash: "/refs/heads/mybranch". This could be a way for the user to ask for DWIMming to be turned off without having to resort to plumbing commands like update-ref. This wouldn't necessarily solve the problem, but it would at least lead the new user to type

    git branch /refs/heads/mybranch

instead of the ambiguous command above, which Git could either accept or reject in good conscience rather than having to speculate about what the user *really* meant. I think that supporting absolute reference names like this would also be useful for scripts, which otherwise probably often have subtle failure modes if the user has defined reference names that are ambiguous, modulo DWIM, with the reference that the script intended.

Michael
-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
Previous: John KeepingNext: Junio C Hamano
Message 17 of 21 in “error: src refspec refs/heads/master matches more than one.”
  1. Josef WolfFeb 14, 2014
  2. Andreas SchwabFeb 14, 2014
  3. Duy NguyenFeb 14, 2014
  4. Josef WolfFeb 14, 2014
  5. David KastrupFeb 14, 2014
  6. Josef WolfFeb 14, 2014
  7. Junio C HamanoFeb 14, 2014
  8. David KastrupFeb 14, 2014
  9. Junio C HamanoFeb 14, 2014
  10. Josef WolfFeb 14, 2014
  11. Duy NguyenFeb 15, 2014
  12. Ingo RohloffFeb 17, 2014
  13. Junio C HamanoFeb 18, 2014
  14. John KeepingFeb 18, 2014
  15. Junio C HamanoFeb 18, 2014
  16. John KeepingFeb 18, 2014
  17. Michael HaggertyFeb 20, 2014
  18. Junio C HamanoFeb 20, 2014
  19. David KastrupFeb 18, 2014
  20. Junio C HamanoFeb 18, 2014
  21. Duy NguyenMar 23, 2016

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.