我刚刚检查了一个旧项目来修复错误。 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
分店吗?如果没有,我该怎么做?
答案 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
从一个提交移动到另一个提交时,它会做两件事:
第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不那么聪明。