0

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

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

4

1 回答 1

3

首先,一旦你一个分离的 HEAD,它就一直一个分离的 HEAD,不管任何git reset操作。使用git reset,您无需重新连接它,您只需将它移动一下,当它处于此模式时。

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

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

  • 如果你--detach用来强迫它,或者
  • 如果您使用标签名称来指定提交,或者
  • 如果您使用远程跟踪名称origin/master来指定提交,或者
  • 如果您使用原始提交哈希 ID 来指定提交

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

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

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

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

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

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

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

  • 强制分支名称“忘记”一些先前的提交,并记住一些新的提交,可能会导致您的 Git 无法轻松访问之前的一些提交通过名称中存储的先前哈希 ID 找到。它们可以被取回一段时间(通过 reflog 搜索),但不能永远取回。

  • git reset使用--mixed--hard覆盖索引和(使用--hard)工作树内容,这些内容不会因为您可以找到提交而冻结,因此可能无法取回,


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

于 2019-07-29T23:53:05.557 回答