如果您看到文字文本字符串:
HEAD detached at develop
(例如,在git status
输出中),这意味着该名称develop
不是一个分支。(更准确地说,它不是一个分支名称——“分支”一词在 Git 中是模棱两可的。请参阅“分支”到底是什么意思?)
例如,在 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
工作,并被合并到一个长期存在的开发或发布分支中,因此被删除,或者它原来是失败,要么被完全删除,要么被“忽略合并”以将其终止为死胡同,然后删除其名称。
重要的是提交
在 Git 中,唯一真正重要的是提交本身。
分支名称只是作为查找提交的一种方式。标签名称也是如此。每个名称都可以让 Git 找到一个提交——该名称存储了大而丑陋的哈希值6ebdac1...
——而提交本身让 Git 可以找到更早的提交。
分支名称和标签名称之间的主要区别在于分支名称应该移动,实际上,当您在分支上进行新提交时,它会自动移动。为此,将您“置于”分支上,以便 Git在您运行时知道移动分支。git checkout branch-name
git commit
任何其他名称,Git 主要将其视为原始哈希 ID 的名称。这些给你一个“分离的头”。出于git status
某种目的,Git 会尝试记住您用于进入此“分离 HEAD”状态的名称。但真正重要的是ID。
当您删除分支名称时,提交本身会保留一段时间——通常至少 30 天。你可以在 Git 的“reflogs”中找到他们的 ID。这有点让人头疼,因为如果你跑步,git reflog
你会得到很多难以搜索的东西。但是提交仍然在那里。你只需要找到你关心的(使用,例如,git show 08bb350
查看 commit 08bb350
)并“复活”它们:
$ git branch zombie 08bb350
例如,如果您想要返回的提交,作为一个分支,是08bb350
.