git branch未显示全部分支,推送需加HEAD才能成功的问题排查
问题根因
- 你的本地仓库目前只创建了
master这一个本地分支,从未生成过对应远程mobile分支的本地跟踪分支,本地master也没有配置和远程mobile的关联关系,直接执行git push时Git找不到默认匹配的推送目标,就会抛出refspec错误。 git push origin HEAD:mobile能执行成功,是因为这条命令属于显式指定推送规则:直接把当前HEAD指向的提交(也就是你本地master分支当前的最新提交)推送到远程mobile分支,完全绕开了本地-远程分支的跟踪配置校验,属于临时指定目标的用法,不是正常的工作流状态。- 从
git branch --all -vv的输出可以看到,你本地master的最新提交哈希f1881f6和远程origin/mobile的提交哈希完全一致,说明你之前所有的代码改动都是在本地master分支上提交的,只是每次推送都手动指定了推送到远程mobile,从来没有把本地分支和实际要协作的远程分支做对应绑定。 - 之前执行
git fetch只输出拉取origin/master的记录,是因为你初始克隆仓库时的默认跟踪配置只关联了远程master分支,没有自动拉取默认分支mobile的跟踪映射,后续也没有手动补全配置。
修复步骤
操作前先确认本地所有改动都已经提交,或者用git stash暂存未提交的改动,避免切分支时丢失代码。
- 基于已拉取到本地的远程
origin/mobile分支,创建对应的本地跟踪分支并切换过去:
因为你本地当前# Git 2.23及以上版本用switch命令 git switch -c mobile --track origin/mobile # 旧版本Git用checkout命令,效果完全一致 # git checkout -b mobile origin/mobilemaster的提交和origin/mobile的提交哈希完全相同,切分支时不会出现代码冲突、文件变动的问题。 - 验证分支跟踪关系是否正确,执行:
正常输出会看到带git branch -vv*标记的当前分支为mobile,后面标注跟踪origin/mobile,提交哈希和你之前的最新提交一致。 - 设置当前分支的默认上游推送目标,后续直接执行
git push就可以正常推送到远程mobile分支,不需要再手动加HEAD:mobile参数:git push -u origin mobile - (可选操作)如果后续不需要在本地保留旧的
master分支,避免推送时搞混分支,可以删除本地master:# 安全删除,Git会校验分支提交是否已经合并到当前分支 git branch -d master # 如果提示未合并不让删,确认所有改动都已经同步到mobile分支后,可以强制删除 # git branch -D master
修复完成后可以执行一次无参数的
git fetch,之后会正常拉取远程mobile分支的更新,不会再出现只拉取master分支的问题。
内容的提问来源于stack exchange,提问作者Tree Big
相关产品推荐
相关产品推荐

