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 <remote>, junto com todos os commits e objetos internos necessários, criando uma ramificação local no repositório de destino. Para evitar que você sobrescreva commits, o Git não permite o envio quando ele resultar em um merge sem avanço rápido no repositório de destino.

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.

Como usar o git push para publicar modificações

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.