Git Push报错Untracked工作树文件被merge覆盖的解决方法
问题根因
报错的核心原因是你配置的生产部署远程仓库不是无工作区的裸仓库(bare repository),而是带完整工作目录的普通Git仓库。推送触发远程分支更新时,Git会自动尝试将最新提交合并到远程当前工作区,此时工作区存在未被Git追踪的public/vendor/nova/main.js,与本次推送的同名文件路径冲突,就会抛出该错误,和git pull操作无关。
可选解决方案
根据实际需求选对应方案即可:
方案1:清理远程冗余文件后正常推送(生产场景推荐)
public/vendor目录下的文件属于依赖安装生成的静态资源,本身不应该以未追踪状态遗留在生产工作区,直接清理对应冲突文件即可解决:
- 登录生产服务器,进入远程仓库对应的工作根目录
- 直接删除冲突的未追踪文件:
rm -f public/vendor/nova/main.js
如果怕误删,可以先执行git status查看所有未追踪文件清单,确认后再删除对应项。
3. 回到本地环境重新执行推送命令即可。
*长期优化建议:如果要持续用该仓库接收推送,在远程仓库目录下执行以下配置,后续推送会自动更新工作区,避免同类冲突:
git config receive.denyCurrentBranch updateInstead
方案2:从待推送内容中移除冲突文件
如果你确认不需要将该文件纳入版本控制、推送到生产环境,直接在本地移除该文件的Git追踪即可:
- 在本地仓库根目录执行命令,将文件从Git版本追踪中移除(加
--cached参数会保留本地磁盘上的文件,不会删除本地副本):
git rm --cached public/vendor/nova/main.js
- 将
public/vendor/路径添加到项目根目录的.gitignore文件中,避免后续依赖文件被误提交 - 提交本次改动:
git commit -m "chore: remove vendor file from version control"
- 重新执行推送命令即可。
方案3:强制推送覆盖远程内容(谨慎使用)
如果你确认远程工作区的所有未提交、未追踪内容都不需要留存,本地提交的版本就是完全符合预期的生产版本,可以走强制覆盖流程:
- 先在远程仓库目录下执行
git config receive.denyCurrentBranch updateInstead,允许推送更新当前工作分支 - 回到本地执行强制推送命令:
git push -f origin 你要推送的分支名
*注意:该操作会直接覆盖远程工作区与本地版本不一致的所有内容,执行前必须确认远程没有需要留存的文件,避免生产数据丢失。
内容的提问来源于stack exchange,提问作者Cornel Verster
相关产品推荐
相关产品推荐

