Artigo original escrito por John Mosesman
Artigo original: Git Push to Remote Branch – How to Push a Local Branch to Origin
Traduzido e adaptado por Gabriel Lima

O comando básico para enviar um push de uma branch local para um repositório remoto é o git push.

Esse comando tem uma variedade de opções e parâmetros que podem ser passados a ele. Neste artigo, você aprenderá aqueles que você mais usará no dia a dia.

Como fazer o push de uma branch local para a branch origin

Se você executar o comando git push, o Git por padrão escolherá dois parâmetros a mais para você: o repositório remoto para realizar o push e a branch do push.

A forma genérica do comando é esta:

$ git push <remote> <branch>

Por padrão, o Git escolhe a origin como repositório remoto e sua branch atual como a branch para o push.

Se a sua branch atual é a main, o comando git push vai completar os outros dois parâmetros pré-definidos – executando, efetivamente, git push origin main.

No exemplo abaixo, origin  é um repositório remoto no GitHub. A branch atual é a main:

(main)$ git remote -v 
origin  git@github.com:johnmosesman/burner-repo.git (fetch)
origin  git@github.com:johnmosesman/burner-repo.git (push)

(main)$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
   b7f661f..ab77dd6  main -> main

Na saída da execução, você verá que a branch local main foi enviada para a branch remota main:

To github.com:johnmosesman/burner-repo.git
   b7f661f..ab77dd6  main -> main

Como forçar o push de uma branch no Git

Normalmente, você realizará um push para uma branch e essa ação será adicionada ao seu histórico de commits.

Existem, no entanto, situações em que você precisará sobrescrever de forma forçada o histórico de uma branch.

Existem alguns motivos para você precisar fazer isso.

O primeiro motivo é consertar um erro – apesar de que, provavelmente, seria melhor apenas fazer um novo commit, revertendo as mudanças.

O segundo motivo é um cenário mais comum. Após uma ação do tipo rebase (texto em inglês) que altera o histórico de commits:

Internamente, o Git realiza [um rebase] criando novos commits e aplicando-os à base especificada. É muito importante entender que, apesar de a branch parecer a mesma, ela é composta de commits inteiramente novos.

O rebase cria commits inteiramente novos.

Isso significa que, se você tentar fazer o push de uma branch que sofreu rebase localmente – nas que não se encontra na branch remota – o repositório remoto vai reconhecer que o histórico de commits foi alterado e vai evitar que você faça o push enquanto não resolver as diferenças:

(my-feature)$ git push
To github.com:johnmosesman/burner-repo.git
 ! [rejected]        my-feature -> my-feature (non-fast-forward)
error: failed to push some refs to 'git@github.com:johnmosesman/burner-repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Você poderia usar o comando git pull para fazer o merge das diferenças, mas se realmente quiser sobrescrever o repositório remoto, você pode adicionar a flag --force no seu comando push:

(my-feature)$ git push --force origin my-feature
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 184 bytes | 184.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
 + edb64e2...52f54da my-feature -> my-feature (forced update)

Observação: você pode usar apenas -f ao invés de --force, para abreviar.

Um push forçado é uma ação destrutiva – use-a somente quando tiver certeza de que é isso mesmo que você quer fazer.

Force push com lease

Talvez você queira fazer um force push – mas só se ninguém tiver contribuído para a branch.

Se mais alguém contribuiu para sua branch e se tiver feito um push para o repositório remoto – e se você fizer um force push – você vai sobrescrever todas as mudanças que foram feitas por outros.

Para prevenir esse tipo de problema, você pode usar a opção --force-with-lease.

Novamente, pela documentação:

--force-with-lease sozinho, sem especificar os detalhes, protegerá todas as refs remotas que serão atualizadas, exigindo que o seu valor atual seja o mesmo que o da branch monitorada remotamente que temos para elas.

Basicamente, você está dizendo ao Git para forçar a atualização dessa branch apenas se ela for exatamente igual ao que era da última vez que você a viu.

Se você estiver colaborando com outras pessoas na sua branch, é recomendado não usar a flag --force ou, ao menos, usar a opção --force-with-lease para prevenir a perda de mudanças que outros colaboradores tenham feito.

Como fazer um push para uma branch com um nome diferente no Git

Você normalmente fará o push da sua branch local para uma branch remota com o mesmo nome – mas nem sempre.

Para fazer um push para uma branch com o nome diferente, você vai precisar especificar a branch da qual você deseja fazer o push e a branch para qual você fará o push, separadas por dois-pontos (:).

Por exemplo, se você quer fazer um push de uma branch chamada some-branch para outra chamada my-feature:

(some-branch)$ git push origin some-branch:my-feature
Total 0 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
 + 728f0df...8bf04ea some-branch -> my-feature

Como fazer um push de todas as branches locais para um repositório remoto

Você não precisa fazer um push de todas as suas branches locais sempre, mas, se precisar, pode adicionar a flag --all:

(main)$ git branch
* main
  my-feature

(main)$ git push --all
...
To github.com:johnmosesman/burner-repo.git
   b7f661f..6e36148  main -> main
 * [new branch]      my-feature -> my-feature

Conclusão:

O comando git push é um dos comandos que você mais usará. Existem várias opções que podem ser usadas com ele. Recomendo fortemente que você leia a documentação para encontrar outras opções úteis e atalhos.

Se você gostou desse tutorial, o autor também fala sobre tópicos desse tipo no Twitter, além de escrever mais sobre o assunto no seu site (em inglês).