git push 把本地提交上传到远端并更新远端引用。它是少数会影响所有人的命令,所以参数里有一半是在做安全约束:推哪里、推哪些、要不要允许覆盖历史。
本文列出 git push 的常用参数,重点讲清 -u、refspec、--force-with-lease 与 --force 的区别。
关于本系列
本文是《Git 使用教程》按命令拆分的第 26 / 28 篇,全部收录在 Git 栏目。参数表列的是日常高频项,并非穷举;想看某个命令的完整参数,用
git push -h 看精简列表、git help push 看完整手册。示例以 Git 2.56.0 为准。一、命令语法
先看语法骨架,再对照下一节的参数表。<占位> 表示必填值,实际输入时不要带尖括号;[...] 表示可选项,-- 用来分隔选项与路径。
bash语法
git push [<options>] [<repository> [<refspec>...]]
二、参数逐项详解
下表按用途列出 git push 的常用参数,每项都注明了「它到底改变了什么」。
| 参数 | 作用 |
|---|---|
-u / --set-upstream | 首次推送时建立本地分支与远端分支的跟踪关系,之后可直接 git push / git pull |
<remote> <refspec> | 显式指定推到哪里,如 origin main:main;本地:远端 可不同名 |
--force-with-lease[=<ref>[:<期望值>]] | 推荐的强推方式:仅当远端仍是自己上次看到的状态才允许覆盖 |
-f / --force | 无条件强推,会覆盖远端历史,团队协作中尽量不用 |
--all / --branches | 推送所有本地分支 |
--tags / --follow-tags | 推送全部标签 / 只推随本次提交可达的附注标签 |
-d / --delete | 删除远端引用,如 git push origin --delete old-branch |
--prune | 删掉远端那些本地 refspec 已不再覆盖的引用 |
-n / --dry-run | 只演练,打印将要推送的内容;这里的 -n 是 dry-run |
--atomic | 原子推送:多个引用要么全成功要么全不推,需服务端支持 |
--no-verify | 跳过 pre-push 钩子 |
-o <串> / --push-option | 向服务端传选项,触发平台行为(如自动创建 MR/PR) |
--mirror | 镜像推送所有 refs,用于仓库搬迁 |
--porcelain / -q / -v | 机器可读输出 / 静默 / 详细 |
--force-if-includes | 配合 lease 再校验远端提交是否已包含在本地 reflog 中,更严格 |
refspec 常见写法
| 写法 | 含义 |
|---|---|
git push origin main | 把本地 main 推到远端同名分支 |
git push origin main:release | 本地 main 推到远端 release |
git push origin :old-branch | 删除远端 old-branch(空源) |
git push origin HEAD | 把当前分支推到远端同名分支,脚本里常用 |
三、常用示例
首次推送与日常推送
bash首次推送与日常推送
git push -u origin feature/login
git status -sb # ## feature/login...origin/feature/login
git push
git push -n origin main # 先预演
改写自己分支的历史
bash改写自己分支的历史
git commit --amend --no-edit
git push --force-with-lease origin feature/login
# 若被拒绝,先 fetch 再检查,别直接换 --force
删除与标签
bash删除与标签
git push origin --delete feature/old
git push origin v1.2.0
git push --follow-tags
四、注意事项
强推一律用 --force-with-lease
--force 不检查远端当前状态,别人刚推上去的提交会被你的历史直接盖掉。--force-with-lease 会比对远端引用是否仍等于本地记录的 origin/分支,不一致就拒绝。注意:改写已公开分支的历史仍需团队同步,参数不能替代沟通。push 不会自动带标签: 打完 tag 记得
git push origin v1.2.0;git push --tags 会把所有本地标签(含临时标签)一起推出去。推荐配 push.followTags=true 只自动带附注标签。五、小结
git push 的参数分三类:推什么(refspec、--all、--tags、-d)、怎么推(-u、--atomic、-o)、允不允许覆盖(--force-with-lease)。把最后一项记牢,能避免绝大多数协作事故。
本系列共 28 篇,一个命令一篇,完整目录见 Git 栏目。下一篇:git stash 命令参数详解。