为什么每次创建新的本地git分支都会消失?

时间:2018-10-17 19:45:22

标签: git branch git-branch

我几个月没有使用Git了。 我刚开始一个新项目,一件事情困扰着我:每当我创建一个新分支时,已经存在的分支就会消失,就好像它被替换了一样。 我的意思是,当我执行“ git branch”时,我什么都没有! 显然,我的“ git checkout”不起作用。 我什至没有分支了。只有当前的一个。

我已经在工作的项目没有这个问题。

那是为什么?

1 个答案:

答案 0 :(得分:0)

这很正常:您刚刚创建了一个新项目:

$ mkdir newproj
$ cd newproj
$ git init
Initialized empty Git repository in .../newproj

此时,不存在分支。不过,正如git status会告诉您的那样,您位于master分支上:

$ git branch
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
$ 

您可以使用git checkout -b切换到另一个分支:

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

现在您仍然没有分支,但是现在您在分支xyz上,正如git status会告诉您的那样。

这种奇怪的状态是正常的,因为没有提交。如果没有提交,则不会有分支,因为分支 name 仅包含一些现有提交的哈希ID。没有提交,分支名称将不存在。

当创建一个 new 提交时,Git会执行以下步骤(前几步没有特定顺序;只有后几步具有实际顺序):

  1. 收集您的姓名和电子邮件地址,以用于新提交。
  2. 获取(您的计算机的想法)当前时间,以附加到您的姓名和电子邮件地址上。
  3. 收集日志消息。
  4. 冻结索引的内容(索引是您构建新提交的位置:git add将文件从工作树复制到索引中)。
  5. 如果存在当前提交,则获取当前提交的哈希ID。还可以获取正在合并的所有提交的哈希ID。
  6. 使用所有这些信息来创建 new 提交。创建提交会为其分配其哈希ID,该哈希ID是所有这些内容的加密校验和(您的姓名和带有时间戳的电子邮件地址,您的日志消息,冻结树的哈希ID等等)。
  7. 写通过写入新提交获得的哈希ID。此新提交的哈希ID进入当前分支名称。如果分支名称在此之前不存在,那么,现在它已经存在。

因此,直到您至少进行一次提交,您才能拥有任何分支名称。但是,即使该分支不存在,您仍然可以选择哪个分支名称是您的 current 分支:创建该分支名称的是第一次提交。

((一旦您完成 次提交,您可以在一个提交中附加任意数量的名称。如果您进行多次提交,则可以附加尽可能多的名称)我喜欢每个提交,尽管大多数提交不需要附加任何任何名称。Git通过从后来的提交中向后进行查找来找到它们,只有 last < / em> commit-分支的 tip -都需要一个名称,以便Git可以找到它,而无需先找到以后的提交。)