Artigo original: Git Push to Remote Branch – How to Push a Local Branch to Origin
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).