【问题标题】:Detached HEAD won't reconnecto to anything分离的 HEAD 不会重新连接到任何东西
【发布时间】:2019-07-29 23:23:44
【问题描述】:

我将自动构建系统 Bitrise 与 Github 结合使用。当我发出拉取请求时,它会运行测试以确保新代码正常。如果不是这样,当太多人互相踩到对方的脚趾时,这个系统就会分崩离析。 Bitrise 只会基于分支名称构建代码,而不是提交哈希。因此,当我进行所需的合并时,例如当合并冲突中断构建时,我尝试提交修复,但 HEAD 已分离,我无法让分支名称指向 HEAD。甚至硬重置都不起作用。因此,Bitrise 继续无法构建。

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

【问题讨论】:

  • 如果我理解正确,您是否尝试过删除分支并在您需要的提交哈希处重新创建它? git checkout <hash>, git branch -D <branch>, git checkout -b <branch>.

标签: git github bitrise


【解决方案1】:

首先,一旦您拥有一个分离的 HEAD,它只会让 成为一个分离的 HEAD,而不管任何git reset 操作。使用git reset,您无需重新连接它,只需移动它,当它处于此模式时。

您可以使用git checkout <em>branch</em> 将 HEAD 附加到给定的 branch 名称,同时检查 branch 的提示提交。当然,这对特定分支名称的提交哈希 ID 没有影响。

不清楚你是如何进入分离 HEAD 模式的,因为git merge 不会将 HEAD 与其当前分支分离,如果它在一个分支上,也不会将 HEAD 附加到一个分支它是分离的。在许多情况下,git checkout 命令将进入分离 HEAD 模式:

  • 如果您使用--detach 强制这样做,或者
  • 如果您使用标签名称来指定提交,或者
  • 如果您使用像origin/master 这样的远程跟踪名称来指定提交,或者
  • 如果您使用原始提交哈希 ID 来指定提交

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

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

  • 使用git branch <em>name</em> <em>hash</em> 创建分支名称,指向给定的提交,但实际上并未在新名称上运行git checkout,或者
  • 使用git checkout -b <em>name</em> <em>hash</em> 创建分支名称,指向给定的提交,签出并切换到该分支,一气呵成。

同样,这并不是一个完整的方法列表,但它是一个很好的代表性示例。请注意,在所有这些情况下,我们正在为一些现有提交创建一个新名称。 (使用git log,例如--all --decorate --oneline --graph,可以查看可用提交列表及其对应的哈希ID。)任何给定的提交都没有分支名称的要求——许多提交没有名称,只有一个哈希ID——但同时,如果你愿意,一个提交可以有几十个分支名称。 names 对 Git 来说真的很不重要:重要的是哈希 ID。要求名称且不接受哈希 ID 的软件通常是相当不友好且与 Git 不一样的。1

如果您想强制某个现有的分支名称来识别某个提交,而不是它当前识别的提交,您可以:

  • 使用git branch -f,如果它不是当前分支名称,或者
  • 如果它当前分支名称,则使用git reset(与--soft--mixed--hard 中的任何一个一起使用),或者
  • 使用git checkout -B name [<em>hash</em>] 使它成为当前名称(如果需要,附加 HEAD)并将名称移动到给定的 hash 或当前(HEAD) 如果您不提供哈希 ID,请提交。

同样,这些是具有代表性的示例命令,而不是所有可能命令的完整列表。这些都比仅仅创建一个指向某个现有提交的新名称稍微(或稍微多一点)更危险。特别是:

  • 强制分支名称“忘记”一些以前的提交,并记住一些新的提交,可能,这取决于我们在这里没有真正涉及的很多东西,导致你的 Git失去对以前通过名称中存储的先前哈希 ID 找到的某些提交的轻松访问。它们可以被取回一段时间(通过 reflog 搜索),但不能永远取回。

  • git reset--mixed--hard 覆盖索引和(使用 --hard)工作树内容,这些内容不会被冻结-the-commit,因此可能无法返回,


1如果软件要使用git fetch 和/或git push,或者创建新的 提交。那是因为git fetchgit push 让你的Git 调用另一个Git,并交换提交和名称,所以这两个命令可能取决于有一个名称。 git commit 命令在创建新提交时,将新提交的哈希 ID 写入当前分支名称,或在分离 HEAD 模式下直接写入 HEAD,因此再次有理由想要(但不要求)a分支名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2018-08-20
    相关资源
    最近更新 更多