如何显示存储库中的所有分支?

时间:2019-01-12 16:28:48

标签: git

我有一个存储库。如何显示其所有分支?

以下两个命令是否应该显示所有分支?如果是,为什么不显示分支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进入该分支。

谢谢。

3 个答案:

答案 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希望在内部进行此操作。