【问题标题】:Git: warning: refname 'master' is ambiguousGit:警告:refname'master'不明确
【发布时间】:2012-10-15 21:37:04
【问题描述】:

我看到有几个人在这里问同样的问题,但他们的建议似乎都不适用于我。我收到了标题中的警告,但我没有任何名为“master”的标签。这是git branch -a的结果:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

知道这里可能出了什么问题吗?我现在才使用 git 几个月,所以主要是担心这种歧义可能会在未来与 repo 混淆。

【问题讨论】:

  • 什么命令发出警告?
  • stackoverflow.com/a/12225704/6309 中提到的可能的“大师”列表是否有帮助? git checkout heads/master应该可以工作(没有警告)
  • 请显示git show-ref的输出。
  • @CharlesBailey 抱歉在这里耽搁了,但是git show-ref 的输出是一堆不适合这里的东西。我相信有两行以“master”结尾可能是相关的:refs/remotes/origin/master、refs/heads/master

标签: git


【解决方案1】:

对我来说,当我错误地发出“update-ref”命令时,我很早就找到了这个警告的来源。如果您忘记在第一个 arg 中指定完整的 refs/heads/mybranchname 路径,则会创建一个文件 .git/mybranchname,稍后当您尝试切换到该分支时会导致此警告。

只需删除.git/mybranchname即可解决,例如:

rm .git/master

作为参考,update-ref 命令的正确格式是:

git update-ref refs/heads/mybranchname mytargetbranch

不要忘记“refs/heads”部分!

另外,我最常见的 update-ref 用例只是手动移动一个分支以指向另一个提交,我发现了一种更简单的语法:

git branch -f myBranchToMove destinationBranchOrHash

这种语法对我来说更容易,因为它不需要容易出错的 refs/heads 路径限定符。

【讨论】:

  • 我做了同样的事情。不过,该命令似乎没有做任何事情,所以我添加了“refs/heads”部分,并没有意识到它在 .git 目录中留下了残留物。
  • git update-ref -d master 也可以工作,一旦你意识到它是创建重复引用的 update-ref 命令。
  • 如果你只想在提交之间移动一个分支,最好删除分支(branch -d)并在另一个提交上重新创建它(checkout -b)。这不需要任何摆弄参考。
【解决方案2】:

如“Git: refname 'master' is ambiguous”中所述,这意味着,除了heads/master,您在 git 存储库中的以下命名空间之一中还有另一个 master:

refs/<refname> 
refs/tags/<refname>
refs/heads/<refname>
refs/remotes/<refname>
refs/remotes/<refname>/HEAD

甚至./&lt;refname&gt;,如Magnusanswer中所述。

【讨论】:

  • 或者只是 ./&lt;refname&gt; Magnus 提到的。 (就我而言)
【解决方案3】:

为了将来参考,我遇到了同样的问题,最终对我有用的是here 描述的解决方案。基本上,当您收到Git: warning: refname 'xxx' is ambiguous 警告时,您可以使用:git show-ref xxx 检查对xxx 分支的引用并验证哪些存在冲突。

在我的场景中,它是一个名为xxx 的标记和具有相同名称的分支名称。该标签是错误制作的,已从服务器中删除,所以我需要做的就是更新我的本地标签以匹配服务器:git fetch -p -P。这个命令详细解释here

【讨论】:

    【解决方案4】:
    git fetch --prune
    
    git pull origin branch-name
    

    应该可以解决您的问题。

    【讨论】:

      【解决方案5】:

      我在创建与标签同名的分支时遇到了类似的问题(不是master)。

      这帮助我删除了标签https://stackoverflow.com/a/5480292/150953

      git push --delete origin tagname
      

      【讨论】:

      • Scott - 有没有办法阻止用户创建类似于分支的标签名称
      • @Paul 对不起,我不知道。你会认为 git 不会让你这样做,但它确实会。
      • 您能否帮助创建一个 webhook 来检查名称为 develop 的标签,并在每次推送后将其删除?
      【解决方案6】:

      检查您的.git/config 文件。如果你有多个远程仓库配置了相同的配置,你可能会遇到这个问题:

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

      另一个远程服务器应该有不同的名称,例如:

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

      【讨论】:

      • 哇...这里是真正的死灵法师。我在 8 年前问过这个问题……那时我还在搞清楚 git 到底是什么。我可能把我的提交树扭成了一个结。谁知道那是什么。感谢您仍然为未来的人们提供新的调查途径!
      猜你喜欢
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2013-10-27
      • 2015-04-26
      • 1970-01-01
      • 2011-07-13
      • 2021-09-08
      • 2018-04-22
      相关资源
      最近更新 更多