【问题标题】:What does `git branch -M` do with a single argument?`git branch -M` 对单个参数有什么作用?
【发布时间】:2021-10-03 16:03:01
【问题描述】:

我正在尝试将本地存储库上传到 GitHub。在站点上创建一个新的 repo 后,GitHub 给出了在本地执行的以下指令:

git remote add origin https://github.com/MyOrg/repo-name.git
git branch -M main
git push -u origin main

当我执行它们时,git branch 步骤出现错误:

$ git remote add origin https://github.com/MyOrg/repo-name.git
$ git branch -M main
error: refname refs/heads/trunk not found
fatal: Branch rename failed

-M 标志为git branch-m(移动)和-f(强制)的组合,用于强制重命名分支。标准命令的格式为

$ git branch -M <oldbranch> <newbranch>

然而,在这里,GitHub 只给了我一个论点。我假设,因为没有人愿意费心说明这一点,这一论点是&lt;newbranch&gt;

docs 只这么说

使用 -m 或 -M 选项,&lt;oldbranch&gt; 将重命名为 &lt;newbranch&gt;。如果 &lt;oldbranch&gt; 有相应的 reflog,则将其重命名为匹配 &lt;newbranch&gt;,并创建一个 reflog 条目以记住分支重命名。如果&lt;newbranch&gt; 存在,则必须使用-M 来强制进行重命名。

没有解释当 &lt;oldbranch&gt; 未指定时会发生什么。我假设git branch 使用一些秘密算法来确定它应该为&lt;oldbranch&gt; 使用什么。知道这一点将帮助我找出导致错误的原因以及如何解决它。我可以知道git branch -M 如何处理单个参数吗?

分辨率

@bk2204 建议 git branch 隐含地将 &lt;oldbranch&gt; 作为当前分支,如果它没有作为命令的一部分提供的话。这足以假设,尽管权威来源仍然很棒。

@phd 然后建议了几种确定当前分支的方法。就我而言:

$ git branch --show-current
trunk

$ git rev-parse HEAD
HEAD

$ git symbolic-ref HEAD
refs/heads/trunk

由于我试图按照 GitHub 的说明明确引用 refs/heads/trunk 的错误,我进一步假设 git branch 调用 git symbolic-ref HEAD 以确定当前分支。同样,对此进行权威确认会很棒。

根据其documentationgit symbolic-ref 返回与符号引用“HEAD”关联的文件路径。

在我的情况下,返回的文件路径 refs/heads/trunk 不存在。相反,我有一个文件refs/heads/master

$ ls -A1h refs/heads/
master
origin/

由于缺乏 GitHub 的指导,我必须假设这是他们希望我重命名为“main”的内容。我可以使用git branch -M 来做到这一点,并明确地将其提供为&lt;oldbranch&gt;

$ git branch -M master main
$ ls -A1h refs/heads/
main
origin/

完成后,命令

$ git push -u origin main

按预期工作,并将 repo 推送到 GitHub。

【问题讨论】:

  • -m-M 选项到 git branch 已在 Git 2.30 中升级,以允许在特殊情况下重命名尚不存在的当前分支名称,例如当您在新的空存储库。当还没有提交时,还不能有任何分支名称。尽管如此,Git 要求您“在”某个分支,即使它不存在。在 2.30 之前的 Git 版本中,还有其他方法可以重命名不存在的分支,但显而易见的方法——git branch -m——直到那时才起作用。
  • @torek 这对上下文很有帮助,谢谢。不过,这不是一个空的 repo,它是一个从 SVN repo 转换而来的裸 repo。它有很多来自转换的提交。
  • 啊,在那种情况下,只是转换软件不费心将当前分支名称设置为某个现有分支的问题。在您使用的任何转换软件中,这都是一个(小)错误......

标签: git github git-branch


【解决方案1】:

如果没有指定oldbranchgit branch 使用当前分支。因此,git branch -M main 将当前分支重命名为 main

在您的情况下,当前分支不存在,可能是因为您在本地没有任何提交。一旦提交,分支就会存在,并且分支重命名将起作用。

【讨论】:

  • 我明白了。不过,我没有什么可承诺的。我正在将旧的 SVN 存储库转换为 GitHub 上的存储库,并且我不想在中间添加任何新内容,只需按原样上传 SVN 存储库即可。你知道另一种让当前分支存在的方法吗?
  • 另外,你知道git branch 是如何确定当前分支是什么,所以我可以自己检查它在做什么吗?
  • git status -sb 应该向您显示当前分支。如果您现在没有任何提交,请等到稍后再运行git branch -M main
  • git branch --show-current, git rev-parse HEAD, git symbolic-ref HEAD
  • @BoreaDeitz 这是对你问题“你知道 git branch 如何确定当前分支是什么......?的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2015-11-12
  • 2011-12-20
  • 2020-03-05
  • 2021-05-19
相关资源
最近更新 更多