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

e-s*_*tis 75 git

今天早上我们从我们的仓库撤出,git把我们拉上了(没有分支).

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

Jos*_*Lee 98

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

您可以通过检查SHA1的提交,或者当您处于rebase中间或合并失败时进入这种情况.很难说你为偶然进入这种情况所做的工作.

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

一个简单的方法,看看发生了什么事是git refloggit log -g --decorate一个更详细列表.该--decorate选项将为每个SHA1标记指向它的所有分支的名称.如果当前HEAD的SHA1与master完全相同,那么除了git checkout master重新回到轨道之外,您不必做任何事情.否则,查看某个其他分支是否指向SHA1.如果没有,您可能希望创建一个分支以挂起它.

另一个好的命令是git branch -av,它将类似地列出所有分支及它们指向的内容,这样你就可以看到你(no branch)应该是什么.


Chr*_*sen 32

没有更多细节,很难说清楚.

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

如果你开始分支,任何合并类型拉动将始终离开你在该分支上.另一方面,rebase命令总是通过使用临时分离的HEAD(也称为"无分支")来工作.如果你在rebase-type pull期间处于这种状态,那么是因为pull的rebase部分遇到了冲突,它正等着你解决它们并使用rebase --continue(或--skip,或--abort).

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

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

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

  • 关于`.git / rebase-apply`的存在的一个很好的提示。 (2认同)