git push 不指定分支时的默认行为是什么
Git 2.0 起 push.default 默认值为 simple:git push 只推送当前分支到远程同名上游分支,分支名不一致或未设上游会报错。可用 git config push.default 修改,推荐显式 git push -u origin <分支>。
现代 Git(2.0 及以后)默认行为是 simple:只推送当前分支到它的上游(同名远程分支);没设上游或名字不一致时拒绝执行并报错提示。 老版本 Git 1.x 的默认是 matching——把所有本地与远程同名的分支全部推上去,容易误推,2.0 起被废弃。
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 模式)。