git push
Atualizar refs remotas junto com os objetos associados
O comando 'git push' envia o conteúdo do repositório local para um repositório remoto. Ele transfere commits e atualizações de branches (e tags, quando você pede com --tags ou --follow-tags) do seu repositório local para um remoto, deixando as suas mudanças disponíveis para os outros. O push é como você compartilha o trabalho - depois de fazer commit localmente, você envia para sincronizar com a equipe. Por padrão (push.default=simple), git push só atualiza a branch upstream da branch atual, que precisa existir e ter o mesmo nome, e só se for um fast-forward (ou seja, se a branch remota for ancestral da sua branch local).
Sinopse
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [-f | --force] [-d | --delete] [--prune] [-q | --quiet] [-v | --verbose] [-u | --set-upstream] [-o <string>] [--force-with-lease[=<refname>[:<expect>]] [--force-if-includes]] [--no-verify] [<repository> [<refspec>...]]Opções
Escolhendo a opção certa
A escada de segurança do force push
Quando precisar sobrescrever o histórico remoto, escolha a opção mais segura que sirva para a sua situação
| Comando | Nível de risco | Confere o remoto | Quando falha | Caso de uso |
|---|---|---|---|---|
git push | Seguro | ✓ Só fast-forward | Se o remoto tiver commits novos | Fluxo diário normal |
git push --force-with-lease --force-if-includes | O force mais seguro | ✓ Ponta remota no histórico local | Se você não integrou as mudanças remotas | Depois de rebase quando outros podem ter enviado |
git push --force-with-lease | Force mais seguro | ✓ Remoto sem mudanças desde o fetch | Se o remoto mudou desde o último fetch | Depois de rebase em branch pessoal |
git push --force | Perigoso | ✗ Sobrescreve às cegas | Nunca (a não ser que o servidor recuse) | Só quando tiver certeza, ou em branch só sua |
O que é enviado
Controlar o alcance do que você envia para o remoto
| Comando | Envia | Inclui tags | Uso típico |
|---|---|---|---|
git push origin main | Uma branch | ✗ | Enviar uma branch específica |
git push -u origin branch | Uma branch + configura rastreamento | ✗ | Primeiro push de uma branch nova |
git push --all | Todas as branches | ✗ | Sincronizar todas as branches locais |
git push --tags | Só tags (sem branches) | ✓ Todas as tags | Enviar tags de versão |
git push --follow-tags | Branch atual | ✓ Só as anotadas alcançáveis | Enviar com as tags de release relevantes |
git push --mirror | Tudo | ✓ Tudo | Clone exato no remoto (exclui refs que só existem no remoto) |
Saída e retorno
Ajustar o nível de detalhe e o formato da saída à sua necessidade
| Comando | Nível de saída | Mostra progresso | Legível por máquina | Ideal para |
|---|---|---|---|---|
git push | Padrão | Só no terminal | ✗ | Uso interativo normal |
git push --verbose | Detalhado | ✓ | ✗ | Depurar problemas de push |
git push --quiet | Só erros | ✗ | ✗ | Scripts, pipelines de CI |
git push --progress | Padrão + progresso forçado | ✓ Sempre | ✗ | Scripts que precisam do progresso nos logs |
git push --porcelain | Estruturado | ✗ | ✓ Separado por tabulações | Interpretar resultados do push em scripts |
Segurança e verificação
Verificações antes do push e opções de conferência
| Comando | Roda hooks | Verifica | Cria commit | Quando usar |
|---|---|---|---|---|
git push | ✓ pre-push | O remoto aceita | N/A | Fluxo normal |
git push --dry-run | ✓ pre-push | O que aconteceria | ✗ Só pré-visualização | Antes de pushes importantes |
git push --atomic | ✓ | Todas as refs ou nenhuma | Tudo ou nada | Enviar várias branches juntas |
git push --no-verify | ✗ Pula o pre-push local (hooks do servidor ainda rodam) | O remoto aceita | N/A | Emergência quando os hooks bloqueiam você |
git push --signed | ✓ | Assinatura GPG | Assinado criptograficamente | Repositórios de alta segurança, provar identidade |
Gerenciamento de remotos e branches
Opções para gerenciar refs remotas e relações entre branches
| Comando | Ação | Afeta o remoto | Caso de uso |
|---|---|---|---|
git push -u origin branch | Push + definir upstream | Adiciona branch | Primeiro push, configura rastreamento |
git push origin --delete branch | Excluir branch remota | Remove branch | Limpar branches mescladas |
git push --prune | Excluir branches remotas que você excluiu localmente (precisa de --all ou de um refspec curinga) | Remove branches | Levar as exclusões ao remoto |
git push --repo=<url> | Enviar para um remoto específico | Remoto de destino | Enviar para outra URL remota |
Exemplos de fluxos de trabalho
git remote add origin https://github.com/user/repo.gitAdicionar a URL do repositório remoto
git push -u origin mainEnviar a branch main e fazer ela rastrear origin/main
git statusConferir se está na branch certa e se há commits para enviar
git pushEnviar para a branch upstream rastreada
git checkout featureTrocar para a sua branch de funcionalidade
git rebase mainRebase sobre a main (reescreve o histórico de commits)
git push --force-with-leaseForçar o push com segurança - falha se outra pessoa enviou algo
git checkout -b feature/new-loginCriar a branch nova e trocar para ela
git add . && git commit -m "Add new login"Fazer as mudanças e o commit
git push -u origin feature/new-loginEnviar e configurar o rastreamento do upstream
git push origin --delete feature/old-branchExcluir a branch remota
git branch -d feature/old-branchExcluir também a branch local
git push --all originEnviar todas as branches de refs/heads/
git push --tags originOpcionalmente, enviar também todas as tags
Solução de problemas
! [rejected] main -> main (fetch first) / (non-fast-forward)
Causa: A branch remota tem commits que a sua branch local não tem. Outra pessoa enviou mudanças, ou você fez rebase/amend de commits que já tinham sido enviados.
Puxe antes as mudanças remotas com 'git pull --rebase' ou 'git pull --no-rebase', resolva eventuais conflitos e envie de novo. Só force (de preferência com '--force-with-lease') se tiver certeza de que ninguém mais usa a branch.
git pull --rebase && git pushgit@github.com: Permission denied (publickey)
Causa: A autenticação SSH falhou: nenhuma chave está carregada, ou a sua chave pública não foi adicionada à sua conta. (Falta de permissão de escrita mostra outro erro, “Permission to ... denied”.)
Confira se a sua chave SSH foi adicionada à conta do GitHub/GitLab. Teste com 'ssh -T git@github.com'. Com HTTPS, garanta que está usando as credenciais certas.
ssh -T git@github.comfatal: No configured push destination
Causa: O repositório não tem nenhum remoto configurado. (Se existe um remoto, mas a branch não tem upstream, aparece “The current branch ... has no upstream branch”.)
Adicione um remoto com 'git remote add origin <url>' e depois envie definindo o upstream com 'git push -u origin <branch>'.
git push -u origin mainYour branch is behind 'origin/main'
Causa: A branch remota tem commits mais novos do que a sua branch local. Você precisa integrar essas mudanças antes de enviar.
Busque as mudanças remotas e faça merge ou rebase delas na sua branch local antes de enviar.
git pull origin main && git pushrefusing to update checked out branch
Causa: Você está tentando enviar para um repositório não bare em que essa branch está em checkout. Isso poderia deixar o diretório de trabalho dele inconsistente.
Envie para um repositório bare, ou peça que o receptor faça checkout de outra branch antes. Isso costuma acontecer em servidores próprios, não no GitHub/GitLab.
git config receive.denyCurrentBranch updateInsteaderror: failed to push some refs to '<remote-url>'
Causa: Erro genérico com várias causas possíveis: atualizações non-fast-forward, falhas de hooks ou problemas de permissão. Confira a mensagem de erro detalhada acima desta linha.
Leia a saída de erro inteira. Normalmente é um problema de non-fast-forward (faça pull antes) ou uma falha do hook pre-push (corrija o que o hook aponta).
git pull --rebase && git pushO hook pre-push falhou
Causa: Um hook pre-push (testes, lint etc.) encontrou problemas e bloqueou o push.
Corrija os problemas apontados pelo hook. Só pule com '--no-verify' se for absolutamente necessário e você entender as consequências.
git push --no-verifyremote: Repository not found
Causa: A URL do repositório está errada, o repositório foi excluído ou renomeado, ou você não tem acesso a ele.
Confira a URL do repositório com 'git remote -v'. Verifique se o repositório existe e se você tem acesso. Atualize a URL se precisar.
git remote set-url origin https://github.com/user/correct-repo.gitDicas e armadilhas
Boas práticas
- ✓Sempre faça pull antes do push: rode 'git pull' (ou 'git fetch' seguido de merge ou rebase) antes de enviar, para ter as mudanças remotas mais recentes e evitar pushes rejeitados.
- ✓Use --force-with-lease em vez de --force: se precisar forçar, o --force-with-lease é mais seguro porque falha se outra pessoa enviou para o remoto desde o seu último fetch (adicione --force-if-includes para mais segurança).
- ✓Defina o upstream no primeiro push: use 'git push -u origin branch-name' ao enviar uma branch nova para configurar o rastreamento. Depois basta 'git push'.
- ✓Nunca force push em branches compartilhadas: forçar na main, master ou develop pode destruir o trabalho dos outros. Use commits de revert em vez de reescrever o histórico.
- ✓Use regras de proteção de branch: configure o repositório para impedir force push em branches importantes e exigir revisão de pull requests.
- ✓Envie com frequência para ter backup do trabalho: pushes regulares das branches de funcionalidade servem de backup e mostram o seu progresso.
- ✓Confira antes de enviar: use 'git push --dry-run' para ver o que seria enviado sem enviar nada. Ótimo para conferir duas vezes.
- ✓Limpe as branches remotas: exclua as branches de funcionalidade mescladas com 'git push origin --delete branch-name' para manter o remoto arrumado.
- ✓Use pushes atômicos para mudanças relacionadas: ao enviar várias branches que dependem umas das outras, use '--atomic' para garantir que todas passem ou nenhuma.
- ✓Assine pushes importantes: em repositórios críticos, use '--signed' para assinar os pushes com GPG e permitir a verificação (o servidor precisa aceitar pushes assinados, senão o push falha).
Erros comuns
- ✗Fazer push sem pull antes: se o remoto tiver commits novos, o seu push será rejeitado. Sempre rode 'git pull' (ou fetch, depois merge/rebase) primeiro para incorporar as mudanças remotas.
- ✗Usar --force em branches compartilhadas: forçar reescreve o histórico e pode destruir o trabalho dos outros. Use --force-with-lease ou, melhor ainda, evite totalmente force push em branches compartilhadas.
- ✗Esquecer de definir o upstream com -u: no primeiro push de uma branch nova, use 'git push -u origin branch-name' para configurar o rastreamento. Senão, você vai precisar indicar remoto e branch toda vez.
- ✗Enviar para a branch errada: confira a branch atual com 'git branch' antes do push. Use uma sintaxe explícita como 'git push origin feature:feature' para garantir.
- ✗Não entender pushes rejeitados: erros de 'non-fast-forward' significam que o remoto tem commits que você não tem localmente. Faça pull e merge/rebase antes de enviar - não simplesmente force.
Perguntas frequentes
'git push' envia os seus commits locais para um repositório remoto, deixando as suas mudanças disponíveis para os outros. 'git pull' baixa commits de um remoto e os mescla na sua branch local. O push manda dados para fora; o pull traz dados para dentro.
Não dá para realmente “desfazer” um push, porque ele já é histórico compartilhado. Para reverter com segurança, use 'git revert HEAD' para criar um commit novo que desfaz as mudanças e envie de novo. Evite 'git reset' + force push em branches compartilhadas, pois isso reescreve um histórico que outros talvez já tenham puxado.
A opção -u cria uma relação de rastreamento entre a sua branch local e a branch remota. Depois de 'git push -u origin feature', você pode usar só 'git push' e 'git pull', sem indicar o remoto e a branch toda vez.
O force push (--force) só deve ser usado em branches em que só você contribui, como branches de funcionalidade pessoais depois de um rebase. Nunca force em branches compartilhadas como main ou develop. Se for mesmo preciso, use --force-with-lease por segurança.
Use a sintaxe de refspec: 'git push origin local-branch:remote-branch'. Por exemplo, 'git push origin feature:experiment' envia a sua branch local 'feature' para uma branch remota chamada 'experiment'.
Normalmente porque o remoto tem commits que você não tem localmente (non-fast-forward). Rode 'git pull' para buscar e mesclar essas mudanças, resolva eventuais conflitos e envie de novo. Não force, a menos que tenha certeza de que é seguro.
Use 'git push --all origin' para enviar todas as branches locais para o remoto. As tags precisam de outro comando, porque '--all' e '--tags' não podem ser combinados: 'git push --tags origin'.
'--force' sobrescreve a branch remota às cegas, seja qual for o estado dela. '--force-with-lease' só sobrescreve se o remoto não mudou desde o seu último fetch - falha se outra pessoa enviou algo, protegendo o trabalho dela. Atenção: um fetch (até o fetch em segundo plano de uma IDE) atualiza essa verificação, então adicione --force-if-includes para exigir também que você tenha integrado o que buscou.
Use 'git push origin --delete branch-name' ou a forma curta 'git push origin :branch-name'. As duas removem a branch do repositório remoto.
O 'git push' simples só funciona se a branch atual tiver uma branch upstream configurada. Para branches novas, você precisa antes de 'git push -u origin branch-name'. Confira as relações de rastreamento com 'git branch -vv'.