# Enviar commits para um repositório remoto

Use git push para fazer push de commits de seu branch local para um repositório remoto.

## Sobre o `git push`

O comando `git push` usa dois argumentos:

* Um nome remoto, por exemplo, `origin`
* Um nome de branch, por exemplo, `main`

Por exemplo:

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

Por exemplo, você geralmente executa `git push origin main` para realizar o push das alterações locais para o repositório online.

## Renomear branches

Para renomear um branch, use o mesmo comando `git push`, mas adicione mais um argumento: o nome do novo branch. Por exemplo:

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

Isso envia o `LOCAL-BRANCH-NAME` para o `REMOTE-NAME`, mas ele é renomeado para `REMOTE-BRANCH-NAME`.

## Lidar com erros "non-fast-forward"

Se a cópia local de um repositório estiver fora de sincronia ou "atrasado" em relação ao repositório upstream do qual você está efetuando push, você receberá a mensagem `non-fast-forward updates were rejected`.
Isso significa que você precisa recuperar ou "buscar" as alterações upstream antes de conseguir efetuar push das alterações locais.

Para saber mais sobre esse erro, confira [Lidar com erros non-fast-forward](/pt/enterprise-server@3.22/get-started/using-git/dealing-with-non-fast-forward-errors).

## Fazer push de tags

Por padrão, e sem parâmetros adicionais, `git push` envia todas as ramificações correspondentes que têm os mesmos nomes das ramificações remotas.

Para enviar uma única tag, você pode usar o mesmo comando usado para enviar um branch:

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

Para fazer push de todas as suas tags, digite o comando:

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

## Excluir uma tag ou branch remote

À primeira vista, a sintaxe para excluir um branch é um pouco enigmática:

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

Observe que há um espaço antes dos dois pontos. O comando se parece com as mesmas etapas que você usará para renomear um branch. No entanto, aqui, você está informando o Git para não efetuar push de *nada* para `BRANCH-NAME` no `REMOTE-NAME`. Por isso, `git push` exclui a ramificação no repositório remoto.

## Remotes e bifurcações

Talvez você já saiba que [você pode "forkar" repositórios](https://guides.github.com/overviews/forking/) no GitHub.

Ao clonar um repositório de sua propriedade, você fornece uma URL remota que informa ao Git o local em que ele deve efetuar fetch e push das atualizações. Caso deseje colaborar com o repositório original, adicione uma nova URL remota, normalmente chamada `upstream`, ao clone do Git local:

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

Agora, você pode buscar as atualizações e os branches do fork *deles*:

```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
```

Quando terminar de fazer alterações locais, você pode enviar por push sua ramificação local para GitHub e [iniciar uma solicitação de pull](/pt/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests).

Para saber mais sobre como trabalhar com forks, confira [Sincronizar um fork](/pt/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork).

## Leitura adicional

* [O capítulo "Remotes" do livro "Pro Git"](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)
* [
  `git remote` Página principal](https://git-scm.com/docs/git-remote.html)
* [Guia rápido do Git](/pt/enterprise-server@3.22/get-started/git-basics/git-cheatsheet)
* [Fluxos de trabalho do Git](/pt/enterprise-server@3.22/get-started/git-basics/git-workflows)
* [Manual do Git](https://guides.github.com/introduction/git-handbook/)