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