【问题标题】:How to prevent detached HEAD when merging?合并时如何防止分离的HEAD?
【发布时间】:2018-01-18 08:24:33
【问题描述】:

如果操作将导致分离的 HEAD,是否有任何方法可以配置 Git 以拒绝合并?

我知道如何解决分离的 HEAD,但我宁愿让 git 拒绝合并操作以完全避免分离的 HEAD。

发生这种情况时会出现问题:

  1. 我正在主存储库中的develop 分支上工作,并且我还在子模块存储库中进行了一些更改。 develop 分支已更新以匹配子模块的最新提交。
  2. 一位同事想将develop 合并到master 中,但忘记先拉取master 上的子模块。这会导致 HEAD 分离。

【问题讨论】:

  • 既然您要标记 git-submodules,我想您应该多描述一下您的环境。你做了什么。
  • 啊抱歉,是在与分支合并后。我有一个子模块,它导致分离的 HEAD。我会换个问题 - 我不知道为什么我写的是 pull 而不是 merge。
  • @Jan 好点。我现在更新了问题。
  • 你在哪里分离了 HEAD?在主仓库或子模块仓库中?
  • @ThomasClemensen 老实说,我看不到合并如何导致分离 HEAD 的方法,除非您在合并之前处于分离的 HEAD 上。

标签: git git-submodules


【解决方案1】:

submodule 始终处于分离的头部状态,因为 Git 不会保留有关它必须位于哪个分支的任何信息。

Git 跟踪它所连接的submodule 提交,因为它与提交信息一起存储。当您合并连接到不同submodule 提交的两个不同分支时,Git 无法在子模块上签出branch,这就是您有一个分离的 HEAD 的原因。

没有解决方案可以让您的子模块附加到分支。

您的问题的可能解决方案是:

https://github.com/kollerma/git-submodule-tools

【讨论】:

    【解决方案2】:

    确实,可以在 git 中跟踪分支。如this answer 中所见,您可以添加带有跟踪信息的子模块。

    注意:

    git submodule add -b . [URL to Git repo];
                        ^^^
    

    查看 git 子模块 man 页面:

    的特殊值。用于表示子模块中的分支名称应与当前仓库中的当前分支同名。

    在我的项目中,我们使用特殊的. 字符来跟踪子存储库中的同一分支。例如。如果您的主仓库位于 development 分支上,则子模块将跟踪 development 分支。 main-main 对也是如此。

    <branch> 将写入您的.gitmodules 文件,如下所示。

    [submodule "My_submodule"]
        path = <directory>
        url = <url of the submodule>
        branch = .
    

    在您的示例中,我假设您将使用 master 作为跟踪分支。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 2011-12-30
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多