是。git push origin --all 会推送所有本地分支(包括全新未推送过的),需显式指定远程名 origin;默认 git push --all 仅推送已有远程追踪关系的分支。

git push --all 会推所有本地分支吗?
不会。默认情况下 git push --all 只推送「当前远程已知的」本地分支(即那些已经存在对应 origin/xxx 远程追踪分支的),而不是字面意义的“所有本地分支”。它本质是把所有有远程追踪关系的本地分支都推一遍,对全新分支无效。
怎么真正推所有本地分支(包括全新未推送过的)?
用 git push origin --all 是最直接的方式——注意必须显式指定远程名 origin,否则 --all 不生效。它会遍历 git branch --format='%(refname:short)' 的全部输出,逐个执行 git push origin <branch></branch>。
实操建议:
- 先运行
git branch -v确认哪些分支还没推过(没有[origin/xxx]标记) - 执行前加
--dry-run预览:git push --dry-run origin --all - 如果某些分支不想推(比如临时调试分支),提前重命名或删掉:
git branch -d temp-debug - 注意:该命令不处理已删除的本地分支,也不会自动 prune 远程废弃分支
为什么 git push --set-upstream origin * 不能替代?
虽然 git push --set-upstream origin branch1 branch2 ... 能为单个或多个分支设置追踪并推送,但手动列分支名违背“一键”需求;而用通配符 git push --set-upstream origin * 在 shell 中会被展开成当前目录文件名,不是分支名,大概率报错 error: src refspec xxx matches more than one 或直接失败。
适用于以下场景:(1)用户提供 GitHub 仓库 URL 或本地仓库路径,并请求将其转换为其他格式;(2)用户请求导出 GitHub 仓库……
安全替代方案只有两种:
-
git push origin --all(推荐,简洁可靠) - 写一行脚本:
git for-each-ref --format='%(refname:short)' refs/heads/ | xargs -r git push -u origin(适合需要自动设 upstream 的场景)
同步后远程分支没显示?检查这些点
常见原因不是命令没跑,而是权限、网络或 Git 配置问题:
- 确认远程地址可写:
git remote get-url --push origin,如果是https://地址,确保凭据缓存有效(git credential reject 后重试可触发重新输入) - 检查是否被远程拒绝:某些托管平台(如 GitHub/GitLab)默认禁止向
main或master强制推送,但--all是普通推送,一般不受限;若报! [remote rejected] xxx (protected branch),需去网页端关闭分支保护 -
git config --get remote.origin.push若有自定义值(如+refs/heads/main),会覆盖--all行为,清空它:git config --unset remote.origin.push
真正容易被忽略的是:Git 本身不校验远程是否“最终可见”,它只管发包。如果你刚推完立刻刷新网页控制台看不到新分支,等几秒再刷——不是命令失败,是服务端异步索引延迟。










