Git推送master分支报错(branch is currently checked out)如何解决?
问题解答
报错根本原因
你遇到的报错是因为服务器上托管的是带工作区的非裸Git仓库,且当前恰好检出了master分支。
Git默认禁止向非裸仓库的当前检出分支推送,原因正如提示所说:推送只会更新远端的HEAD指针和提交记录,不会自动同步更新远端工作区的物理文件,会导致远端工作区、暂存区的内容和最新的HEAD提交不一致,后续如果有人直接在服务器的仓库目录下修改、提交代码,会直接产生冲突,甚至损坏提交历史。
官方文档未提及的原因
你参考的「小型私有团队」协作章节,默认假设你会使用**裸仓库(无工作区,仅保存Git提交记录)**作为远端中心仓库,裸仓库不存在「当前检出分支」的概念,自然不会触发这个限制,你大概率是在服务器初始化仓库时没有加--bare参数,创建了普通非裸仓库作为远端,才会出现和示例不一致的情况。
关于receive.denyCurrentBranch设为refuse的说明
- 该操作完全不是解决方案,也不会解决你的推送失败问题:
refuse本身就是该配置的默认值,设置后只是会屏蔽错误提示文本,但依然会直接拒绝你的推送请求,没有任何实际意义。 - 如果你要强行绕过限制,将该配置改为
ignore才会允许推送,但这是非常不安全的操作,会直接触发前面提到的工作区与HEAD不一致的问题,极容易导致远端仓库异常,非常不推荐。
正确解决方案
按优先级从高到低排序:
- 方案1:将远端仓库替换为裸仓库(最推荐,符合Git协作规范)
- 登录服务器,备份原有仓库的代码文件
- 执行
git init --bare <仓库名>.git初始化裸仓库 - 本地将代码推送到新的裸仓库地址即可,后续所有成员推送都不会触发该类问题
- 方案2:适用于需要保留远端工作区的场景(比如推送后直接触发部署)
将receive.denyCurrentBranch配置设为updateInstead,该配置会在你推送当前检出分支时,自动同步更新远端的工作区文件,仅当远端工作区没有未提交的修改时会生效,适合可控的私有部署场景。 - 方案3:临时应急方案
登录服务器,在仓库目录下执行git checkout --detach切换到游离HEAD状态,即可正常推送master分支,但后续如果重新切回master分支,推送限制会再次生效,仅适合临时处理问题使用。
内容的提问来源于stack exchange,提问作者user2399035
相关产品推荐
相关产品推荐

