【问题标题】:Why doesn't git branch <mybranch> work but git checkout -b <mybranch> work?为什么 git branch <mybranch> 不起作用但 git checkout -b <mybranch> 起作用?
【发布时间】:2017-03-09 22:38:50
【问题描述】:

正如this post 中解释的git checkout -b &lt;mybranch&gt; 同时运行两个命令

  1. git branch &lt;mybranch&gt;
  2. git checkout &lt;mybranch&gt;

我使用git init 创建了一个新的 git 存储库。现在当我运行git branch development 时,我得到了错误:

不是有效的对象名称:“开发”。

如果我运行git checkout newbranch。我得到错误:

pathspec 'newbranch2' 与 git 已知的任何文件都不匹配。

但如果我使用git checkout -b BigShotBranch,那么它只会创建带有消息的本地分支:

切换到新分支“BigShotBranch”

所以我的问题是为什么-b 标志能够创建分支而其他任何方法都不能? -b 标志是否只结合了两个命令或做更多的事情?

P.S:这似乎是 git 中的一个小故障。在git checkout -b development 之后,master 分支实际上被重命名为development。现在没有master分支。

【问题讨论】:

    标签: git version-control branch git-branch


    【解决方案1】:

    这种行为的原因是git branch &lt;branch-name&gt; [&lt;start-point&gt;] 创建的新分支没有可以指向的提交(起点),因此出现了错误。你应该在这里阅读文档, https://git-scm.com/docs/git-branch

    尽管一旦你创建了一个提交,你就可以使用相同的语法来创建分支。由于现在将有一个提交,HEAD 将指向将用于创建分支的提交。

    其次,拥有master只是默认创建的约定,如果您在第一次提交之前使用git checkout -b development创建一个分支,您的第一次提交将在该分支上,因此您的默认master分支将不会被创建自动地。这就是您的主分支消失的原因。您可以根据需要通过git branch mastergit checkout -b master 简单地创建主分支。

    【讨论】:

      【解决方案2】:

      发生这种情况是因为您运行了 git init,创建了一个新的 存储库。

      分支名称必须始终指向某个现有提交。一个新的空存储库没有提交。这意味着它也没有分支。

      它甚至没有master

      拥有的是一个当前分支(名称),这有点自相矛盾,因为分支不存在,因此名称不可能是有效的。然而,一个新的、空的存储库必须有一个当前分支,即使它不能有一个分支,因为没有提交——所以 Git 有一个特殊情况规定,你可能有一个所谓的孤儿分支,它没有“分支”(它并不真正存在),但却是您当前的分支(因此它存在,有点像,处于这种奇怪的边缘状态)。

      当您进行提交时,孤立分支现在有一个它可以——并且确实——指向的提交。但是这种“尚未创建”状态只能有一个分支,并且只有git checkout -b可以设置。 (好吧,一些管道命令也可以设置它。)在非空存储库中,您必须使用git checkout --orphan 设置它,因为git checkout -b 会将新分支设置为指向当前提交(因为有一个)。

      旁注:您将 GitHub(这是一个网站)和 Git(仅连接到 GitHub,因为 GitHub 提供对 Git 存储库的访问)。

      【讨论】:

      • 其实我用的是bitbucket和gitbash命令行工具。
      • 好的,但是你说你“创建了一个本地 github 存储库”:我只是说,顺便说一句,你没有这样做,你创建了一个 git 存储库。
      【解决方案3】:

      新创建的空存储库是一种极端情况。虽然.git/HEAD 指的是refs/heads/master,但实际上.git/refs/heads/ 还是空的。 “git branch newbranch”尝试解析HEAD(以便从当前提交开始新分支)但失败了。

      虽然“git checkout -b”是借助“git branch”来解释的,但在前者下面并不直接调用后者(但它们显然共享一些较低级别的代码)。注意git checkout 支持通过--orphan 开关创建根分支,git branch 不能。显然,在空存储库的情况下,git branch -b 实际上是作为git branch --orphan 运行的。

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 2011-12-20
        • 2020-03-05
        • 2021-03-27
        • 2012-04-17
        • 2018-08-31
        • 2021-04-14
        • 2018-11-18
        相关资源
        最近更新 更多