59

我查看了所有其他模棱两可的 refname 问题,但似乎都没有帮助。为什么我会收到此警告?

$ git checkout master
warning: refname 'master' is ambiguous.
$ git show-ref master
eef61c00da690f093063ac5a728e22fd21648104 refs/heads/master
$ git branch -a
  checkers
  exercises
* master
$ git remote -v
$ 
4

4 回答 4

84

TL;DR:保存和删除标签,如Ashutosh Jindal 评论(请参阅“在 git 中重命名标签? ”):

git tag tag-master master
git tag -d master

原答案:

我看到的大多数来源(如这个常见问题解答)都指向相同的原因:

当您尝试结帐本地分支时,您会得到一个

warning: refname 'branch-name' is ambiguous

如果您创建了一个与远程标签同名的本地分支,就会发生这种情况
Git 应该检出你的本地分支,但它却试图检出标签,它会感到困惑。

几棵树的初始导入是有问题的,因为它们包含同名的分支和标签。从那以后,我们通过重命名标签解决了很多这些问题。

在您的情况下,您没有远程,但是像您的分支一样命名的本地标签就足够了。

歧义在gitrevision中指定

<refname>, 例如master, heads/master,refs/heads/master

一个符号引用名称。例如master,通常表示 . 引用的提交对象refs/heads/master
如果你碰巧同时拥有heads/masterand tags/master,你可以明确heads/master告诉 git 你指的是哪一个。
<refname>有歧义时,通过以下规则中的第一个匹配来消除 a 的歧义:

如果$GIT_DIR/<refname>存在,这就是你的意思(这通常只对HEAD, FETCH_HEAD, ORIG_HEAD,MERGE_HEAD和有用CHERRY_PICK_HEAD);

  • 否则,refs/<refname>如果存在;
  • 否则,refs/tags/<refname>如果存在;
  • 否则,refs/heads/<refname>如果存在;
  • 否则,refs/remotes/<refname>如果存在;
  • 否则,refs/remotes/<refname>/HEAD如果它存在。

因此,请检查在您的存储库中master可以找到的位置。

并且git checkout heads/master永远有效。
警告:默认情况下,这会以DETACHED HEAD 模式检出分支。请参阅“为什么git checkout使用显式 ' refs/heads/branch' 会给出分离的 HEAD? ”。

为避免这种情况,并且仍然使用明确的 ref,请键入:

git checkout -B master heads/master
于 2012-09-01T07:07:01.577 回答
37

虽然这不适用于 OP 的情况,但refname is ambiguous在不小心做了 agit branch origin/branch而不是git checkout origin/branch. 这创建了一个名为 的本地分支origin/branch,这使得它与远程分支不明确。解决问题很简单git branch -D origin/branch(安全,因为-D在本地分支上运行)。

于 2015-01-22T23:01:15.007 回答
23

这只是发生在我身上。我不知何故有一个包含 sha 的文件 .git/master。不知道那是怎么到那里的,但是当我删除它时,错误就消失了。如果您仔细阅读接受的答案,这是“预期行为”,但如果您这样做,您将看不到 .git/master,例如 git show-ref master 因为它遵循略有不同的规则。

于 2013-03-05T23:19:41.653 回答
0

如果您错误地配置了两个具有相同名称的远程服务器,则会出现此消息,从而产生歧义。

检查你的.git/config文件。如果您有多个远程仓库配置了相同的配置:

fetch = +refs/heads/*:refs/remotes/origin/*.

您应该将其中一个更改为不同的名称,例如:

fetch = +refs/heads/*:refs/remotes/another_repo/*

于 2021-02-20T10:02:48.870 回答