如何避免在git中进入分离的头部状态?

Dim*_*ims 2 git git-detached-head

我一直都处于独立状态。我不知道为什么,我也不知道它是什么。

每次尝试从该状态恢复时,我都会丢失一些文件(从我在分离头状态下进行的最后一次提交)。

是否可以完全避免这种状态,或者是设计使然?

Myk*_*rov 5

只与当地分支机构合作,这样你就永远不会陷入脱离状态。例如,另请参阅分支的跟踪选项,而不是git checkout origin/masterdo 。git checkout master && git pull origin master

为了避免丢失已经位于分离 HEAD 中的更改,请为它们创建一个分支:git branch someNameForTheBranch


小智 5

分离的磁头状态通过设计存在于git中,并且通常无法关闭。仅当克隆存储库后执行以下操作时,您才能进入独立状态

git checkout $specific_commit
Run Code Online (Sandbox Code Playgroud)

例如,如果您位于命名分支的顶端 master

#1 -> #2 -> #3
            ^
            master
            ^
            HEAD
Run Code Online (Sandbox Code Playgroud)

你也是

git checkout HEAD~
Run Code Online (Sandbox Code Playgroud)

这是在HEAD当前指向之前的提交。然后您将处于以下状态

#1 -> #2 -> #3
      ^     ^
      |     master
      |
      HEAD
Run Code Online (Sandbox Code Playgroud)

从这一点开始,您处于分离的head状态,即HEAD指向特定的提交而不是分支标签。在此之前,HEAD指向分支标签master,而分支标签又指向特定的提交(分支的尖端)。现在,无论提交什么内容,您都将使它们位于没有分支标签(即引用)的单独分支上。跑步git branch会告诉您是否处于分离状态。

$ git branch
* (detached from 60e425a)
  master
Run Code Online (Sandbox Code Playgroud)

注意星号*,它指示您当前的分支。如果您现在进行新提交,则git repo将如下所示。

#1 -> #2 -> #3
      |     ^
      |     master
      |
      \----> #5
             ^
             HEAD
Run Code Online (Sandbox Code Playgroud)

如果你这样做,现在切换回主git checkout master,然后HEAD将切换master,当你创建提交所创建的分支#5将不再有任何标签,即象征性的参考导航提交#5。这意味着您的提交实际上已丢失。

因此,您有两个选择。

  1. 如果您不想以头顶状态结束,那就别做git checkout $specific_commit。始终停留在相同命名分支的尖端,例如master。您可以通过运行进行验证git branch
  2. 如果确实发现自己处于分离状态,并且可能已经做出了不想“松散”的提交,则如上面的流程所建议的,您需要像这样创建新的分支标签/引用

    git checkout -b myNewBranch

这将使您的存储库看起来像这样

#1 -> #2 -> #3
      |     ^
      |     master
      |
      \----> #5
             ^
             myNewBranch
             ^
             HEAD
Run Code Online (Sandbox Code Playgroud)

然后,如果您返回原处,则master可以始终执行操作以导航回该提交#5以及该分支上的所有后续提交git checkout myNewBranch