为什么git让我们(没有分支)?

今天早上,我们从我们的回购拉,git把我们(没有分支)。

我不明白这个,为什么会这样呢? 而如何摆脱它而不会失去我们的改变?

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

你可以通过签出SHA1的提交,或者当你在一个rebase的中间,或者一个合并失败的时候,来进入这种情况。 很难说你可能已经做了什么事情来偶然地进入这种情况。

据说,当你从一个分离的HEAD切换到某个分支时,你可能会失去你的改变,但是reflog会一直跟踪你HEAD移动的地方。 事实上,Git 1.7.5会在从一个分离的HEAD切换时会提示你失去提交。 唯一一次你真的可以失去工作的时候,你有没有提交的变化,你可能要提交或存储。

一个简单的方法来看看发生了什么是git refloggit log -g --decorate获取更详细的列表。 --decorate选项将为每个SHA1标上所有指向它的分支的名称。 如果你当前HEAD的SHA1与主控完全一样,那么你不需要做任何事情,只要git checkout master重新回到正轨。 否则,请查看其他分支是否指向了SHA1。 如果没有,你可能希望创build一个分支来坚持它。

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

没有更多的细节很难说。

git pull从远程仓库获取更改,然后进行合并。 它可以被configuration为代替合并(或者通过执行git pull --rebase ,或者通过为branch.<branch_name>.rebaseconfiguration一个真正的值)来代替合并。

如果你从一个分支开始,任何合并types的pull都会让你留在那个分支上。 另一方面,rebase命令总是通过使用临时分离的HEAD(又名“no分支”)来工作。 如果你在这个状态下处于rebasetypes的pull状态,那么这是因为pull的rebase部分发生冲突,并且等待你解决它们并使用rebase --continue (或者--skip或者--abort )。

默认情况下,reflog存储对HEAD所做的每个更新(每个分支也可以有一个)。 你可以用git reflog show (或者git log -g查看更详细的视图)查看reflog。 这可能会帮助你确定你是如何进入这个状态的。

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

如果你脱离的HEAD不是由于在rebase中间发生的冲突,那么你的HEAD在pull之前的某个点被分离。 您将需要评估树的当前状态以决定您想要执行的操作。 你可以使用git show-branch --current --all或者git log --graph --oneline --decorate --all或者像gitk这样的graphics工具来找出当前(分离的)HEAD与你的其他分支的关系。 如果你决定保留HEAD的内容,那么你可以用git branch new_branch_name为它们创build一个新的分支。 如果你想覆盖现有的分支,那么使用git branch --force existing_branch_name 。 然后使用git checkout branch_name将你的仓库的HEAD重新附加到一个分支。

请注意,如果在分离HEAD运行“ git pull --rebase ”,Git会尝试查找分离的HEAD (根据定义不存在)的上游分支并发出不必要的错误消息。

Git1.8.0.1(2012年11月26日)

看到这个提交 。