如何使HEAD脱离git

时间:2018-07-10 11:48:35

标签: git

当试图从另一台计算机上提取代码时,在命令窗口中我收到了一条分离的HEAD消息(未连接任何分支),并且颜色为红色。

我想分析一下我如何使它脱离。

  1. “分离头”是什么意思?
  2. 如何故意使git中的当前分支分离 从它的头?
  3. 一旦分离,如何将其固定?

编辑:--------------------------------------------- ------------------------------

我犯的错误是:git checkout origin / test //签出远程分支

6 个答案:

答案 0 :(得分:2)

  
      
  1. “分离头”是什么意思?
  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
  
      
  1. 如何故意使git中的当前分支与其HEAD脱离?
  2.   

如果您运行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
  
      
  1. 一旦分离,如何将其固定?
  2.   

取决于您的需求:

  • 使用git log --decorate -1gitkgitg或任何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

  

.. resetcheckout命令……是您首次遇到Git时最容易混淆的两个部分。他们做了很多事情,以至于无法真正理解和正确使用它们。

答案 3 :(得分:1)

简短回答:

1)“分离”表示“未指向任何特定分支”

2)git checkout <any commit-id>(故意分离HEAD)

3)git checkout <any branch>(重新连接HEAD)

答案 4 :(得分:1)

  1. 它已与分支分离,现在指向提交。未分离的HEAD指向分支。

  2. git checkout foo,其中foo是revision,导致分离的HEAD。该修订版不包含没有refs/heads/heads/的本地分支。因此,git checkout refs/heads/mastergit checkout origin/mastergit checkout HEAD^git checkout stash@{0}git checkout 6184fd3d148b8e330ae4ebbb05c51b88b4b1e0f2都导致HEAD分离,而git checkout master却没有。 git checkout HEAD也不是。

  3. 如果需要处理分离的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 引用指向它们(例如,通过标记它们)。

相关问题