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

How to avoid getting into detached head state in git?

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

每次我尝试从此状态恢复时,我都会丢失一些文件(来自上次我在分离头状态下所做的提交)。

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

只与本地分支机构合作,您永远不会进入分离状态。例如,不使用 git checkout origin/master,而是使用 git checkout master && git pull origin master,另请参阅分支机构的跟踪选项。

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

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

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

git stash
git checkout -b StartingPointOfYourBranch
git stash pop

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

分离头状态存在于 git 设计中,通常无法关闭。只有当你在克隆你的存储库之后,做这样的事情时,你才能进入分离的头部状态

git checkout $specific_commit

例如,如果您位于指定分支的顶端 master

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

而你

git checkout HEAD~

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

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

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

$ git branch
* (detached from 60e425a)
  master

注意星号 *,它表示您当前的分支。 如果你现在进行新的提交 git 回购将看起来像这样。

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

如果你 s 现在通过做 git checkout master 回到 master 然后 HEAD 将 s master 和你创建时创建的分支提交 #5 将不再有任何标签,即导航到提交 #5 的符号引用。这意味着您的提交实际上丢失了。

因此你有两个选择。

  1. 如果你不想以分离的头部状态结束,那就不要做 git checkout $specific_commit。始终停留在同名分支的顶端,例如 master。您可以通过 运行 git branch 来验证。
  2. 如果您确实发现自己处于脱离状态,并且您可能已经做出了不想 "loose" 的提交,那么,Flows 上面建议,你需要创建新的分支 label/reference 像这样

    git checkout -b myNewBranch

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

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

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