git“updating currently checked out branch”警告的含义是什么?

32

当我执行 git push 命令时,我看到以下内容:

warning: updating the currently checked out branch; this may cause confusion,
as the index and working tree do not reflect changes that are now in HEAD.

我在谷歌上搜索了这个信息,但是我只找到了一个git邮件列表的讨论,作者们试图决定如何更好地向我传达真正的问题。

我是怎么引起这个问题的?该如何解决?


1
@WilliamTate 不,这篇文章是关于一个警告,链接的文章是关于错误的。 - CharlesB
2
是的,我认为这是Git之前版本中你收到的警告而不是错误。 - Nowhere man
1
可能是将更改推送到远程存储库时出现的Git警告消息是什么?的重复问题。 - Trevor Boyd Smith
3个回答

48
这种情况发生在您推送到非裸仓库时。 裸仓库是仅由 .git 目录组成的仓库; 非裸仓库还包括一个 checkout。通常情况下,您不应该推送到非裸仓库;事实上,在未来版本的 git 中将被禁止。如果您推送到非裸仓库,则该仓库的 HEAD 会与索引和工作副本不同步。
如果您要创建一个人们希望推送的仓库,则应使用 git init --bare(如果多个用户帐户需要访问它,则使用git init --bare --shared),或者如果要通过克隆现有仓库来创建仓库,则使用 git clone --bare

1
谢谢。这个重要的警告告诉我,我从错误的存储库克隆并推送了代码!我有一个裸仓库,与另一个仓库同名,我不小心克隆了它! - skiphoppy
1
从一个非裸库拉取到另一个非裸库可以吗?我猜不行吧? - Benbob
1
@Keyo 是的,从一个非裸仓库拉取到另一个非裸仓库是可以的。但是你不应该向非裸仓库推送。 - Brian Campbell
2
事实上,您可以完全向非裸库推送,只是您不能向当前选中的分支进行推送。 - Nowhere man
1
@Nowhereman 这是真的,我的答案有点简化了。通常情况下,即使只推送到当前检出分支,也不建议将内容推送到非裸仓库,因为这样做可能会导致问题。如果你发现自己在向非裸仓库推送内容,那么很可能意味着你正在做一些错误的事情。 - Brian Campbell
我不确定我曾经见过有人反对这种做法,而且我知道有几种使用Git的完全有效的工作流程涉及将代码推送到非裸仓库。例如,我通常使用git版本控制纯文本笔记,在我的笔记本电脑和工作站上各有一个仓库。在每台计算机上,都检出了不同的分支,以便我可以安全地将其推送到另一台计算机上,在那里我会合并(通常只尝试快进或者变基)。 - Nowhere man

12
简而言之,你的远程仓库不再是一个裸仓库,并且你正在推送到远程的检出分支。
参见 "如何发布Git仓库":

裸仓库是没有代码工作副本的。它只包含git数据库。
一般来说,您不应该将更改推送到包含工作副本更改的存储库中。
为了确保这种情况不会发生,我们将服务器存储库设置为裸存储库 - 它没有工作副本

这里开始:

请注意,“push”的目标通常是一个存储库(即没有自己的工作树)。
您也可以将其推送到具有已检出工作树的存储库,但是工作树不会通过推送进行更新。
如果您要推送的分支是当前已检出的分支,则可能会导致意外结果。

如果定义了一个分离的工作树(例如,对应于Web服务器的DocumentRoot),则需要执行以下操作:

检查您的远程仓库上git config core.worktreegit config core.bare的值。


1
自己注意:请参考https://dev59.com/eUvSa4cB1Zd3GeqPc0C9,了解裸仓库用法的示例。 - VonC

5

我通过从我的混乱仓库克隆一个新的裸仓库,保留混乱仓库作为备份并用克隆的裸仓库替换它来使我的仓库变为裸仓库。

我对Git还不是很熟悉,在设置仓库时,我忘记使用--bare选项。感谢您的帮助!

我已经阅读了O'Reilly git书籍,现在完全成为了一名git迷。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接