为什么没有git branch <mybranch>工作但是git checkout -b <mybranch>工作?

时间:2016-10-27 09:44:39

标签: git version-control branch git-branch

this post git checkout -b <mybranch>中所述,同时运行两个命令

  1. git branch <mybranch>
  2. git checkout <mybranch>
  3. 我使用git init创建了一个新的git存储库。现在,当我运行git branch development时,我收到错误:

      

    不是有效的对象名称:&#39; development&#39;。

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

      

    pathspec&#39; newbranch2&#39;与git已知的任何文件都不匹配。

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

      

    切换到新的分支&#39; BigShotBranch&#39;

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

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

3 个答案:

答案 0 :(得分:1)

新创建的空存储库是一个极端情况。虽然php -a Interactive mode enabled php > $today = '2016-10-27'; php > $tomorrow = '2016-10-28'; php > $today2 = '2016-10-27'; php > echo $today <=> $tomorrow; -1 php > echo $today <=> $today2; 0 php > echo $tomorrow <=> $today2; 1 引用了.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运行。

答案 1 :(得分:1)

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

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

它甚至没有master

所拥有的当前分支(名称),这是一种自相矛盾的,因为分支不存在,因此名称不能可能有效。但是,新的空存储库必须具有当前分支,即使它没有分支,因为没有提交 - 所以Git有一个特殊情况规定,你可能有一个所谓的 orphan branch ,没有&#34;分支&#34; (它并不存在),但它是你当前的分支(因此它存在,在这种奇怪的状态下存在)。

当你进行提交时,孤儿分支现在有一个可以 - 并且指向的提交。但是,这个&#34;只有一个分支可以创建&#34;状态,只有git checkout -b可以设置它。 (好吧,一些管道命令也可以设置它。)在非空的存储库中,必须使用git checkout --orphan进行设置,因为git checkout -b将新分支设置为指向当前提交(因为有一个)。

附注:你将GitHub(这是一个网站)和Git(只连接到GitHub,因为GitHub可以访问Git存储库)混合在一起。

答案 2 :(得分:0)

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

虽然只要创建提交,您就可以使用相同的语法来创建分支。从现在开始,HEAD将指向将用于创建分支的提交。

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