为什么我看不到我在哪个分支?

Why can't I see what branch I am in?

我刚刚创建了一个全新的 git 存储库:

git init

现在我想看看我在哪个分支,所以,我执行:

git branch

此命令不输出任何内容(我的预期是我只会看到一个分支 "master" 而我会在那里)。

所以,我猜根本就没有分店。所以,我尝试通过以下方式创建一个分支:

git checkout -b aaa

结果我看到:

Switched to a new branch 'aaa'

但是当我执行

git branch

我又没有输出。那么,如何验证我在特定的分支中呢?

你可以做一个 git status

第一行将是:On branch aaa

是正确的——运行ning git status 会告诉你你在哪个分支——但没有说明 为什么 git branch 什么也没给你看。原因是你状态特殊

您刚刚通过 git init.

创建了一个新的空存储库——一个完全没有提交的存储库

现在,Git 中关于分支名称的事情是它们总是——总是——指向一个特定的提交 .但是你根本没有提交,那么像 masteraaa 这样的分支名称怎么能指向一个呢?

答案是不能,所以没有,Git通过尚未创建分支实现了这一点。很简单,你在一个不存在的分支上。

当存储库是新的并且完全没有提交时,这种特殊状态 必须 发生,但如果您使用 git checkout --orphan <newbranch> 也会发生这种情况。这会将您置于新分支上,而无需先 创建 分支,因此新分支不存在。

当分支不存在时,您 "on" 那个分支 git status 术语,并且您 运行 git commit, Git像往常一样创建一个新提交,1 并在该过程结束时,Git 更新当前分支名称,使其指向刚刚进行的新提交。如果分支以前不存在,现在它存在了!

因此,在一个新的空存储库中,您所在的 "on" 分支不存在,使用 git checkout -b 切换到另一个新分支会使您进入另一个继续的新分支不存在。你所在的分支,本来不存在的,只是消失在稀薄的空气中:它从未存在过,它只是你曾"on"的幻影,现在你在一个新的和不同的幻影上。

(之后的 git checkout --orphan <newbranch> 也发生了同样的事情:它把你带到了这种幽灵般的不存在的分支上,如果你随后切换到另一个新的分支,你将继续处于一个幽灵般的不存在的分支上-existent 分支。运行 git checkout master,或使用任何实际现有分支的名称,将把你切换回现有分支,假设 git checkout 本身成功。)


1git commit过程是这样工作的,尽管各个步骤的精确顺序有些变化,而像git commit --only <files>这样的选项会有更大的变化。

  1. 确保提交看起来没问题(进行任何所需的提交前测试,包括运行设置一个提交前挂钩)。
  2. 将当前索引内容转换为至少一个对象,为现在索引中的所有文件("blobs")做一个快照。 (这是 git write-tree 命令。)
  3. 将您的姓名、电子邮件和时间戳收集在一起作为 "author" 并再次作为此提交的 "committer"。添加提交日志消息。
  4. 找出哪些提交是此提交的父项。
  5. 创建新的提交对象 (git commit-tree)。
  6. 更新当前分支名称,使其指向新的提交。

在这种特殊的 "branch that is yet to be created" 条件下,实际上是第 6 步创建了分支。

请注意,在第 4 步中,"figure out parents"、Git 注意到相同的 "branch that is yet to be created" 情况。此条件的结果是新提交没有 no 父级:新提交是 root 提交。不过,通常情况下,第 4 步读取 HEAD 的目的是找到当前提交的哈希 ID:HEAD 包含分支名称,分支确实存在并包含当前提交哈希 ID。

在解决git merge的冲突后提交合并结果时,第4步使用git merge留下的跟踪文件来确定额外的父提交哈希(正常合并)或哈希("octopus"合并)。当前或 HEAD 或 @ 提交仍然像往常一样是第一个父项。

使用 git branch -a - 它会显示本地存储库中存在的所有分支

git status - 显示当前分支和更新文件

作为 Git 的初学者,您应该看到这个 Git learning game 这绝对有助于增加您的知识:)