为什么我的本地 git 分支每次创建新分支时都会消失?
Why my local git branch disappear everytime i create a new one?
我有几个月没用 Git 了。
我刚刚启动了一个新项目,有一件事困扰着我:每次我创建一个新分支时,已经存在的分支就会消失,就好像它被替换了一样。
我的意思是,当我 "git branch" 时,我什么都没有!
显然,我的 "git checkout " 不起作用。
我什至没有我的分支了。只有现在的。
我已经在工作的项目中没有这个问题。
这是为什么?
这很正常:您刚刚创建了一个新项目:
$ 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 执行以下步骤(前几个没有任何特定顺序;只有最后几个有实际顺序):
- 收集您的姓名和电子邮件地址,以在新提交中使用。
- 获取(您的计算机的想法)当前时间,附加到您的姓名和电子邮件地址。
- 收集日志消息。
- 冻结索引的内容(索引是您构建新提交的地方:
git add
将文件从工作树复制到索引中)。
- 如果有当前提交,获取当前提交的哈希ID。如果合并,还获取任何提交的哈希 ID。
- 使用所有这些信息创建一个新 提交。创建提交会为其分配哈希 ID,这是所有这些内容的加密校验和(您的姓名和带有时间戳的电子邮件地址、您的日志消息、冻结树的哈希 ID,等等)。
- 写入写入新提交得到的hash ID。这个新提交的哈希 ID 进入 当前分支名称 。如果分支名称在此之前不存在,那么,现在它存在。
因此,只有在您至少进行一次提交后,您才能拥有任何分支名称。但是您仍然可以选择哪个分支名称是您的 current 分支,即使该分支不存在:创建第一个提交将创建分支名称。
(一旦你 do 至少有一个提交,你可以在一个提交上附加任意多个名称。如果你有多个提交,你可以附加每个提交的名字都可以,尽管大多数提交不需要附加任何名字。Git找到它们通过从后来的提交向后工作。只有 last 提交——分支的 tip——需要一个名称,因此 Git 可以找到它而无需先找到以后的提交。)
我有几个月没用 Git 了。 我刚刚启动了一个新项目,有一件事困扰着我:每次我创建一个新分支时,已经存在的分支就会消失,就好像它被替换了一样。 我的意思是,当我 "git branch" 时,我什么都没有! 显然,我的 "git checkout " 不起作用。 我什至没有我的分支了。只有现在的。
我已经在工作的项目中没有这个问题。
这是为什么?
这很正常:您刚刚创建了一个新项目:
$ 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 执行以下步骤(前几个没有任何特定顺序;只有最后几个有实际顺序):
- 收集您的姓名和电子邮件地址,以在新提交中使用。
- 获取(您的计算机的想法)当前时间,附加到您的姓名和电子邮件地址。
- 收集日志消息。
- 冻结索引的内容(索引是您构建新提交的地方:
git add
将文件从工作树复制到索引中)。 - 如果有当前提交,获取当前提交的哈希ID。如果合并,还获取任何提交的哈希 ID。
- 使用所有这些信息创建一个新 提交。创建提交会为其分配哈希 ID,这是所有这些内容的加密校验和(您的姓名和带有时间戳的电子邮件地址、您的日志消息、冻结树的哈希 ID,等等)。
- 写入写入新提交得到的hash ID。这个新提交的哈希 ID 进入 当前分支名称 。如果分支名称在此之前不存在,那么,现在它存在。
因此,只有在您至少进行一次提交后,您才能拥有任何分支名称。但是您仍然可以选择哪个分支名称是您的 current 分支,即使该分支不存在:创建第一个提交将创建分支名称。
(一旦你 do 至少有一个提交,你可以在一个提交上附加任意多个名称。如果你有多个提交,你可以附加每个提交的名字都可以,尽管大多数提交不需要附加任何名字。Git找到它们通过从后来的提交向后工作。只有 last 提交——分支的 tip——需要一个名称,因此 Git 可以找到它而无需先找到以后的提交。)