如果你看到文字字符串:
HEAD detached at develop
(例如,在git status 输出中),这意味着名称develop 不是分支。 (更准确地说,它不是一个分支名称——术语“分支”在 Git 中是模棱两可的。参见What exactly do we mean by "branch"?)
例如,在 Git 的这个 Git 存储库中,如果我运行:
$ git checkout v2.10.0
Note: checking out 'v2.10.0'.
[snip]
HEAD is now at 6ebdac1... Git 2.10
$ git status
HEAD detached at v2.10.0
nothing to commit, working tree clean
这是因为名称v2.10.0 是一个标签,而不是一个分支。
回到master(是一个分支名称)我只是:
$ git checkout master
Previous HEAD position was 6ebdac1... Git 2.10
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
从长远来看,Git 中的分支名称实际上并不是很重要。在短期内(当你工作时)它们很重要也很有用,但最终像fix-bug-1234 或test-new-feature 这样的分支要么成功,要么被纳入长期开发或release 分支并因此被删除,或者它被证明是失败的并且被完全删除,或者被“忽略合并”以将其终止为死胡同,然后将其名称删除。
重要的是提交
在 Git 中,唯一真正重要的是提交本身。
分支名称只是作为查找提交的一种方式。标签名称也是如此。每个名称都可以让 Git 找到 一个 提交——该名称存储了像 6ebdac1... 这样的大而丑陋的散列——提交本身让 Git 可以找到更早的提交。
branch 名称和 tag 名称之间的主要区别在于分支名称 supposed 自动 在分支上进行新提交时移动。为此,git checkout <em>branch-name</em> 将您“置于”分支上,以便 Git 在您运行 git commit 时知道移动该分支。
任何其他名称,Git 大多将其视为原始哈希 ID 的名称。这些给你一个“分离的头”。出于git status 的目的,Git 会尝试记住您用于进入此“分离 HEAD”状态的名称。但真正重要的是 ID。
当您删除分支名称时,提交本身会保留一段时间——通常至少 30 天。你可以在 Git 的“reflogs”中找到他们的 ID。这有点让人头疼,因为如果你运行git reflog,你会得到大量难以搜索的东西。但是提交仍然在那里。你只需要找到你关心的人(使用,例如,git show 08bb350 来查看提交08bb350)并“复活”他们:
$ git branch zombie 08bb350
例如,如果您希望作为分支返回的提交是 08bb350。