我有一个存储库。如何显示其所有分支?
以下两个命令是否应该显示所有分支?如果是,为什么不显示分支master
?我的印象是,在询问Will pushing a new branch to another repository create an upstream branch and record the upstream branch in the config file of the first repository?时,存储库没有分支master
。
$ git branch -a
mongodbutils
$ git show-branch
[mongodbutils] mongodbutils
$ ls .git/refs/heads/
mongodbutils
以下命令为什么提及分支master
?
$ git show
fatal: your current branch 'master' does not have any commits yet
如何显示存储库中的所有分支(在这种情况下,包括master
)?我认为这很重要,否则,我会有同样的错误印象。
注意:该存储库是由git init
一个空目录创建的,然后我从另一个分支git push
到另一个分支mongodbutils
进入该分支。
谢谢。
答案 0 :(得分:4)
在新创建的git存储库中,直到将某些内容推送到master分支上之前,该存储库实际上处于“无效”状态。 HEAD设置为指向master分支,但是master分支在存储库本身中不存在。
git分支与该分支的HEAD的提交同义。分支只是存储库中提交之一的别名。仅此而已。仅此而已。 git init
用HEAD初始化存储库,表明它是master分支的HEAD,但是存储库中没有实际的master分支。
进行第一次提交后,该提交将被推送到存储库中,并且git分支将被指向该提交。每次提交都会发生这种情况,不仅是最初的提交,而且现在,在初次提交之后,一切都井然有序。
您看到的是该错误消息,是git当前,临时,混乱状态的最终结果。如果执行git checkout mongodbutils
,则master
分支的所有痕迹都将消失。当然,git show
随后会向您显示该分支的HEAD提交,并且没有错误消息,并且git branch
也不会报告master
分支的证据。
答案 1 :(得分:2)
根据documentation of git branch
的解释,git branch --all
(或-a
)列出了本地存储库中的所有分支,包括本地跟踪分支和远程跟踪分支。
Git分支只是指向提交的指针。新的存储库(仅使用git init
创建)不包含任何提交。新仓库中的当前分支为master
,但master
分支实际上并不存在。实际上,新的存储库不包含任何分支。
创建第一个提交时将创建master
分支。或从远程存储库中提取时。
由于您没有创建任何提交,也没有拉过master
分支,因此它在您的存储库中不存在。您列出的两个命令都向您展示了这件事。
git branch -a
是您要用来列出分支的人。
git show-branch
旨在供脚本和GUI工具使用。
答案 2 :(得分:1)
与Sam Varshavchik answered一样,您处于特殊状态。但是,我不会将其称为无效状态。
您可以随时使用git checkout --orphan
在其他任何Git存储库中达到相同的状态:
$ git status
On branch master
Your branch is behind 'origin/master' by 98 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
$ git checkout --orphan asdf
Switched to a new branch 'asdf'
$ git status | head -3
On branch asdf
No commits yet
$ git branch | grep asdf
$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 98 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
在git init
刚创建的新的空存储库中,总是如此。 因为一个分支的存在是因为其名称以refs/heads/
开头的引用包含有效提交的哈希ID。
在一个新的空存储库中,没有有效的提交。因此,分支master
不存在。但是,您仍在分支master
上。
之所以出现这种矛盾,是因为符号引用可以命名不存在的分支。 HEAD
通常是符号引用(当然,当它是“分离”时除外)。也就是说,HEAD
包含分支的名称。该分支不必存在!如果没有,Git会说您在未出生的分支上,或者有时您有一个孤立的分支,或者只是一个“尚无提交”的分支。
git branch
命令枚举了存在的分支,因此,如果您处于这种特殊状态,它将跳过该未出生的分支。 (应该 git branch
枚举这个额外的,不存在的分支吗?这是一个合理的问题。Git当前说不,但是也许有一天Git的作者会改变主意。)
要查看附加了哪个分支名称HEAD
,请使用git symbolic-ref HEAD
。如果您处于分离的HEAD状态,该命令将失败(并显示错误消息),因此您知道HEAD
未附加到 any 分支名称。否则,您将获得分支名称:
$ git symbolic-ref HEAD
refs/heads/asdf
即使分支名称不存在。
当您处于处于不存在的分支的特殊状态时,这对您运行的 next git commit
具有重要影响
与往常一样,git commit
将根据您运行git commit
时索引中的内容来构建其新提交的 content 。使用git checkout --orphan
会使索引保持原状,这就是我在上面运行git status | head -3
的原因:对于我来说,索引仍然充满了master
开头的所有文件:
$ git status --short --branch | head -5
## No commits yet on asdf
A .clang-format
A .editorconfig
A .gitattributes
A .github/CONTRIBUTING.md
我实际上不会在这里运行git commit
,但是如果我这样做了,Git现在将进行一次新提交,使用索引内容作为快照,收集来自我的日志消息,使用我的作者姓名和提交者,等等。但是,新提交的 parents 完全没有。因此,新的提交将是新的根提交。
在新的完全空的存储库中,这就是master
的要求:第一个提交是一个 the 根调用,它创建了{{1} },因此您现在有了master
分支。这也是master
使用 的意思:您希望下一次提交是另一个root提交。
这不是特别有用,除非在特殊情况下,例如在进行git checkout --orphan
时,Git希望在内部进行此操作。