2010-03-23 41 views

回答

87

“目前不在任何分支上”意味着您有一个detachedhead,即您的HEAD指针直接引用提交而不是象征性地指向分支的名称。

您可以通过签出SHA1提交,或者当您处于rebase中间或合并失败时进入此情况。很难说你可能为了偶然发现这种情况而做了什么。

据说,当您从分离的HEAD切换到某个分支时,您可能会失去更改,但reflog将始终跟踪HEAD移动的位置。事实上,当从一个分离的HEAD切换时,Git 1.7.5会警告你。 确实失去工作的唯一时间是当您有未提交的更改时,您可能想提交或存储。

一个简单的方法来看看发生了什么是git refloggit log -g --decorate一个更详细的清单。 --decorate选项将使用指向它的所有分支的名称标记每个SHA1。如果您当前HEAD的SHA1与主人的完全相同,那么您不必做任何事情,只需要git checkout master就可以回到正轨。否则,请查看其他分支是否指向SHA1。如果没有,你可能希望创建一个分支来挂靠它。

另一个好的命令是git branch -av,它将同样列出所有分支和他们指向的内容,所以你可以看到你的(no branch)真的应该是什么。

+0

+1 for git reflog。这让我感到困惑。 – kakyo 2013-03-18 21:09:09

30

很难说没有更多的细节。

git pull从远程存储库中提取更改,然后进行合并。它可以配置为进行重新分配而不是合并(通过执行git pull --rebase,或者通过为您要分支的分支配置一个真实值branch.<branch_name>.rebase)。

如果你是从一个分支开始的,任何合并类型的pull都会让你留在那个分支上。另一方面,rebase命令总是通过使用临时分离的HEAD(又名“no分支”)来工作。如果您在重新绑定类型拉的过程中处于此状态,那是因为拉动的重新绑定部分发生冲突,并且正在等待您解决它们并使用rebase --continue(或--skip--skip--abort)。

默认情况下,reflog存储对HEAD所做的每个更新(每个分支也可以有一个更新)。您可以使用git reflog show(或更多详细视图,请参阅git log -g)查看推荐日志。它可以帮助你确定你进入这个状态的方式。

如果你处于rebase(你有一个.git/rebase-apply目录)的中间,那么它可能会停下来让你解决一些冲突。使用git status检查“未合并”条目。任何这样的条目都应该在文件中嵌入冲突标记(假设它们是纯文本文件)。您应该编辑它们以解决冲突,并通过在其上运行git add将它们标记为合并。然后运行git rebase --continue继续进行rebase。您可能遇到更多应以类似方式处理的冲突(编辑,添加,继续)。如果您决定不再需要特定提交,则可以使用git rebase --skip跳过它。您可以用git rebase --abort中止整个rebase。所有这些rebase命令都会在由于任何冲突而停止资产时出现在错误消息中。一旦所有挂起的提交已经被应用(或跳过),你的原始分支将被更新为最终的新提交并且你的HEAD将被重新附加到它(如果你中止,你的HEAD将被重新挂接而不更新分支)。

如果你脱离的HEAD不是由于在rebase中间发生的冲突造成的,那么你的HEAD在拉动之前的某个点被分离。您将需要评估树的当前状态,以决定要执行的操作。您可以使用git show-branch --current --allgit log --graph --oneline --decorate --all或图形工具如gitk来了解当前(分离)HEAD与您其他分支的关系。如果您决定要保留头部的内容,那么您可以使用git branch new_branch_name为他们创建一个新分支。如果您想覆盖现有分支,请使用git branch --force existing_branch_name。然后使用git checkout branch_name将您的存储库的HEAD重新附加到分支。

+1

提示'.git/rebase-apply'是一条线索。 – millhouse 2013-07-24 23:52:09

1

注意的是,在“git pull --rebase”运行,而HEAD被分离的情况下,GIT中试图找到分离HEAD(其通过定义不存在),并发出不必要的错误消息的上游分支。

这不再是Git1.8.0.1(2012年11月26日)的情况下

this commit