分离的HEAD不会重新连接任何东西

时间:2019-07-29 23:23:44

标签: git github bitrise

我将自动构建系统Bitrise与Github结合使用。当我执行拉取请求时,它将运行测试以确保新代码正常。如果不是这样,那么当人们彼此踩脚时,该系统就会崩溃。 Bitrise将仅基于分支名称而不是提交哈希来构建代码。因此,当我执行所需的合并时,例如当合并冲突中断构建时,我尝试提交此修复程序,但HEAD已分离,并且我无法获得指向HEAD的分支名称。甚至硬复位也不起作用。因此Bitrise仍然无法构建。

有人知道将分支指向特定提交哈希的好方法吗?

1 个答案:

答案 0 :(得分:3)

首先,一旦您拥有独立的HEAD,无论任何git reset操作如何,它都会保持成为一个独立的HEAD。使用git reset,您无需重新连接,只需在该模式下移动即可。

您可以使用git checkout branch将HEAD附加到给定的 branch 名称,同时还要检查 branch的提示提交。当然,这对特定分支名称的 commit hash ID 没有影响。

目前尚不清楚您最初是如何进入 分离HEAD模式的,因为git merge不会将HEAD与当前分支分离(如果它位于一个分支上),也不会将HEAD附加到分支(如果已分离)。在许多情况下,git checkout命令将进入分离的HEAD模式:

  • 如果您使用--detach强制执行此操作,或者
  • 如果您使用标签名称指定提交,或者
  • 如果您使用origin/master之类的远程跟踪名称来指定提交,或者
  • 如果您使用原始提交哈希ID指定提交

例如。 (这不是完整的列表,只是导致分离的HEAD模式的事物的代表性示例。)

如果要创建一个 new 分支名称,并使其指向某个现有的提交,则可以:

  • 使用git branch name hash创建指向给定提交的分支名称,但实际上不使用新名称运行git checkout,或者
  • 使用git checkout -b name hash创建分支名称,指向给定的提交, 将其检出并一次切换到该分支。

同样,这并不意味着要这样做的完整列表,但是它是一个很好的代表性示例。请注意,在所有这些情况下,我们都会为某些现有提交创建一个新名称。 (使用git log(例如,可能与--all --decorate --oneline --graph一起使用,以查看可用提交及其对应的哈希ID的列表。)不要求任何给定的提交都具有分支名称-许多提交都没有名称。 ,只是一个哈希ID,但同时,一次提交可以包含数十个分支名称(如果需要)。名称​​ 对Git确实并不重要:重要的是哈希ID。需要名称但不接受哈希ID的软件通常是不友好且不像Git一样。 1

如果您要强制某个现有分支名称来标识除其当前标识以外的其他提交,则可以:

  • 使用git branch -f(如果不是当前分支名称),或者
  • 如果{em>是当前分支名称,则使用git reset(与--soft--mixed--hard中的任何一个一起使用),或
  • 使用git checkout -B name [hash]将其设为为当前名称(如果需要,请附加HEAD),然后将该名称移至给定的 hash 中,或如果您不提供哈希ID,则返回当前(HEAD)提交。

同样,这些是代表性的示例命令,而不是所有可能命令的完整列表。与仅创建指向某个现有提交的新名称相比,所有这些操作都(或略有)危险。特别是:

  • 强制分支名称“忘记”先前的提交,并记住一些新的提交,可能,这取决于我们在此处尚未真正涉及的很多内容,这会导致您的Git从而无法轻松访问通过名称中存储的先前哈希ID先前发现的某些提交。可以将它们恢复一段时间(通过reflog搜索),但不能永远恢复。

  • 带有git reset--mixed
  • --hard覆盖索引和(带有--hard)的工作树内容,它们不会长期冻结-您可以找到提交的内容,因此可能无法找回,


1 如果软件打算使用git fetch和/或git push或创建软件,那么 是一个很好的借口要求一个名称 new 提交。这是因为git fetchgit push让您的Git调用另一个Git,并交换提交和名称,因此这两个命令可能取决于名称。 git commit命令在创建新提交时,会将新提交的哈希ID写入当前分支名称,或在分离的HEAD模式下直接写入HEAD,因此再次有理由-但是不需要-分支名称。