# Pushing commits to a remote repository

Use git push to push commits made on your local branch to a remote repository.

## About `git push`

The `git push` command takes two arguments:

* A remote name, for example, `origin`
* A branch name, for example, `main`

For example:

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

As an example, you usually run `git push origin main` to push your local changes
to your online repository.

## Renaming branches

To rename a branch, you'd use the same `git push` command, but you would add
one more argument: the name of the new branch. For example:

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

This pushes the `LOCAL-BRANCH-NAME` to your `REMOTE-NAME`, but it is renamed to `REMOTE-BRANCH-NAME`.

## Dealing with "non-fast-forward" errors

If your local copy of a repository is out of sync with, or "behind," the upstream
repository you're pushing to, you'll get a message saying `non-fast-forward updates were rejected`.
This means that you must retrieve, or "fetch," the upstream changes, before
you are able to push your local changes.

For more information on this error, see [Dealing with non-fast-forward errors](/en/enterprise-server@3.22/get-started/using-git/dealing-with-non-fast-forward-errors).

## Pushing tags

By default, and without additional parameters, `git push` sends all matching branches
that have the same names as remote branches.

To push a single tag, you can issue the same command as pushing a branch:

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

To push all your tags, you can type the command:

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

## Deleting a remote branch or tag

The syntax to delete a branch is a bit arcane at first glance:

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

Note that there is a space before the colon. The command resembles the same steps
you'd take to rename a branch. However, here, you're telling Git to push *nothing*
into `BRANCH-NAME` on `REMOTE-NAME`. Because of this, `git push` deletes the branch
on the remote repository.

## Remotes and forks

You might already know that [you can "fork" repositories](https://guides.github.com/overviews/forking/) on GitHub.

When you clone a repository you own, you provide it with a remote URL that tells
Git where to fetch and push updates. If you want to collaborate with the original
repository, you'd add a new remote URL, typically called `upstream`, to
your local Git clone:

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

Now, you can fetch updates and branches from *their* 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
```

When you're done making local changes, you can push your local branch to GitHub
and [initiate a pull request](/en/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests).

For more information on working with forks, see [Syncing a fork](/en/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork).

## Further reading

* [The "Remotes" chapter from the "Pro Git" book](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)
* [`git remote` main page](https://git-scm.com/docs/git-remote.html)
* [Git cheatsheet](/en/enterprise-server@3.22/get-started/git-basics/git-cheatsheet)
* [Git workflows](/en/enterprise-server@3.22/get-started/git-basics/git-workflows)
* [Git Handbook](https://guides.github.com/introduction/git-handbook/)