繁体   English   中英

如何在git中分离HEAD

[英]How to make HEAD detached in git

在尝试从不同的机器中提取代码时,我在命令窗口中获得了一个分离的HEAD消息(没有连接分支)和红色。

我想分析一下我做了什么让它脱离了。

  1. 什么是'独立的HEAD'的意思?
  2. 如何有目的地使git中的当前分支与其HEAD分离?
  3. 一旦分离,如何附加它?

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

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

  1. 什么是'独立的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
  1. 如何有目的地使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
  1. 一旦分离,如何附加它?

根据您的需要:

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

.. resetcheckout命令......是你第一次遇到它们时Git中最令人困惑的两个部分。 他们做了很多事情,实际上理解它们并正确使用它们似乎没有用。

简短回答:

1)'分离'意味着'不指向任何特定分支'

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

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

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

  2. git checkout foo ,其中foo是一个修订版 ,导致一个独立的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。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM