我正在尝试使过程自动化并发出git branch
命令以找出我所在的分支。除了新初始化的仓库(git branch
不返回任何内容)之外,其他一切都工作正常。鉴于我对仓库没有做任何事情,甚至没有执行最初的提交,我都可以接受答案。但是,如果我运行git status
,它会告诉我我在master
分支上,如下所示:
$ mkdir todelete
$ cd todelete
$ git init
Initialized empty Git repository in /u/u70021a/todelete/.git
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
$ git branch
$
我做错什么了吗?有没有我没有正确设置的设置?
我也有很多Git的新人,我无法向他们解释为什么显示他们所在分支的命令什么都没显示,而status命令却显示了。
答案 0 :(得分:73)
我还提出了另外两个答案,但是我认为思考这个问题的方法很简单:您可以位于不存在的分支上。这是 normal 一个新的空存储库,因为要存在一个分支名称,该分支名称必须标识现有有效提交的哈希ID。一个新的空存储库没有提交,因此尚不存在任何分支名称。
不过,起初,您位于 some 分支上。您所在的分支是其名称存储在特殊名称HEAD
中的分支。在新的空存储库中,Git在master
中存储名称refs/heads/master
(更确切地说,HEAD
-分支的全名),因此您位于master
上,而master
不存在。
您可以使用git checkout -b
更改您所在的不存在的分支:
$ git init
Initialized empty Git repository in [path]
$ git checkout -b asdf
Switched to a new branch 'asdf'
$ git checkout -b hello
Switched to a new branch 'hello'
每当您在不存在的分支上时,您进行的下一次提交都会创建。 git checkout --orphan
的工作方式也是如此。
答案 1 :(得分:14)
git branch
由于没有分支,因此什么也不显示。但是,正如您在man git init
中所读到的:
此命令创建一个空的Git存储库-基本上是一个.git目录,其中包含对象的子目录, 参考/标题,参考/标签和模板文件。 一个初始HEAD文件,该文件引用了主文件的HEAD 分支也会创建。
我加粗了我认为相关的部分-看起来虽然还没有master分支,但已经存在对其的引用,这就是为什么它在git status
中显示。提交后将创建一个适当的分支。
答案 2 :(得分:11)
分支尚未诞生。因此,git branch
不会显示它(git symbolic-ref HEAD
表示您的HEAD指向默认的分支主机,并且由于git branch
没有显示它而没有出生,也就是说,您可以在尚不存在的分支上)。但是,提交内容会创建分支。
如果您签出orphan
分支,情况也是如此。
我想git status
显示了分支名称,因为这是将要创建的分支。
有关脚本的信息,请参见How to programmatically determine the current checked out Git branch
答案 3 :(得分:11)
现有的答案解决了字面上的问题,即输出为何如此,但我认为它们已经掩盖了实际问题...
您说过要自动化,所以我建议git status
和git branch
都不是脚本上下文中的最佳工具。
在此讨论中可以找到一些替代方法:How to programmatically determine the current checked out Git branch
在不知道您的需求(或您希望未出生分支的行为方式)的情况下,我不一定会提出建议,但是我要讲的是,一些命令是用于人机交互(瓷器)的,而另一些是用于脚本(管道)
答案 4 :(得分:-1)