代码之家  ›  专栏  ›  技术社区  ›  Blue Clouds

如何使头在Git中分离

git
  •  2
  • Blue Clouds  · 技术社区  · 7 年前

    当试图从另一台机器中提取代码时,我在命令窗口中收到了一条红色的分离头消息(没有连接任何分支)。

    我想分析一下我做了什么使它脱离现实。

    1. “分离的头”是什么意思?
    2. 如何有目的地使Git中的当前分支分离 从它的头上?
    3. 一旦分离,如何连接?

    编辑:——————————————————————————————————————————————————————————————————————

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

    6 回复  |  直到 7 年前
        1
  •  2
  •   LeGEC    7 年前
    1. “分离的头”是什么意思?

    “分离的头部”是指:如果您添加新的 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中的当前分支脱离其头部?

    如果你跑步 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. 一旦分离,如何连接?

    根据需要:

    • 使用 git log --decorate -1 gitk gitg 或任何将显示指向当前头提交的分支名称的Git查看器;
      如果其中一个分支是您要处理的分支,只需运行 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
      
        2
  •  2
  •   NID    7 年前

    与“ git checkout" 命令,确定要处理的项目修订。然后,Git将该版本的所有文件放在工作副本文件夹中。

    通常,您使用分支名称与“git checkout”通信:

    git checkout development
    

    但是,还可以提供特定 犯罪 相反:

    git checkout 56a4e5c08
    Note: checking out '56a4e5c08'.
    
    You are in 'detached HEAD' state...
    

    这个确切的状态-当一个特定的提交被签出而不是 分支-被称为“分离的头”。

    分离头的问题:

    git中的head指针决定了当前的工作版本(从而决定了放置在项目工作目录中的文件)。通常,当签出正确的分支名称时,当您创建新的提交时,Git会自动移动头部指针。您将自动执行所选分支的最新提交。

    当您选择签出提交哈希时,Git不会为您这样做。结果是,当您进行更改并提交它们时,这些更改不属于任何分支。 这意味着,一旦签出不同的修订或分支,它们很容易丢失:没有在分支的上下文中记录,您就不可能轻松访问该状态(除非您有出色的内存,并且能够记住新提交的提交哈希…)。

    如何有目的地使Git中的当前分支脱离其头部?

    在少数情况下,分离的头部状态很常见: 例如,如果您签出一个“远程分支”而不首先跟踪它,那么您可以以一个分离的头结束。

    一旦分离,如何连接? 您只需要签出您所在的分行,例如

    git checkout master
    
        3
  •  2
  •   sergej    7 年前

    “通常”,头指向分支,分支指向提交:

    commit1 <-- commit2 <-- commit3
                               ^
                               |
                             master
                               ^
                               |
                              HEAD (attached)
    
    # state after 'git checkout master'
    

    在分离头状态下,头指向的提交不是分支的尖端:

    commit1 <-- commit2 <-- commit3
                   ^           ^
                   |           |
                   |         master
                   |
                   |
                  HEAD (detached)
    
    # state after 'git checkout <commit2 SHA>'
    

    我建议你阅读 专业书籍 部分 Reset Demystified .

    我是说… reset checkout 命令…当您第一次遇到Git时,它是其中两个最令人困惑的部分。他们做的事情太多了,似乎无法真正理解他们并正确地使用他们。

        4
  •  1
  •   Romain Valeri    7 年前

    简短回答:

    1)“分离”是指“不指向任何特定分支”

    (二) git checkout <any commit-id> (目的是分离头部)

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

        5
  •  1
  •   ElpieKay    7 年前
    1. 它与分支分离,现在指向提交。一个不分离的头指向一根树枝。

    2. git checkout foo ,其中foo是 revision ,导致头部分离。修订不包括没有 refs/heads/ heads/ .所以, git checkout refs/heads/master ,请 git checkout origin/master ,请 git checkout HEAD^ ,请 git checkout stash@{0} ,请 git checkout 6184fd3d148b8e330ae4ebbb05c51b88b4b1e0f2 所有这些都会导致头部分离,而 git checkout master 不。 git checkout HEAD 也没有。

    3. 如果需要处理分离的头的提交,可以创建一个分支来跟踪它,方法是 git checkout -b <branch> .如果当前分离的头可以放下,您可以简单地切换到另一个本地分支或另一个分离的头。

        6
  •  1
  •   Mark Adelsberger    7 年前

    HEAD 是一个引用(指向提交的指针),它决定了您签出了什么。许多命令的默认值是处理 头部 .当您进行新的提交时,它的父级(或者在合并的情况下,第一个父级)将是指向的提交 头部 (除非你做了一些相对模糊的事情)。

    也就是说, 头部 是一个 象征的 引用,这意味着它可以指向分支,而不是直接指向提交。它被认为是正常的 头部 指向一个分支。在这种情况下,而不是移动 头部 当您添加提交时,git会移动 头部 指向-和 头部 被指向那个分支,也隐式地向前移动。

    但是你可以 头部 直接指向提交,这称为“分离的头状态”,意思是 头部 引用未附加到任何分支。

    你可以用很多方法来做到这一点。其他人指出,您可以使用提交的ID(散列值)检查提交。您还可以使用如下表达式签出特定的提交 master^ .您可以检查任何不是分支的引用,例如远程跟踪引用或标记。你可以说 git checkout --detach .

    您可以通过签出分支(不使用 --detach 选项)。

    但是,如果您在分离头状态下进行了任何提交,则可能无法访问这些提交。在这种情况下,如果您不想丢失它们,您将希望将它们合并到某个分支中,创建一个新分支,或者指向 一些 参考它们(例如通过标记它们)。