# 推送提交到远程仓库

使用 git push 将本地分支上的提交推送到远程存储库。

## 关于 `git push`

`git push` 命令采用两个参数：

* 远程名称（例如 `origin`）
* 分支名称（例如 `main`）

例如：

```shell
git push REMOTE-NAME BRANCH-NAME
```

假设您通常运行 `git push origin main` 来推送本地更改到您的联机存储库。

## 重命名分支

若要重命名分支，同样使用 `git push` 命令，但要加上一个或多个参数：新分支的名称。 例如：

```shell
git push REMOTE-NAME LOCAL-BRANCH-NAME:REMOTE-BRANCH-NAME
```

这会将`LOCAL-BRANCH-NAME`推送到`REMOTE-NAME`，但会重命名为`REMOTE-BRANCH-NAME`。

## 处理“非快进”错误

如果存储库的本地副本未同步或“落后于”你推送到的上游存储库，你会收到一条消息：`non-fast-forward updates were rejected`。
这意味着必须检索或“提取”上游更改，然后才可推送本地更改。

有关此错误的详细信息，请参阅 [处理非快进错误](/zh/enterprise-server@3.22/get-started/using-git/dealing-with-non-fast-forward-errors)。

## 推送标记

默认情况下，没有其他参数时，`git push` 会发送所有名称与远程分支相同的匹配分支。

要推送单个标签，可以使用与推送分支相同的命令：

```shell
git push REMOTE-NAME TAG-NAME
```

要推送所有标签，可以输入以下命令：

```shell
git push REMOTE-NAME --tags
```

## 删除远程分支或标记

删除分支的语法初看有点神秘：

```shell
git push REMOTE-NAME :BRANCH-NAME
```

请注意，冒号前有一个空格。 命令与重命名分支的步骤类似。 但这里是指示 Git \_不要将任何内容\_推送到 `BRANCH-NAME` 上的 `REMOTE-NAME`。 因此，`git push` 会删除远程存储库上的分支。

## 远程和复刻

你可能已经知道，[你可以在GitHub上“派生”存储库](https://guides.github.com/overviews/forking/)。

在克隆拥有的存储库时，向其提供远程 URL，指示 Git 到何处提取和推送更新。 如果要协作处理原始存储库，可将新的远程 URL（通常称为 `upstream`）添加到本地 Git 克隆：

```shell
git remote add upstream THEIR_REMOTE_URL
```

现在，您可以从\_他们的\_ fork 中获取更新和分支：

```shell
git fetch upstream
# Grab the upstream remote's branches
> remote: Counting objects: 75, done.
> remote: Compressing objects: 100% (53/53), done.
> remote: Total 62 (delta 27), reused 44 (delta 9)
> Unpacking objects: 100% (62/62), done.
> From https://HOSTNAME/OCTOCAT/REPO
>  * [new branch]      main     -> upstream/main
```

完成本地更改后，可以将本地分支推送到 GitHub，[初始化拉取请求](/zh/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)。

有关使用派生的更多信息，请参阅 [同步分支](/zh/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork)。

## 其他阅读材料

* [《Pro Git》一书中的“远程”章节](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)
* [
  `git remote` 主页](https://git-scm.com/docs/git-remote.html)
* [Git 备忘清单](/zh/enterprise-server@3.22/get-started/git-basics/git-cheatsheet)
* [Git 工作流](/zh/enterprise-server@3.22/get-started/git-basics/git-workflows)
* [Git 手册](https://guides.github.com/introduction/git-handbook/)