当试图从另一台计算机上提取代码时,在命令窗口中我收到了一条分离的HEAD消息(未连接任何分支),并且颜色为红色。
我想分析一下我如何使它脱离。
编辑:--------------------------------------------- ------------------------------
我犯的错误是:git checkout origin / test //签出远程分支
答案 0 :(得分:2)
- “分离头”是什么意思?
“分离头”的意思是:如果在分离时添加新的git commit
,则任何命名分支都不会跟踪它。
HEAD
实际上是由磁盘上的文件描述的:.git/HEAD
如果您查看此文件的内容,则可以看到两种格式:
# this means : attached HEAD, "master" is the current active branch
$ cat .git/HEAD
ref: refs/heads/master
# this means : detached HEAD, current active commit is 140a4c
$ cat .git/HEAD
140a4ceae12c237f9f23321aa5e29d8d14852f6f
- 如何故意使git中的当前分支与其HEAD脱离?
如果您运行git checkout <something>
且<something>
不是本地分支名称(原始提交ID,标记名称或远程分支的名称中的任何一个)以外的其他名称,处于“分离头”状态。
# this will lead to an attached HEAD :
git checkout master
git checkout develop
git checkout bob/s/feature
# this will lead to a detached HEAD :
git checkout 140a4ce # raw commit
git checkout 1.1.2 # tag
git checkout origin/develop # remote branch
- 一旦分离,如何将其固定?
取决于您的需求:
使用git log --decorate -1
或gitk
或gitg
或任何git查看器,它将显示指向当前HEAD提交的分支名称;
如果这些分支之一是您要使用的分支,则只需运行git checkout <this branch>
如果您想在新分支上工作:
# create a new branch on your current commit :
$ git branch new_branch
# checkout this branch to use it as your active branch :
$ git checkout new_branch
注意:git branch new_branch && git checkout new_branch
等同于:
# same action in one single command :
$ git checkout -b new_branch
答案 1 :(得分:2)
使用“ git checkout"
命令,确定要处理的项目的修订版本。Git然后将所有修订版本的文件都放在工作副本文件夹中。
通常,您使用分支名称与“ git checkout”进行通信:
git checkout development
但是,您也可以提供特定 commit 的SHA1哈希:
git checkout 56a4e5c08
Note: checking out '56a4e5c08'.
You are in 'detached HEAD' state...
确切的状态-当特定的提交被检出而不是一个 分支-所谓的“分离头”。
HEAD分离的问题:
Git中的HEAD指针确定您当前的工作修订版(并由此确定放置在项目工作目录中的文件)。通常,当签出正确的分支名称时,Git在创建新提交时会自动移动HEAD指针。您将自动进入所选分支的最新提交。
当您选择检出提交哈希时,Git不会为您执行此操作。结果是,当您进行更改并提交更改时,这些更改不属于任何分支。 这意味着一旦您签出其他修订版或分支,它们就很容易丢失:没有记录在分支的上下文中,您不可能轻松访问该状态(除非您有出色的记忆力并且可以记住的提交哈希)新提交...)。
如何使git中的当前分支与HEAD脱离?
在少数情况下,分离的HEAD状态很常见: 例如,如果您在未先跟踪的情况下签出“远程分支”,则可能会得到一个分离的HEAD。
分离后,如何附加它? 您只需要签出您所在的分支,例如
git checkout master
答案 2 :(得分:2)
“通常”,HEAD指向分支,分支指向提交:
commit1 <-- commit2 <-- commit3
^
|
master
^
|
HEAD (attached)
# state after 'git checkout master'
在分离的head状态下,HEAD指向不是分支尖端的提交:
commit1 <-- commit2 <-- commit3
^ ^
| |
| master
|
|
HEAD (detached)
# state after 'git checkout <commit2 SHA>'
我建议阅读 Pro Git书部分Reset Demystified。
..
reset
和checkout
命令……是您首次遇到Git时最容易混淆的两个部分。他们做了很多事情,以至于无法真正理解和正确使用它们。
答案 3 :(得分:1)
简短回答:
1)“分离”表示“未指向任何特定分支”
2)git checkout <any commit-id>
(故意分离HEAD)
3)git checkout <any branch>
(重新连接HEAD)
答案 4 :(得分:1)
它已与分支分离,现在指向提交。未分离的HEAD指向分支。
git checkout foo
,其中foo是revision,导致分离的HEAD。该修订版不包含没有refs/heads/
和heads/
的本地分支。因此,git checkout refs/heads/master
,git checkout origin/master
,git checkout HEAD^
,git checkout stash@{0}
,git checkout 6184fd3d148b8e330ae4ebbb05c51b88b4b1e0f2
都导致HEAD分离,而git checkout master
却没有。 git checkout HEAD
也不是。
如果需要处理分离的HEAD的提交,则可以通过git checkout -b <branch>
创建一个分支来对其进行跟踪。如果可以删除当前分离的HEAD,则只需切换到另一个本地分支或另一个分离的HEAD。
答案 5 :(得分:1)
HEAD
是一个ref(指向提交的指针),它确定您已检出的内容。许多命令默认使用HEAD
指向的提交。当您进行新提交时,其父级(或在合并的情况下为第一父级)将是HEAD
所指向的提交(除非您做的相对晦涩)。
也就是说,HEAD
是一个符号引用,这意味着它可以指向分支而不是直接指向提交。 HEAD
指向分支是正常的。在这种情况下,git不会移动添加提交时的HEAD
,而是会移动HEAD
指向-的分支,而指向该分支的HEAD
也会隐式地移动
但是您可以使HEAD
直接指向一个提交,这称为“分离头状态”,这意味着HEAD
引用没有附加到任何分支。
您可以通过多种方式执行此操作。其他人指出,您可以使用其ID(哈希值)检出提交。您也可以使用类似master^
的表达式检出特定的提交。您可以检出不是分支的任何引用-例如远程跟踪引用或标签。您可以说git checkout --detach
。
仅通过检出一个分支(无需使用--detach
选项),就可以摆脱HEAD分离状态。
但是,如果您在处于分离状态下进行任何提交,则它们可能无法访问。在这种情况下,如果您不想丢失它们,则可以将它们合并到某个分支中,创建一个新分支,或者将 some 引用指向它们(例如,通过标记它们)。