1. 命令概述

git push 命令用于将本地分支的提交上传到远程仓库,并更新远程仓库对应的分支。它是你与团队成员分享代码、进行协作的基础。简单来说,它完成了本地工作到中央仓库的“推送”动作。
核心概念:

  • 上游分支:当你克隆一个仓库后,本地分支(如 main)通常会与一个远程分支(如 origin/main)建立追踪关系。这个远程分支就是本地分支的“上游分支”。
  • 快进推送:如果远程分支的最新提交是你本地分支历史的直接祖先,那么 Git 只需将远程分支指针向前移动即可,这种操作称为“快进”。

2. 命令格式

git push 命令的基本格式如下:

git push [<选项>] [<远程仓库名>] [<本地分支名>[:<远程分支名>]]
  • <选项>: 用于改变命令行为的可选参数(例如 -u, -f, --tags)。
  • <远程仓库名>: 远程仓库的简称,默认为 origin
  • <本地分支名>: 你想要推送的本地分支的名称
  • <远程分支名>: 你希望推送到的远程分支的名称。如果省略,默认与本地分支同名。

3. 基本用法

3.1 最简单的推送

当你处于某个已追踪远程分支的本地分支(例如 main)时,最常用的命令是:

git push

这等价于 git push origin main。Git 会自动将当前分支推送到其上游分支。

3.2 明确指定远程仓库和分支

如果你想明确指定推送到哪个远程仓库的哪个分支,可以使用完整格式:

# 将本地的 feature/login 分支推送到远程 origin 仓库的 feature/login 分支
git push origin feature/login

# 如果远程分支不存在,Git 会创建它

3.3 推送到不同名称的远程分支

你可以将本地分支推送到一个不同名称的远程分支。

# 将本地的 bugfix 分支推送到远程的 hotfix 分支
git push origin bugfix:hotfix

3.4 首次推送并设置上游分支

当你第一次推送一个新建的本地分支时,远程仓库还没有对应的分支。你需要使用 -u--set-upstream 选项来建立追踪关系。

# 创建并切换到新分支 new-feature
git checkout -b new-feature

# ... 进行一些提交 ...

# 首次推送,并设置上游分支
git push -u origin new-feature

执行后,本地 new-feature 分支就会追踪 origin/new-feature。之后在这个分支上,直接使用 git push 即可。

4.高级用法

4.1 强制推送

警告:这是一个危险操作,会覆盖远程历史,请谨慎使用!

强制推送会用你的本地提交完全覆盖远程分支的提交历史。

git push --force-with-lease
# 或它的别名git push -f

为什么危险? 如果在你强制推送之前,有其他同事向该分支推送了新的提交,你的操作将永久删除他们的提交,导致工作丢失。

更安全的替代品--force-with-lease这是 --force 的一个更安全的版本。它在推送前会检查远程分支的当前状态是否与你上次获取时一致。如果不一致(说明有别人推送过),它会拒绝推送,从而避免覆盖他人的工作。推荐始终使用 --force-with-lease 来代替 -f

使用场景:

  • 本地 rebase 后。
  • 修改了某个历史提交(commit --amend)后。

4.2 删除远程分支

通过推送一个“空”的引用来删除远程分支。

git push origin --delete <远程分支名>
# 或者等价的语法
git push origin :<远程分支名>

4.3 推送所有分支

一次性将所有本地分支推送到远程仓库(不常用,通常用于备份)。

git push --all origin

4.4 推送标签

默认情况下,git push 不会推送标签。你需要显式地推送它们。

# 推送一个特定的标签
git push origin v1.0.0

# 推送所有本地标签
git push origin --tags

5. 注意事项

  1. 推送前先拉取:在推送之前,最好先执行 git pull(或 git fetch + git merge/git rebase)来获取远程的最新更改,并解决可能出现的合并冲突。这能保证你的推送是一个“快进”操作。
  2. 权限问题:确保你对远程仓库有写入权限
  3. 非快进推送:如果远程分支有你没有的提交,你的普通推送会被拒绝。你必须先整合远程的更改(通过 pullrebase)。
  4. 强制推送的团队协作规范绝对不要在团队共享的分支(如 main, develop)上使用强制推送。它只应用于你个人的特性分支,并且在你确认没有其他人基于该分支工作时。
  5. 小心通配符:使用通配符推送时要格外小心,以免推送了不想要的分支或标签。

6. 补充信息

6.1 推送的完整工作流示例

假设你正在开发一个新功能:

# 1. 从主分支创建功能分支
git checkout -b feature/awesome-new-feature

# 2. 进行开发,并多次提交
git add .git commit -m "实现核心功能A"
git add .git commit -m "修复功能A的bug"

# 3. 首次推送到远程,建立追踪
git push -u origin feature/awesome-new-feature

# 4. (后续继续开发...)
git add .
git commit -m "完善功能文档"

# 5. 再次推送(因为已经设置了上游,命令很简单)
git push

6.2 查看推送状态

使用 git status -uno 可以查看本地分支与上游分支的提交关系,它会告诉你你的分支是领先、落后还是分叉了。

$ git status -uno
On branch main
Your branch is ahead of 'origin/main' by 2 commits.
  (use "git push" to publish your local commits)

6.3 配置默认推送行为

你可以通过 Git 配置来设置默认的推送行为。

# 设置 push.default 为 ‘simple’ (Git 2.0 后的默认值),这是最安全的行为。
# 它只推送当前分支到其上游分支,且要求分支名相同。
git config --global push.default simple

# 或者设置为 ‘current’,将当前分支推送到远程同名分支,如果不存在则创建。
git config --global push.default current
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐