HEAD在origin / master处分离

时间:2014-08-10 19:10:29

标签: git

我刚刚检查了一个旧项目来修复错误。 git报道:

HEAD detached at origin/master

git status报告我有一个未跟踪的文件:

<project name>.xcworkspace/xcshareddata/

我想继续修复这个错误,但我不确定发生了什么。如果我尝试git checkout master,我会得到:

error: The following untracked working tree files would be overwritten by checkout:
<project name>.xcworkspace/xcshareddata/

我可以删除此文件吗?我在master分店吗?如果没有,我该怎么做?

2 个答案:

答案 0 :(得分:22)

不,你不是在主分支上,你在某个“新发明”的分支上没有曾经是主人的名字。

您只需切换回主人:

git checkout master

但是,如果您想修复错误,您应该在自己的分支机构工作(根据大多数git工作流程)。从而检查主人和分支:

git checkout master
git checkout -b fix-issue #give the branch a name that refers to the bug

然后修复错误并运行:

git checkout master
git merge --no-ff fix-issue -m "Fixed some strange issue, here follows a description"

修改

如您的问题所述,您有一个未跟踪的文件。如果这些文件不重要,您可以删除它们。另一方面,如果你想维护它们,你可以先将它们合并到主机中。

因此,您创建了一个临时分支:

git commit -m "some temporary message"
git checkout -b temporary
git checkout master
git merge --no-ff temporary

答案 1 :(得分:22)

作为CommuSoft says,你不是主人。你处于“超级HEAD”模式。只要您明确检查出不是(本地)分支名称的内容,就可以得到它:

$ git checkout origin/master    # detach to remote branch

或者如果有标记v1.7

$ git checkout v1.7             # detach to tag

,您甚至可以在使用本地分支名称时明确分离:

$ git checkout --detach master  # forcibly detach

“分离的HEAD”意味着你不在分支机构。 “在分支上”意味着您没有使用分离的HEAD模式。是的,那是非常循环的;有关更多详细信息,请参阅this question及其答案。

至于:

  

error: The following untracked working tree files would be overwritten ...

当你让git checkout从一个提交移动到另一个提交时,它会做两件事:

  1. 选择是否处于“分离的HEAD”模式,
  2. 重新排列工作树以匹配移动提交。
  3. 第2步是问题发生的地方。您正在进行由origin/master标识的提交,并且在该提交中,没有git当前抱怨的文件的记录。您已经要求切换到master标识的提交,这显然是一个不同的提交。 1 Git看到在master标识的提交中,一些(可能只是一个)具有相同名称的文件,它们与您工作树中的文件或目录不同

    为了从当前提交切换到新提交,git checkout必须删除现有文件或目录,并将其替换为新提交中的那些 - 您要求切换到的那个。如果在当前提交中跟踪了这些文件或目录,git会很乐意根据需要删除和替换它们,因为git总能为您取回它们:只需切换回旧提交,然后就可以了。但是他们在当前的,即将被切换的提交中。所以git告诉你:“嘿,如果我按照你的要求进行这种切换,我不能保证我能够恢复这些文件和/或目录。”

    现在由而不是git来决定如何处理这些文件和/或目录。根据错误消息,它是一个目录, 2 ,切换到master将导致该目录被删除并替换为其他内容(可能是一个不同的目录,其中包含一些文件)它,可能只是一个文件)。你:

    • 想保存/他们?
    • 如果是这样,你想在提交中保存它们,还是只是将它们移开?
    • 或者你只是想把它们吹走?

    要保存它们,要么提交它们,要么将它们移开(例如,将它们重命名为不属于工作树的路径,或重命名为“更安全”的不同未跟踪名称,无论是什么)。

    要简单地将它们吹走,请手动移除它们或使用git checkout -f(强制)使git执行此操作。

    由于您现在不在分支上(处于“分离的HEAD”模式),如果您想永久地将它们提交到存储库,您可以使用类似于CommuSoft在我编写时添加的方法。 (您可以在执行“git commit”之前或之后随时创建新分支。)

    您也可以使用git stash。 Git的stash是一个看似复杂的小脚本:它使得提交不在任何分支上,以后可以移植到分支。使用它非常简单容易:您只需运行git stash save并保存和清除所有挂起的跟踪更改,或运行git stash save -u所有待处理的跟踪更改未跟踪的文件保存并清理干净。现在,它们在提交时都安全地被存储在存储库中,即使它不是分支上的提交。

    在这里做什么没有一个正确的答案。


    1 显然不同,因为如果你已经在提交中,你要求git将移动到,那么该文件将在提交中并因此被跟踪,或者它不会在提交中,因此你不会要求git来破坏它。

    2 这有点奇怪。如果我创建一个将被我的git checkout破坏的目录,并且我将其作为目录,那么git就会继续前进并破坏它。这里master^master之间的区别在于,从master^master前进会创建文件mxgroup.py(因此退后将其删除):

    $ git checkout -q master^  # file goes away, now let's mkdir...
    $ mkdir mxgroup.py; git checkout -q master
    $ file mxgroup.py
    mxgroup.py: Python script, ASCII text executable
    

    但是,如果我有一个非空的目录,我会收到一条不同的错误消息:

    $ git checkout -q master^  # file goes away; mkdir and make file
    $ mkdir mxgroup.py; touch mxgroup.py/file; git checkout -q master
    error: Updating the following directories would lose untracked files in it:
        mxgroup.py
    
    Aborting
    

    但这是git版本2.0.2;也许年长的gits不那么聪明。