W3docs

git push

Nesta página você encontra informações sobre o comando git push, sua sintaxe, as opções mais comuns e dicas importantes sobre ele.

Esta página explica o que o git push faz, a sintaxe e as opções mais úteis, como o envio funciona em repositórios bare e non-bare, como definir um branch upstream, como forçar um push com segurança e como deletar um branch remoto. Os exemplos utilizam comandos e saídas Git reais para que você possa acompanhar.

Definição

O comando git push envia commits do seu repositório local para um repositório remoto. O push é o oposto do fetch: enquanto o git fetch importa commits para seus branches de rastreamento locais, o git push exporta seus commits locais para os branches remotos para que os colaboradores possam vê-los.

A sintaxe básica é:

git push <remote> <branch>

<remote> é o nome do repositório remoto (mais comumente origin), e <branch> é o branch local cujos commits você deseja publicar.

Uso do git push

O comando git push é comumente usado para publicar alterações locais em um repositório central. Após confirmar as alterações localmente, você executa git push para compartilhá-las com o restante da equipe. É um dos comandos envolvidos no fluxo de trabalho de sincronização. Esses comandos operam nos branches remotos configurados com o comando git remote: os commits são enviados com git push e baixados com git fetch e git pull. Após o download, o git merge integra as alterações ao seu branch de trabalho.

Um push bem-sucedido imprime um resumo do que foi transferido. Por exemplo, enviar dois novos commits para master tem esta aparência:

$ git push origin master
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Writing objects: 100% (6/6), 612 bytes | 612.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:example/repo.git
   a1b2c3d..e4f5g6h  master -> master

A linha a1b2c3d..e4f5g6h master -> master confirma quais commits foram movidos e que seu master local agora corresponde ao master remoto.

O diagrama a seguir mostra a progressão do master local além do master do repositório central, e a publicação dessas alterações ao invocar git push origin master.

git push

Opções comuns

git push <remote> <branch>Envia o branch especificado para <remote> com os commits necessários, criando um branch remoto no repositório de destino.
git push <remote> --forceForça o push mesmo que resulte em uma atualização non-fast-forward. Certifique-se de que ninguém tenha feito pull dos commits antes de usar a opção --force.
git push <remote> --allEnvia todos os branches locais para o repositório remoto.
git push <remote> --tagsEnvia as tags dos branches locais para o repositório remoto. A opção --all não envia as tags.
git push -u <remote> <branch>Envia o branch e o registra como o branch upstream (de rastreamento), para que futuros git push e git pull possam ser executados sem argumentos.
git push <remote> --force-with-leaseForça o push somente se o branch remoto não foi alterado desde seu último fetch — uma alternativa mais segura ao --force.
git push <remote> --dry-runMostra o que seria enviado sem enviar nada ao repositório remoto.

Como fazer push para repositórios bare

Um repositório bare é aquele criado com a flag --bare (git init --bare ou git clone --bare). Ele não possui diretório de trabalho, portanto ninguém pode editar arquivos ou fazer commits diretamente nele. Isso o torna seguro para receber pushes, razão pela qual repositórios centrais/compartilhados (hospedados em um servidor ou serviço como GitHub) são bare. Fazer push para um repositório non-bare cujo branch de trabalho está com checkout pode conflitar com a árvore de trabalho desse branch, por isso o Git recusa esses pushes por padrão.

# create a shared central repository
git init --bare central.git

O que acontece quando um push é rejeitado

O Git recusa seu push quando o branch remoto contém commits que você não possui localmente — uma atualização non-fast-forward. Isso geralmente significa que um colega de equipe fez push antes. O erro tem esta aparência:

$ git push origin master
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'github.com:example/repo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.

A solução é incorporar o trabalho remoto primeiro e depois fazer push novamente:

git pull origin master   # fetch + merge (or use --rebase)
git push origin master

Use --force apenas quando você deliberadamente quiser sobrescrever o histórico remoto (veja abaixo) — não para contornar essa verificação de segurança em branches compartilhados.

Force push

A flag --force sobrescreve o branch remoto com o seu local, descartando quaisquer commits upstream que não foram baixados. Use-a apenas quando você intencionalmente reescreveu o histórico — por exemplo, após git commit --amend ou um git rebase interativo — e tem certeza de que mais ninguém construiu sobre os commits que está substituindo. Quando um commit é alterado ou rebaseado, seu hash muda, então o Git o trata e o commit remoto como conteúdo divergido e rejeita um push normal; --force é necessário para publicar o commit reescrito.

Para branches compartilhados, prefira --force-with-lease (abordado abaixo): ele recusa sobrescrever o trabalho que o remoto recebeu após seu último fetch, evitando que você destrua silenciosamente os commits de um colega.

git push --force

# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master

Como deletar um branch remoto

Aqui está um exemplo de como deletar o branch remoto. O branch_name prefixado com dois pontos no git push irá deletar o branch remoto:

delete remote branch, git push

git branch -D branch_name
git push origin :branch_name

O comando git push origin :branch_name deleta o branch especificado (branch_name) do repositório remoto (origin) ao enviar uma referência vazia para ele.

Como funciona

  1. git push: envia alterações do seu repositório Git local para um repositório remoto
  2. origin: o nome do repositório remoto
  3. :branch_name: um refspec que representa uma referência vazia, efetivamente deletando o branch especificado do repositório remoto

Portanto, quando você executa git push origin :branch_name, o Git irá deletar o branch branch_name do repositório remoto origin.

Observe que esse comando pode ser perigoso se usado incorretamente, pois irá deletar o branch sem nenhuma confirmação ou possibilidade de recuperação. Certifique-se de verificar duas vezes o nome do branch e de que realmente deseja deletá-lo antes de executar o comando.

Use a flag -u no primeiro push de um branch

Quando você tem um branch local e deseja enviá-lo ao repositório remoto pela primeira vez, deve especificar qual branch do repositório remoto você deseja usar. No Git, a flag -u é usada com o comando git push para definir o branch upstream para o branch atual. Ao usar a flag -u, o Git criará um vínculo entre seu branch local e o branch remoto. Esse vínculo é útil para simplificar os comandos git pull e git push no futuro, pois permite que o Git lembre qual branch remoto corresponde ao seu branch local.

A flag -u é uma abreviação de --set-upstream. Ao usar essa flag, você normalmente a verá usada assim:

Use a flag -u no primeiro push de um branch

git push -u origin your-branch-name

Após isso, seu branch local rastreia origin/your-branch-name. A partir daí, você pode executar git push e git pull sem argumentos extras enquanto estiver nesse branch, e o git status informará o quanto você está à frente ou atrás do remoto. Consulte git branch para mais informações sobre branches locais e de rastreamento remoto.

Exemplos de flags mais usadas

Aqui estão exemplos rápidos das flags mais úteis do git push.

-f (force)

git push -f origin master

Força o push do branch master local para origin, sobrescrevendo quaisquer commits no master remoto que você não possui localmente. -f é a forma curta de --force. Use com cuidado — pode apagar commits que outras pessoas enviaram se estiverem trabalhando no mesmo branch.

--tags

git push origin --tags

Envia todas as suas tags locais para origin. As tags marcam pontos importantes no histórico, como lançamentos ou marcos. Um git push normal não transfere tags, então essa flag (ou enviar uma tag específica com git push origin <tagname>) é como você as publica. Consulte git tag para mais informações sobre como criar tags.

--all

git push origin --all

Envia todos os branches locais para origin em um único comando. Observe que --all não inclui tags — combine-o com um push separado de --tags se precisar de ambos.

--dry-run

git push --dry-run origin master

Simula o push e reporta o que seria enviado, sem transferir nada. Útil para confirmar exatamente quais commits e refs um push irá atualizar antes de executá-lo de verdade.

--force-with-lease

git push --force-with-lease origin master

Força o push de master para origin somente se o branch remoto ainda apontar para onde estava na última vez que você fez fetch. Se alguém tiver feito push enquanto isso, o comando aborta em vez de sobrescrever o trabalho dessa pessoa. Esta é a alternativa mais segura ao -f/--force.

Prática

Prática
Quais afirmações são verdadeiras sobre o comando 'git push'?
Quais afirmações são verdadeiras sobre o comando 'git push'?
Was this page helpful?