我有一个分支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
,然后将其删除
答案 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-1234
或test-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
。