不能'重新附加'分离的HEAD git

时间:2016-11-01 20:22:27

标签: git github branch git-detached-head

我有一个分支bug-fix被另一个分支develop

切断了

将我的更改从bug-fix合并到develop后,我通过github删除了分支,但是我相信当我删除它时我仍然会检入分支。

我在分支bug-fix

中也有一个未跟踪的文件

据说bug-fix被删除后我检出了develop并看到了HEAD detached at develop

以下是我试图修复分离头的所有内容:

1)首先,当我运行bug-fix时,已删除但不再出现在github上的分支git branch仍会显示 所以我尝试git fetch来更新它。还是出现了

2)我检查了bug-fix并删除了未跟踪的文件

3)我尝试创建一个新分支temp,然后将其删除

1 个答案:

答案 0 :(得分:5)

如果您看到文字文字字符串:

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-1234test-new-feature这样的分支可以解决,并且可以合并到一个长的-lived开发或发布分支因此被删除,或者结果是失败,要么被完全删除,要么“忽略合并”以将其作为死角终止,然后将其名称删除。

重要的是提交

在Git中,唯一真正重要的是提交本身。

分支名称只是用于查找提交的方式。标签名称也是如此。每个名称都允许Git找到一个提交 - 该名称存储像6ebdac1...这样的大丑陋哈希 - 并且提交本身让Git找到之前的提交。

分支名称与标记名称之间的主要区别在于分支名称​​假定要移动,事实上,当您在分支上进行新提交时,会自动移动。为此,git checkout branch-name将您“放在”分支上,以便Git在运行git commit时知道移动分支。

任何其他名称,Git主要将其视为原始哈希ID的名称。这些给你一个“独立的HEAD”。对于git status目的,Git会尝试记住您用于进入此“分离的HEAD”状态的名称。但这是真正重要的ID。

删除分支名称时,提交本身会暂停一段时间 - 通常至少30天。你可以在Git的“reflogs”中找到他们的ID。这对屁股来说是一种痛苦,因为如果你运行git reflog,你会得到很多难以搜索的东西。但提交仍在那里。你只需要找到你关心的那个(使用,例如git show 08bb350来查看提交08bb350)并“恢复”它们:

$ git branch zombie 08bb350
例如,如果您想要作为分支返回的提交是08bb350