今天早晨,我们从回购中撤出,而git将我们放在(没有分支)上。
我不明白,为什么会这样?以及如何摆脱它而不丢失我们的更改?
Answers:
“当前不在任何分支上”表示您有一个分离的 头,即您的HEAD指针直接引用了提交,而不是用符号指向分支的名称。
您可以通过检出SHA1的提交,或者在进行重新设置的中间,或者合并失败时,进入这种情况。很难说您是如何偶然进入这种情况的。
据说,当您从分离的HEAD切换到某个分支时,您可能会丢失所做的更改,但是reflog将始终跟踪HEAD移动的位置。实际上,当从分离的HEAD切换时,Git 1.7.5会警告您,并且会丢失提交。唯一真正丢失工作的时间是您未提交的更改,您可能要提交或隐藏它们。
查看发生了什么的简单方法是git reflog或git log -g --decorate更详细的列表。该--decorate选项将使用指向它的所有分支的名称来标记每个SHA1。如果当前HEAD的SHA1与主数据库完全相同,那么您无需做任何事情git checkout master即可恢复正常。否则,请查看SHA1是否由其他分支指向。如果没有,您可能希望创建一个分支以使其挂起。
另一个很好的命令是git branch -av,它将类似地列出所有分支以及它们指向的对象,这样您就可以看到您(no branch)的实际含义。
没有更多细节很难分辨。
git pull从远程存储库中获取更改,然后进行合并。可以将其配置为执行基准而不是合并(通过执行git pull --rebase,或为branch.<branch_name>.rebase要提取的分支配置一个真值)。
如果您是从分支开始的,那么任何合并类型的提取都会使您始终留在该分支上。另一方面,rebase命令始终通过使用临时分离的HEAD(也称为“无分支”)工作。如果在进行rebase类型的请求期间处于这种状态,那是因为请求的rebase部分遇到了冲突,并且它正在等待您解决它们并使用rebase --continue(或--skip或--abort)。
默认情况下,reflog存储对HEAD所做的每个更新(每个分支也可以有一个更新)。您可以使用git reflog show(或git log -g查看更详细的视图)查看reflog 。它可以帮助您确定如何进入此状态。
如果您位于某个基准站的中间(您有一个.git/rebase-apply目录),那么它可能已停止运行以解决一些冲突。使用git status检查“未合并”的条目。任何此类条目都应在文件中嵌入冲突标记(假设它们是纯文本文件)。您应该编辑它们以解决冲突,并通过git add在它们上运行将它们标记为已合并。然后运行git rebase --continue以继续进行变基。您可能会遇到更多应以类似方式处理的冲突(编辑,添加,继续)。如果您决定不再需要特定的提交,则可以使用跳过它git rebase --skip。您可以使用以下方法中止整个基础git rebase --abort。当由于任何冲突而停止重新基准时,所有这些重新基准命令都会在错误消息中列出。一旦应用了所有待处理的提交(或跳过了这些提交),原始分支将使用最终的新提交进行更新,并且您的HEAD将重新附加到该分支(如果中止,则将在不更新该分支的情况下重新附加HEAD)。
如果分离的HEAD不是由于在重新设置基准期间发生冲突而引起的,则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线索的不错提示。
git reflog对他们有用,但对我却没有任何回报。git branch -av确实会返回所有远程分支及其指向的对象,但是我不知道这与我的本地对象有何关系。我在哪里?我在哪个分支和哪个提交中?这就是我很想知道的。