You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git推送master分支报错(branch is currently checked out)如何解决?

问题解答

报错根本原因

你遇到的报错是因为服务器上托管的是带工作区的非裸Git仓库,且当前恰好检出了master分支。
Git默认禁止向非裸仓库的当前检出分支推送,原因正如提示所说:推送只会更新远端的HEAD指针和提交记录,不会自动同步更新远端工作区的物理文件,会导致远端工作区、暂存区的内容和最新的HEAD提交不一致,后续如果有人直接在服务器的仓库目录下修改、提交代码,会直接产生冲突,甚至损坏提交历史。

官方文档未提及的原因

你参考的「小型私有团队」协作章节,默认假设你会使用**裸仓库(无工作区,仅保存Git提交记录)**作为远端中心仓库,裸仓库不存在「当前检出分支」的概念,自然不会触发这个限制,你大概率是在服务器初始化仓库时没有加--bare参数,创建了普通非裸仓库作为远端,才会出现和示例不一致的情况。

关于receive.denyCurrentBranch设为refuse的说明

  • 该操作完全不是解决方案,也不会解决你的推送失败问题:refuse本身就是该配置的默认值,设置后只是会屏蔽错误提示文本,但依然会直接拒绝你的推送请求,没有任何实际意义。
  • 如果你要强行绕过限制,将该配置改为ignore才会允许推送,但这是非常不安全的操作,会直接触发前面提到的工作区与HEAD不一致的问题,极容易导致远端仓库异常,非常不推荐。

正确解决方案

按优先级从高到低排序:

  • 方案1:将远端仓库替换为裸仓库(最推荐,符合Git协作规范)
    1. 登录服务器,备份原有仓库的代码文件
    2. 执行git init --bare <仓库名>.git初始化裸仓库
    3. 本地将代码推送到新的裸仓库地址即可,后续所有成员推送都不会触发该类问题
  • 方案2:适用于需要保留远端工作区的场景(比如推送后直接触发部署)
    将receive.denyCurrentBranch配置设为updateInstead,该配置会在你推送当前检出分支时,自动同步更新远端的工作区文件,仅当远端工作区没有未提交的修改时会生效,适合可控的私有部署场景。
  • 方案3:临时应急方案
    登录服务器,在仓库目录下执行git checkout --detach切换到游离HEAD状态,即可正常推送master分支,但后续如果重新切回master分支,推送限制会再次生效,仅适合临时处理问题使用。

内容的提问来源于stack exchange,提问作者user2399035

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:27:03