为什么它总是一个分离的 HEAD?

Why is it always a detached HEAD?

我有一个带有两个遥控器的 git 仓库。

    origin/master        cm/master
         |                  |
         |                  |
       sfcc--------------cm/sfcc-18
         |
         |
       feature

以上是我的repo的基本结构。分支 sfcc 是从 cm.

的另一个分支 sfcc 中拉出的

分支 sfcc 和 feature 也被推送到远程源。

分支 sfcc 尚未合并到 origin/master。

现在我在使用本地分支功能。除了创建这些分支之外,我还没有做任何更改。我尝试切换到 origin/sfcc,这让我处于分离状态。

HEAD is now at 9d4f1707 Merge branch 'sfcc-18' of https://github.com/bla-bla-cm into sfcc.

当我再次尝试结帐时 origin/migration 我收到了同样的消息。

git status 我得到了工作树,没有什么可提交的。

为什么我什么都没有改变也会出现这种情况?

万一 cm/sfcc-18 上发生了某些变化,我不希望根据 cm 存储库变化对其进行跟踪。我已将 origin/sfcc 的上游跟踪设置为 origin/master。

我也无法结账 origin/master。我收到以下消息

Previous HEAD position was 9d4f1707 Merge branch 'sfcc-18' of https://github.com/bla-bla-cm into sfcc

HEAD is now at e71242f0 .gitignore created online with Bitbucket

您看到结帐导致头部分离的最可能原因是您将要结帐的分支引用为 origin/<branch-name> 而不是简单地 <branch-name>.

虽然从技术上讲两者都会导致 HEAD 处于同一提交状态,但 Git 在这两种情况下的行为方式是不同的。

git checkout origin/<branch> 检出一个特定的提交作为分离的头,即使你有一个同名的本地分支,就好像你使用了 --detach

git checkout <branch> 将检查本地分支(如果存在)。如果没有,并且确实存在一个具有该名称的远程跟踪分支,它将创建一个具有该名称的本地分支并将其设置为跟踪远程分支。有关详细信息,请参阅 git checkout

在你的情况下,你应该能够只键入 git checkout sfcc-18,然后将签出一个新的本地分支来跟踪 cm/sfcc-18

但是请注意,如果您想将 origin 的 master 作为新的本地分支结帐,则需要 git checkout -b master --track origin/master