2

我一直处于超然状态。我不知道为什么,也不知道它是什么。

每次我试图从这种状态中恢复时,我都会丢失一些文件(从我在分离头状态下所做的最后一次提交)。

是否有可能完全避免这种状态,还是设计使然?

4

3 回答 3

5

git 中设计存在分离的头部状态,通常无法关闭。只有在克隆存储库后执行以下操作时,您才能进入分离的头部状态

git checkout $specific_commit

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

#1 -> #2 -> #3
            ^
            master
            ^
            HEAD

你也是

git checkout HEAD~

这是在 HEAD 当前指向的内容之前提交的。然后你将最终处于以下状态

#1 -> #2 -> #3
      ^     ^
      |     master
      |
      HEAD

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

$ git branch
* (detached from 60e425a)
  master

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

#1 -> #2 -> #3
      |     ^
      |     master
      |
      \----> #5
             ^
             HEAD

如果您现在通过执行切换回 master ,git checkout master那么HEAD将切换master并在您创建 commit 时创建的分支#5将不再有任何标签,即导航到 commit 的符号引用#5。这意味着您的提交实际上丢失了。

因此,您有两个选择。

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

    git checkout -b myNewBranch

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

#1 -> #2 -> #3
      |     ^
      |     master
      |
      \----> #5
             ^
             myNewBranch
             ^
             HEAD

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

于 2016-05-30T07:28:44.680 回答
4

仅与本地分支机构合作,然后您将永远不会进入分离状态。例如,git checkout origin/master除了 do git checkout master && git pull origin master,另请参阅分支的跟踪选项。

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

于 2016-05-29T16:39:53.743 回答
1

如果您曾经这样做git checkout sha1,则应添加-b选项以在提交 sha1 时自动创建新分支并继续前进。

首要任务是避免处于这种状态。如果你想纠正分离头的情况,你可以这样做

git stash
git checkout -b StartingPointOfYourBranch
git stash pop

"StartingPointOfYourBranch" 必须是参考:sha1, origin/master, ...

于 2016-05-29T16:54:13.283 回答