为什么我不能看到我所在的分支?

时间:2017-11-24 07:56:32

标签: git git-branch git-checkout

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

git init

现在我想看看我所在的分支。所以,我执行:

git branch

这个命令没有输出任何东西(我的期望是我只会看到一个分支“master”,我会在那里)。

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

git checkout -b aaa

结果我看到了:

Switched to a new branch 'aaa'

但是当我执行

git branch

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

2 个答案:

答案 0 :(得分:6)

你可以做git status

第一行将是:On branch aaa

答案 1 :(得分:2)

fr3dch3n's answer正确无误git status将告诉您您所在的分支 - 但未解决为什么 git branch根本没有显示任何内容。原因是你处于特殊状态。

您刚刚创建了一个新的空存储库 - 一个完全没有提交的存储库 - 通过执行git init

现在,关于Git中的分支名称的事情是它们总是总是 -point到一个特定的提交。但是你根本没有提交,那么分支名称如masteraaa如何指向一个?

答案是它不能,所以它没有,而Git通过没有创建分支来实现这一点。很简单,你就是一个不存在的分支。

当存储库是新的并且完全没有提交时,会发生此特殊状态 ,但如果您使用git checkout --orphan <newbranch>,也会发生此情况。这将使您首先创建分支的新分支,以便新分支不存在。

如果分支不存在,但您在git status术语中“开启”该分支,并且您运行git commit,Git会像往常一样创建新提交, 1 < / sup>并且在进程结束时,Git更新当前分支名称,以便它指向刚刚进行的新提交。如果之前的分支不存在,现在就可以了!

因此,在一个新的空存储库中,您所在的分支不存在,并且使用git checkout -b切换到另一个新分支会使您继续不存在的另一个新分支。你所在的分支,它不存在,只是消失得无影无踪:它永远不存在,它只是一个幽灵,你在“上”,现在你在新的和不同的幻影。

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

1 git commit过程的工作原理如下,尽管各个步骤的确切顺序有些变化,git commit --only <files>等选项会发生更大的变化。

  1. 确保它可以提交(需要进行任何预提交测试,包括运行预提交挂钩)。
  2. 将当前索引内容转换为至少一个 tree 对象,现在为索引中的所有文件(“blob”)创建快照。 (这是git write-tree命令。)
  3. 将您的姓名,电子邮件和时间戳收集为“作者”,并再次作为此提交的“提交者”。添加提交日志消息。
  4. 确定哪些提交是此提交的父级。
  5. 制作新的提交对象(git commit-tree)。
  6. 更新当前分支名称,使其指向新提交。
  7. 实际创建分支的步骤6,在这个特殊的“尚未创建的分支”条件下。

    请注意,在步骤4中,“找出父母”,Git会注意到这个“尚未创建的分支”条件。这种情况的结果是新提交有 no 父级:新提交是 root 提交。但是,通常,步骤4读取HEAD,目的是找到当前提交的哈希ID:HEAD包含分支名称,分支确实存在并包含当前提交哈希ID。

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