fr3dch3n's answer 是正确的——运行git status 会告诉你你在哪个分支上——但没有解决为什么git branch 根本没有显示任何东西。原因是你处于一种特殊的状态。
您刚刚通过git init 创建了一个新的空存储库——一个根本没有提交的存储库。
现在,关于 Git 中的分支名称的问题是它们总是——总是——指向一个特定的提交。但是你根本没有提交,那么像 master 或 aaa 这样的分支名称怎么能指向一个呢?
答案是它不能,所以它没有,Git 通过尚未创建分支来实现这一点。很简单,你在一个不存在的分支上。
当存储库是新的并且完全没有提交时,这种特殊状态必须发生,但如果您使用git checkout --orphan <newbranch>,也会发生这种情况。这会将您置于新分支上,而无需先创建该分支,因此新分支不存在。
当一个分支不存在,但你在git status 术语中“打开”该分支,并且你运行git commit,Git 像往常一样创建一个新的提交,1 和在该过程结束时,Git 更新当前分支名称,以便它指向它刚刚进行的新提交。如果分支以前不存在,那么现在存在!
因此,在一个新的空存储库中,您“打开”的分支不存在,而使用 git checkout -b 切换到另一个新分支会使您进入另一个仍然不存在的新分支。你在上的那个不存在的分支,只是消失在空气中:它从来不存在,它只是你“在”上的一个幻影,现在你在一个新的和不同的幻影。
(稍后git checkout --orphan <newbranch> 也会发生同样的事情:它会将您置于这种幽灵般不存在的分支上,如果您随后切换到不同的新分支,您将继续处于幽灵般不存在的分支上。假设git checkout 本身成功,运行git checkout master 或使用任何实际现有分支的名称将切换回现有分支。)
1git commit 流程是这样工作的,尽管各个步骤的精确顺序有些变化,而像 git commit --only <files> 这样的选项会产生更大的变化。
- 确保提交看起来正常(执行任何所需的预提交测试,包括运行预提交挂钩)。
- 将当前索引内容转换为至少一个 tree 对象,制作索引中所有文件(“blob”)的快照。 (这是
git write-tree 命令。)
- 将您的姓名、电子邮件和时间戳收集在一起作为“作者”,并再次作为“提交者”进行此提交。添加提交日志消息。
- 找出哪些提交是此提交的父提交。
- 制作新的提交对象 (
git commit-tree)。
- 更新当前分支名称,使其指向新的提交。
在这个特殊的“尚未创建的分支”条件下,实际创建分支的是第 6 步。
请注意,在第 4 步“找出父母”中,Git 注意到同样的“尚未创建的分支”条件。这种情况的结果是新提交没有 no 父级:新提交是 root 提交。不过,通常第 4 步会读取HEAD,目的是查找当前提交的哈希 ID:HEAD 包含分支名称,并且该分支确实存在并包含当前提交哈希 ID。
在解决来自git merge 的冲突后提交合并结果时,步骤 4 使用git merge 留下的跟踪文件来确定额外的父提交哈希(正常合并)或哈希(“章鱼”合并)。当前或 HEAD 或 @ 提交仍然像往常一样是第一个父项。