Git push
O comando git push
é usado para enviar conteúdo do repositório local para um repositório remoto. "Push" é como os commits do repositório local são enviados a um repositório remoto. É a contraparte para git fetch
: buscar (fetch) importa commits para ramificações locais, e push exporta commits para ramificações remotas. As ramificações remotas são configuradas usando o comando git remote
. O comando push tem o potencial de sobrescrever modificações e, assim, deve ser usado com cuidado. Esses itens são discutidos abaixo.
Utilização do git push
git push <remote> <branch>
Envie a ramificação especificada para
git push <remote> --force
Igual ao comando anterior, mas força a transmissão push mesmo que resulte em um merge sem avanço rápido. Não use o sinalizador --force
a menos que tenha absoluta certeza do que está fazendo.
git push <remote> --all
Transmite todas as ramificações locais para o remoto especificado.
git push <remote> --tags
As etiquetas não são enviadas automaticamente quando se faz o push de uma ramificação ou se usa a opção --all
. O sinalizador --tags
envia todas as etiquetas locais para o repositório remoto.
Discussão sobre o git push
O comando git push
é mais usado para publicar modificações locais a um repositório central. Após um repositório local ter sido modificado, um comando push é executado para compartilhar as modificações com membros da equipe remota.
O diagrama acima mostra o que acontece quando o mestre
local progrede mais que o mestre
do repositório central e você publica modificações executando o comando git push origin master
. Observe como o git push
é quase a mesma coisa que executar o git merge master
dentro do repositório remoto.
Git push e sincronização
O git push
é um componente dentre muitos usados no processo geral de "sincronização" Git. Os comandos de sincronização operam em ramificações remotas que são configuradas usando o comando git remote
. O git push
pode ser considerado um comando de "upload", enquanto git fetch
e git pull
podem ser considerados comandos de "download". Assim que os conjuntos de alterações tiverem sido transferidos por meio de um download ou upload, um git merge
pode ser realizado no destino para integrar as modificações.
Comando push para repositórios vazios
Uma prática Git frequente e moderna é ter um repositório --bare
hospedado remotamente agindo como repositório de origem central. Esse repositório de origem é, em geral, hospedado fora do local em um host externo confiável como o Bitbucket. Como o comando push interfere com a estrutura de ramificações remotas, é mais seguro e comum fazer o push para repositórios criados com o sinalizador --bare
. Os repositórios vazios não têm um diretório de trabalho, então o comando push não vai alterar nenhum conteúdo do diretório de trabalho em andamento. Para obter mais informações sobre a criação de repositórios vazios, leia sobre o git init
.
Forçar push
O Git evita que você sobrescreva o histórico do repositório central recusando solicitações push quando elas resultam em um merge sem avanço rápido. Assim, se o histórico remoto for diferente do seu, você precisa fazer o pull da ramificação remota e o merge com a ramificação local e, em seguida, tentar fazer o push de novo. É um processo semelhante ao do SVN para sincronizar com o repositório central via svn update
antes de fazer o commit de um conjunto de alterações.
O sinalizador --force
substitui esse comportamento e faz com que a ramificação do repositório remoto corresponda ao repositório local, excluindo qualquer modificação na cadeia produtiva que possa ter ocorrido desde a última vez que você usou o comando pull. O único momento em que você talvez precise forçar um push é quando perceber que os commits que acabou de compartilhar não estavam muito corretos e foram corrigidos com um git commit --amend
ou com rebase interativo. No entanto, é preciso ter certeza absoluta de que nenhum de seus colegas de equipe fez o pull desses commits antes de usar a opção --force
.
Exemplos
Git push padrão
O exemplo a seguir descreve um dos métodos padrão para publicar contribuições locais no repositório central. Primeiro, assegure que seu mestre local está atualizado buscando a cópia do repositório central e fazendo o rebase das modificações por cima dela. O rebase interativo é também uma boa oportunidade de limpar os commits antes de compartilhar. Em seguida, o comando git push
envia todos os commits em seu mestre local para o repositório central.
git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master
Como já nos certificamos que o mestre local estava atualizado, o resultado deve ser um merge de avanço rápido e o git push
não deve reclamar de nenhum dos itens sem avanço rápido discutidos acima.
Push forçado corrigido
O comando git commit
aceita uma opção --amend
que vai atualizar o commit anterior. Normalmente, um commit é corrigido para atualizar a mensagem de commit ou adicionar novas modificações. Assim que o commit é corrigido, o comando git push
não vai funcionar porque o Git vai enxergar o commit corrigido e o commit remoto como conteúdo divergente. A opção --force
deve ser usada para enviar um commit corrigido.
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master
O exemplo acima pressupõe que está sendo executado em um repositório existente com um histórico de commits. O git commit --amend
é usado para atualizar o commit anterior e, sem seguida, fazer o push forçado usando a opção --force
.
Exclusão de uma ramificação ou etiqueta remota
Às vezes, as ramificações precisam ser apagadas por motivos organizacionais ou de registro. Para excluir toda uma ramificação, ela deve ser excluída local e remotamente.
git branch -D branch_name
git push origin :branch_name
O comando acima vai excluir a ramificação remota chamada branch_name. Inserir um nome de ramificação prefixada com dois pontos no comando git push
exclui a ramificação remota.