[英]How to make HEAD detached in git
在尝试从不同的机器中提取代码时,我在命令窗口中获得了一个分离的HEAD消息(没有连接分支)和红色。
我想分析一下我做了什么让它脱离了。
编辑: - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------
我犯的错误是:git checkout origin / test //检查远程分支
- 什么是'独立的HEAD'的意思?
“分离的HEAD”意味着:如果在分离时添加新的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,标记名称或远程分支的名称),您将处于“分离的HEAD”中州。
# 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 viewer,它将显示指向当前HEAD提交的分支的名称;
如果其中一个分支是您想要处理的git checkout <this branch>
,只需运行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
使用“ git checkout"
命令,可以确定要处理的项目的哪个版本。 然后Git将所有修订版的文件放在工作副本文件夹中。
通常,您使用分支名称与“git checkout”通信:
git checkout development
但是,您也可以提供特定提交的SHA1哈希:
git checkout 56a4e5c08
Note: checking out '56a4e5c08'.
You are in 'detached HEAD' state...
这个确切的状态 - 当检出特定提交而不是分支时 - 就是所谓的“分离的HEAD”。
分离HEAD的问题:
Git中的HEAD指针确定您当前的工作版本(以及放置在项目工作目录中的文件)。 通常,当检出正确的分支名称时,Git会在您创建新提交时自动移动HEAD指针。 您将自动进入所选分支的最新提交。
当您选择签出提交哈希时,Git将不会为您执行此操作。 结果是,当您进行更改并提交它们时,这些更改不属于任何分支。 这意味着一旦你签出一个不同的版本或分支,他们很容易迷路:没有被记录在分支的上下文中,你很难轻易访问该状态(除非你有一个精彩的记忆,并且能记住提交的哈希值那个新的提交......)。
如何有目的地使git中的当前分支与其HEAD分离?
有一些情况下,分离的HEAD状态很常见:例如,如果您先检查“远程分支”而不先跟踪它,您最终可能会得到一个分离的HEAD。
一旦分离,如何附加它? 你只需要检查你所在的分支,例如
git checkout master
“通常”,HEAD指向分支,分支指向提交:
commit1 <-- commit2 <-- commit3
^
|
master
^
|
HEAD (attached)
# state after 'git checkout master'
在分离头状态中,HEAD指向不是分支尖端的提交:
commit1 <-- commit2 <-- commit3
^ ^
| |
| master
|
|
HEAD (detached)
# state after 'git checkout <commit2 SHA>'
我建议阅读Pro Git书籍部分Reset Demystified 。
..
reset
和checkout
命令......是你第一次遇到它们时Git中最令人困惑的两个部分。 他们做了很多事情,实际上理解它们并正确使用它们似乎没有用。
简短回答:
1)'分离'意味着'不指向任何特定分支'
2) git checkout <any commit-id>
(故意分离HEAD)
3) git checkout <any branch>
(重新连接HEAD)
它与分支分离,现在指向提交。 未分离的HEAD指向分支。
git checkout foo
,其中foo是一个修订版 ,导致一个独立的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。
HEAD
是一个ref(指向提交的指针),它决定了你检查的内容。 许多命令默认使用HEAD
指向的提交。 当你进行新的提交时,它的父级(或者在合并的情况下,第一个父级)将是HEAD
指向的提交(除非你做了相对模糊的事情)。
也就是说, HEAD
是一个符号引用,意味着它可以指向一个分支而不是直接指向一个提交。 HEAD
指向分支被认为是正常的。 如果是这样的话,而不是移动HEAD
当您添加提交,Git移动该分支HEAD
点-和HEAD
正指向分支,隐含一起运动为好。
但是你可以让HEAD
直接指向一个提交,这称为“分离头状态”,这意味着HEAD
引用不会附加到任何分支。
您可以通过多种方式执行此操作。 其他人指出你可以使用它的ID(哈希值)来检查提交。 您还可以使用像master^
这样的表达式检出特定的提交。 您可以检查任何不是分支的引用 - 例如远程跟踪引用或标记。 你可以说git checkout --detach
。
你可以通过检查一个分支(没有--detach
选项)来摆脱分离的HEAD状态。
但是,如果您在处于分离头状态时进行了任何提交,则它们可能无法访问。 在这种情况下,如果您不想丢失它们,您将要么将它们合并到某个分支中,创建一个新分支,或者在其他方面指向一些引用(例如通过标记它们)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.