我一直处于超然状态。我不知道为什么,也不知道它是什么。
每次我试图从这种状态中恢复时,我都会丢失一些文件(从我在分离头状态下所做的最后一次提交)。
是否有可能完全避免这种状态,还是设计使然?
我一直处于超然状态。我不知道为什么,也不知道它是什么。
每次我试图从这种状态中恢复时,我都会丢失一些文件(从我在分离头状态下所做的最后一次提交)。
是否有可能完全避免这种状态,还是设计使然?
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
。这意味着您的提交实际上丢失了。
因此,您有两个选择。
git checkout $specific_commit
。始终停留在同名分支的顶端,例如master
. 您可以通过运行来验证这一点git branch
。如果您确实发现自己处于分离的头部状态,并且您可能已经提交了您不想“松散”的提交,那么正如上面的Flows建议的那样,您需要像这样创建新的分支标签/引用
git checkout -b myNewBranch
这将使您的存储库看起来像这样
#1 -> #2 -> #3
| ^
| master
|
\----> #5
^
myNewBranch
^
HEAD
然后,如果您再次返回,master
则始终可以通过执行导航回提交#5
以及该分支上的所有后续提交git checkout myNewBranch
。
仅与本地分支机构合作,然后您将永远不会进入分离状态。例如,git checkout origin/master
除了 do 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, ...