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

Re: some git confusion (where git's advice didn't help)

From
Jeff King <peff@peff.net>
Date
May 14, 2019, 11:21 UTC
Message-ID
<20190514112115.GA26957@sigill.intra.peff.net>
In-Reply-To
<5CDA9063020000A10003131D@gwsmtp.uni-regensburg.de>
On Tue, May 14, 2019 at 11:54:43AM +0200, Ulrich Windl wrote:
Show 22 quoted lines
> > git branch --track origin/f-gcc-4.8
> Branch origin/f-gcc-4.8 set up to track local branch next.
> > git fetch
> > git branch
>   f-systemd
>   integration
>   master
> * next
>   origin/f-gcc-4.8
> > git merge f-gcc-4.8
> merge: f-gcc-4.8 - not something we can merge
> 
> Did you mean this?
>         origin/f-gcc-4.8
> > git merge origin/f-gcc-4.8
> warning: refname 'origin/f-gcc-4.8' is ambiguous.
> Already up-to-date.
> 
> ### So actually this advice wasn't helpful at all. Cause of the
> problem most likely was "git branch --track origin/f-gcc-4.8" that
> "imported" the branch under the same name as the remote branch is
> referenced.

Right, that was the source of the problem. Having both "refs/heads/origin/f-gcc-4.8" and "refs/remotes/origin/f-gcc-4.8" is going to lead to confusion, and you're best off deleting the mistaken branch as soon as possible.

But I agree we could be more helpful in the messages.

The "did you mean?" advice just blindly says "oh, you asked for X and refs/remotes/ABC/X exists, so let's suggest ABC/X", without checking for ambiguities. It should probably do this:

diff --git a/help.c b/help.c
index a9e451f2ee..108ca54af3 100644
--- a/help.c
+++ b/help.c
@@ -759,7 +759,8 @@ static int append_similar_ref(const char *refname, const struct object_id *oid,
 	/* A remote branch of the same name is deemed similar */
 	if (skip_prefix(refname, "refs/remotes/", &remote) &&
 	    !strcmp(branch, cb->base_ref))
-		string_list_append(cb->similar_refs, remote);
+		string_list_append(cb->similar_refs,
+				   shorten_unambiguous_ref(refname, 1));
 	return 0;
 }
 

which would print "ABC/X" in most cases, but "remotes/ABC/X" for your
ambiguous case. Incidentally, the existing code also has a memory
problem! It blindly skips past "refs/remotes/" in the refname and saves
the pointer away in a NODUP string-list. But that refname pointer isn't
ours, and isn't guaranteed to last past our for_each_ref() callback. The
hunk above fixes it because shorten_unambiguous_ref() always returns a
newly allocated string. :)

I also think the "warning: refname ... is ambiguous" message would
probably be a bit more helpful if it showed _which_ candidates it found
(and which one it chose!).

-Peff
Previous: Ulrich WindlNext: Duy Nguyen
Message 2 of 7 in “some git confusion (where git's advice didn't help)”
  1. Ulrich WindlMay 14, 2019
  2. Jeff KingMay 14, 2019
  3. Duy NguyenMay 14, 2019
  4. Jeff KingMay 14, 2019
  5. 0/2 some fixes for help_unknown_ref()Jeff King, May 14, 2019
  6. 1/2 help_unknown_ref(): duplicate collected refnamesJeff King, May 14, 2019
  7. 2/2 help_unknown_ref(): check for refname ambiguityJeff King, May 14, 2019

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.