HOWTO · Git
推送到 Git 中的特定分支
本教程演示了如何将本地分支推送到 Git 中的特定远程分支。
本页内容
要将一个本地分支推送到远程仓库中指定的分支,请使用 git push <remote> <local-branch>:<remote-branch>。本地分支名和远程目标分支名可以不同。发送提交前,请确认要使用的分支和远程仓库;推送后再检查目标分支。命令是 git push。
选择本地分支和远程目标
先用 git status --short --branch 检查工作区和当前分支。只有当你打算推送当前检出的分支时,状态信息中显示的分支才是推送源。你也可以在推送命令中明确指定另一个本地分支。若要先切换分支,请使用 git switch feature/login,并将该名称替换为你的分支名。
使用 git remote -v 列出已配置的远程仓库。origin 是常见的远程名称,但仓库也可能使用其他名称,或配置了多个远程仓库。请选择指向该分支所属仓库的远程。如果不确定其 URL,请先检查列表再推送,不要默认 origin 一定正确。
将本地分支推送到指定的远程分支
远程名称后面的 refspec 格式为 local-branch:remote-branch:冒号前的名称指定本地源分支,冒号后的名称指定所选远程仓库上的目标分支。例如,git push origin feature/login:develop 会将本地 feature/login 推送到远程 origin,并命名为 develop。这样无需重命名本地分支,也能用不同的远程分支名发布它。
请在安装了 Git 的 Bash shell 中运行下面这个完整示例。它会创建临时本地仓库和裸远程仓库,将 feature/login 推送为 develop,随后删除临时文件。这是一个展示 refspec 用法的可执行示例。本数据包不包含该示例的运行证据;如果脚本成功运行,Git 接受推送后脚本会打印确认信息。
本节中的代码以及显示的标签或输出仍为英文。
set -eu
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
git init --bare -q "$tmpdir/remote.git"
git init -q "$tmpdir/work"
git -C "$tmpdir/work" config user.name "Example User"
git -C "$tmpdir/work" config user.email "example@example.com"
git -C "$tmpdir/work" switch -q -c feature/login
printf '%s\n' 'login change' > "$tmpdir/work/README.md"
git -C "$tmpdir/work" add README.md
git -C "$tmpdir/work" commit -q -m "Add login change"
git -C "$tmpdir/work" remote add origin "$tmpdir/remote.git"
git -C "$tmpdir/work" push -q origin feature/login:develop
printf '%s\n' 'Pushed feature/login to origin as develop.'
推送成功后,远程目标分支会更新为源分支所指向的提交。如果目标分支尚不存在,并且远程仓库允许此次更新,Git 可以创建该分支。服务器规则、权限或钩子可能拒绝语法有效的 refspec,因此不要认为每个新的远程分支都会被接受。此示例使用临时本地裸远程仓库,不会连接托管服务。
为后续推送设置上游分支
上游分支(也称跟踪分支)会记录本地分支跟踪哪个远程分支,以供默认的推送和拉取行为使用。若要在一次操作中推送当前分支并设置其上游,请使用 git push --set-upstream origin feature/login(简写为 git push -u origin feature/login)。这种写法在两端使用相同的分支名。如果远程目标分支使用另一个名称,请通过 refspec 明确指定,例如 git push --set-upstream origin feature/login:develop。
设置上游后,直接运行 git push 会按照 Git 配置的默认推送行为执行。在默认的 push.default=simple 设置下,如果上游分支和本地分支名称不同,例如本地 feature/login 跟踪 origin/develop,Git 可能拒绝直接推送。此时请明确指定 git push origin feature/login:develop。如果希望直接运行 git push,应先配置一种允许上游分支名称不同的推送模式,并了解其行为。使用 git branch -vv 确认跟踪关系;明确写出远程仓库和 refspec,也能让目标一目了然。
安全处理推送被拒绝的情况
推送被拒绝时,应先阅读错误信息并检查仓库状态,不要默认使用强制推送重试。非快进拒绝通常表示远程分支包含本地分支没有的提交。使用 git fetch origin 获取远程更新,再通过 git log --oneline --graph --decorate --all 检查提交记录。根据项目的工作流程,决定是否将相关远程跟踪分支(例如 origin/develop)合并或变基到本地分支。解决冲突、完成合并或变基后,再重试预期的推送。
其他拒绝信息可能表示权限不足、分支受保护、服务器端钩子拒绝操作,或目标分支不符合仓库策略。请针对错误指出的原因采取措施,或联系仓库维护者。除非你了解哪些提交会被替换且已获授权,否则不要使用 git push --force;如果确实需要改写历史记录,--force-with-lease 会增加一项检查,避免覆盖你尚未看到的远程更新,但它仍会改写共享历史。
将所有本地分支推送到远程仓库
git push --all origin 会将所有本地分支推送到指定的远程仓库。它的范围比使用 refspec 推送单个源分支更广,可能会发布与你当前任务无关的工作。只有确实打算发送每个本地分支时才使用它。这并不表示“推送所有标签”;如果确实要推送标签,需要另行使用 git push --tags origin 等命令。
验证推送结果
推送后,使用 git branch -vv 检查本地跟踪信息。若要查看远程公布了哪些分支,请使用 git ls-remote --heads origin develop,并将远程名称和目标分支替换为你实际使用的值。如果本地仓库中的 origin/develop 引用已更新,也可以获取远程信息后,使用 git log --oneline --decorate feature/login origin/develop 比较两个引用。
确认远程名称和目标分支与预期的 refspec 一致。命令成功只表示服务器接受了此次更新,并不能证明拉取请求、部署或任何托管服务工作流程已经完成。