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

标签 git git-detached-head

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

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

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

最佳答案

Detached head state 存在于 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 repo 将如下所示。

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

如果您现在通过执行 git checkout master 切换回 master然后HEAD将切换master和创建提交时创建的分支 #5将不再有任何标签,即导航到提交的符号引用 #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 在该分支上的所有后续提交.

关于git - 如何避免在 git 中进入分离的头部状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37512333/

相关文章:

android - 如何在 git 上创建一个分支来使用 espresso 测试 android 项目?

Git "stucked"分支

git - HEAD detached at the HEAD commit id,什么意思?

git - 用标签固定分离的头

git - 我是怎么得到一个分离的 HEAD 的?

git - 在Git中,如何列出分支A中存在但分支B中不存在的所有文件

git - 使用 mvn release :prepare, 是否可以指示 Maven 在提交命令的子模块 pom 位置中使用正斜杠?

git - 在哪里存储持续集成 (CI) 部署的私钥?

git 。如何查看 HEAD 之后的修订版本?