为什么 Git 把我们放在(没有树枝)上?

今天早上我们从我们的回购,并把我们(没有分行)。

我不明白,为什么会发生这种事? 怎样才能不失去我们的变化?

79218 次浏览

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

您可以通过检出 SHA1的提交,或者当您正处于重建基础的过程中,或者当合并失败时,进入这种情况。很难说你是怎么无意中陷入这种境地的。

据说,当你从一个分离的 HEAD 切换到某个分支时,你可能会丢失你的更改,但是 reflog 将始终跟踪你的 HEAD 移动的位置。事实上,Git1.7.5会在从分离的 HEAD 切换时警告您将丢失提交。真的丢失工作的唯一时间是当您有未提交的更改时,您可能希望提交或隐藏这些更改。

查看发生了什么的一个简单方法是 git refloggit log -g --decorate,以获得更详细的清单。--decorate选项将用指向它的所有分支的名称标记每个 SHA1。如果您当前的头部的 SHA1是完全相同的主,那么您不必做任何事情,但 git checkout master回到轨道上。否则,查看 SHA1是否被其他分支指向。如果没有,您可能希望创建一个分支来保存它。

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

It is hard to tell without more details.

git pull从远程存储库获取更改,然后进行合并。可以将其配置为执行 rebase 而不是 merge (可以通过执行 git pull --rebase,也可以通过为要拉入的分支配置 branch.<branch_name>.rebase的真值)。

如果您是从一个分支开始的,那么任何合并类型的提取操作都会将您留在该分支上。另一方面,rebase 命令总是通过使用临时分离的 HEAD (也就是“无分支”)来工作。如果在 rebase-type pull 期间您处于这种状态,那么这是因为 pull 的 rebase 部分遇到了冲突,它正在等待您解决这些冲突并使用 rebase --continue(或 --skip--abort)。

默认情况下,reflog 存储对 HEAD 所做的每个更新(也可以为每个分支存储一个更新)。您可以使用 git reflog show查看 reflog (或者使用 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 不是由于在重建基地中间发生的冲突,那么在拉取之前的某个时刻分离了 HEAD。您将需要评估树的当前状态,以决定您想要做什么。您可以使用 git show-branch --current --allgit log --graph --oneline --decorate --all或者像 gitk这样的图形化工具来查明当前(分离的) HEAD 与其他分支之间的关系。如果您决定保留 HEAD 的内容,那么您可以使用 git branch new_branch_name为它们创建一个新的分支。如果要覆盖现有分支,则使用 git branch --force existing_branch_name。然后使用 git checkout branch_name将存储库的 HEAD 重新连接到分支。

Note that, in case of a "git pull --rebase" run while the HEAD is detached, Git tried to find the upstream branch of the detached HEAD (which by definition does not exist) and emitted unnecessary error messages.

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

参见 这个承诺