如this post git checkout -b <mybranch>
中所述,同时运行两个命令
git branch <mybranch>
git checkout <mybranch>
我使用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
标志只组合两个命令或做更多的事情吗?
git checkout -b development
之后,主分支实际上已重命名为development
。现在没有主分支。
答案 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 master
或git checkout -b master
创建主分支。