git push 不指定分支时的默认行为是什么
Git 2.0 起 push.default 默认值为 simple:在无显式 refspec 等覆盖时推送当前分支,通常要求同名上游;自动建立上游与三角工作流有例外。可用 git config push.default 修改,推荐显式 git push -u origin <分支>。
现代 Git(2.0 及以后)默认行为是 simple:只推送当前分支到它的上游(同名远程分支);在推送回通常的上游远程时,未设上游或名字不一致通常会拒绝;push.autoSetupRemote=true 可自动建立首次上游,推送到不同远程的三角工作流则按同名目标处理。 老版本 Git 1.x 的默认是 matching——把所有本地与远程同名的分支全部推上去,容易误推,2.0 起不再是默认值,但仍受支持。
只有未提供命令行 refspec 且未由 remote.<name>.push 等指定映射时,push.default 才决定默认分支选择;推送远程还受 branch.pushRemote、remote.pushDefault 等配置影响。
push.default 各取值
| 值 | 行为 |
|---|---|
simple(默认) |
只推当前分支,通常检查上游同名;自动建上游和三角工作流有例外 |
current |
推当前分支到远程同名分支,不存在则创建 |
upstream |
推当前分支到其配置的上游分支(名字可不同) |
matching |
推送所有与远程同名的本地分支(旧默认,危险) |
nothing |
不指定分支就报错,强制显式 |
查看与修改:
git config push.default # 查看当前设置
git config --global push.default current # 例如改为 current
推荐的显式习惯
git push -u origin feature-x # 首次推送并建立跟踪
git push # 之后直接推(upstream 已确定)
-u 建立跟踪关系后,裸 git push / git pull 才有明确目标,git status 也会显示"领先/落后远程几个提交"。
常见问题(FAQ)
Q:报 "The current branch has no upstream branch" 怎么办?
当前分支还没关联远程分支。按提示执行 git push --set-upstream origin <分支名>(即 -u)一次即可。
Q:matching 为什么危险?
一句 git push 可能把你本地十几个半成品分支全部推上远程,但不会因此自动强推;默认仍拒绝非快进更新。这就是 Git 2.0 改默认值的直接原因。
Q:push 到不同名的远程分支怎么写?
git push origin 本地名:远程名。设过 upstream 后裸 git push 也能用(配合 upstream 模式)。