1

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

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

我在分支中也有一个未跟踪的文件bug-fix

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

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

1)首先,bug-fix当我运行时,已删除且不再出现在 github 上的分支仍然出现git branch 所以我尝试git fetch更新它。依然出现

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

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

4

1 回答 1

6

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

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-namegit commit

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

当您删除分支名称时,提交本身会保留一段时间——通常至少 30 天。你可以在 Git 的“reflogs”中找到他们的 ID。这有点让人头疼,因为如果你跑步,git reflog你会得到很多难以搜索的东西。但是提交仍然在那里。你只需要找到你关心的(使用,例如,git show 08bb350查看 commit 08bb350)并“复活”它们:

$ git branch zombie 08bb350

例如,如果您想要返回的提交,作为一个分支,是08bb350.

于 2016-11-01T23:49:22.080 回答