Git分支没有返回任何结果

时间:2014-02-14 02:37:53

标签: git git-branch

我正在试图查看我所在的分支,但它不起作用......

$ git checkout -b test
Switched to a new branch 'test'
$ git branch
$ git branch -a
$ 

2 个答案:

答案 0 :(得分:13)

那是因为您尚未提交任何内容,当您执行git checkout -b test时,git会将.git/HEAD文件的内容从ref: refs/heads/master修改为ref: refs/heads/test,这实际上指向的是。只有在你提交之后才会为你创建test引用,你会找到一个.git/refs/heads/test文件,其中包含你刚才提交的哈希。

答案 1 :(得分:1)

这个问题现在有一些重复的链接,所以我想我将在neevek's accepted answer上进行扩展。具体来说,我们可以说为什么存在未出生分支的概念。

让我们以此开始:Git 分支,并提交了 have 文件,而Git并不是真正的关于分支或文件。 。 Git实际上是关于 commits 的全部内容。

Git存储库中的提交已编号,但是编号有些奇怪。而不是简单地对数字进行计数(首先提交#1,然后依次是#2,然后是#3,依此类推),每个数字都是一个看起来很随机的 hash ID 。这些实际上根本不是随机的:现在,它们都是SHA-1哈希,尽管Git从SHA-256开始逐渐获得使用其他哈希的能力。但是无论如何,每次提交都会获得一个唯一的数字,该数字通常会缩短为看上去仍然是随机的字母和数字序列,例如a1f9371053af72或其他任何数字。

创建新的存储库(使用git init或通过克隆空存储库)时,尚无提交内容。这应该很合理:提交是通过创建提交的动作而存在的,或者,当您使用git clone时,通过从其他现有Git存储库中复制来完成所有提交它有。

具有分支名称的棘手的部分是,分支名称的工作方式是保存 one 提交的哈希ID。我们不会详细介绍Git如何找到所有 previous 提交,但是可以。这里的要点是,要存在一个分支名称,它必须保存一些现有提交的哈希ID。

哈希ID不可预测。除其他事项外,您进行的任何新提交的哈希ID确切地取决于何时,而第二个则由您进行。因此,无法提前知道第一次提交的随机哈希哈希ID是什么。

由于分支名称​​具有来保存一些有效的现有提交的哈希ID,并且空存储库中没有提交,因此也不允许任何分支名称存在!因此,空的存储库没有分支(当然也没有提交)。但是,在新的存储库中,您上。你怎么能在一个不存在的分支上?

Git对这个难题的答案是让您进入未出生的分支。您当前的分支是这个未出生的分支。您可以选择喜欢的任何其他未出生分支名称,使用git checkout -b切换到该其他未出生分支名称。以前的未出生名字仍然不存在,现在已被忘记。

当您在此新存储库中进行第一次提交时, now 分支名称可以存在。 Git将未出生的分支的名称创建为有效的分支名称,并在该名称中存储刚创建的新提交的哈希ID。而且,既然已经存在一个提交,则现在可以创建任意数量的分支名称。当每个名称都可以包含第一个提交的ID或第二个提交的ID时,所有这些都必须保留一个提交的哈希ID,直到您创建第二个提交为止。但是在这种特殊状态下,当根本没有提交时,也将没有分支名称。

请注意,除了这种特殊情况外,git checkout还可以创建 new 未出生的分支。其标志是--orphan(而不是--unborn),但是git checkout --orphan name的作用是使您进入未出生分支状态,当前分支名称为 {{1 }} ,这样您创建的 next 提交将创建该分支的名称。这将产生一个新分支,其历史仅包含单个新提交,因此新分支的历史与该存储库中任何其他分支名称的历史都不相关。这种模式很少有特殊用途,但它始终可用,因为新的空存储库需要此未出生的分支状态。