O comando git push
é usado para carregar conteúdo de repositório local para um repositório remoto. Pushing é a forma como se transferem os commits do seu repositório local para um repositório remoto. É a contrapartida de git fetch
, mas enquanto que fetching imports commits to local branches, empurrando exportações commits to remote branches. Os ramos remotos são configurados usando o comando git remote
. O empurrar tem o potencial de sobrescrever alterações, deve-se ter cuidado ao empurrar. Estas questões são discutidas abaixo.
Utilização de Git push
git push <remote> <branch>
empurrar o ramo especificado para , juntamente com todos os commits necessários e objectos internos. Isto cria uma sucursal local no repositório de destino. Para evitar que se sobrescreva os commits, Git não o deixa empurrar quando resulta numa fusão não rápida no repositório de destino.
git push <remote> --force
O mesmo que o comando acima, mas força o empurrão mesmo que resulte numa fusão não rápida. Não utilize o comando --force
bandeira, a menos que tenha a certeza absoluta de saber o que está a fazer.
git push <remote> --all
Empurre todas as suas sucursais locais para o comando especificado.
git push <remote> --tags
Tags não são automaticamente empurradas quando empurra um ramo ou usa a opção --all
. A bandeira --tags
envia todas as suas tags locais para o repositório remoto.
Git push discussion
git push
é mais comumente usada para publicar um upload de alterações locais para um repositório central. Depois de um repositório local ter sido modificado, um push é executado para partilhar as modificações com membros da equipa remota.
O diagrama acima mostra o que acontece quando o seu master
local tiver passado pelo repositório central master
e publicar alterações executando git push origin master
. Note como git push
é essencialmente o mesmo que correr git merge master
de dentro do repositório remoto.
Git push and syncing
git push
é um componente de muitos utilizados no processo global de “sincronização” de Git. Os comandos de sincronização operam em ramos remotos que são configurados usando o comando git remote
git push
pode ser considerado e comando ‘upload’ enquanto que, git fetch
e git pull
pode ser pensado como comandos de ‘download’. Uma vez que os conjuntos de alterações tenham sido movidos através de um download ou upload de um git merge
podem ser executados no destino para integrar as alterações.
Pushing to bare repositories
Uma prática frequentemente utilizada, a prática moderna de Git é ter um hospedeiro remoto --bare
repositório actuar como um repositório central de origem. Este repositório de origem é frequentemente alojado fora do local com uma terceira parte de confiança como Bitbucket. Desde que se empurram os problemas com a estrutura do ramo remoto, é mais seguro e mais comum empurrar para repositórios que foram criados com o --bare
bandeira. Os repositórios nus não têm um directório de trabalho, pelo que um empurrão não alterará nenhum conteúdo de directório de trabalho em progresso. Para mais informações sobre a criação de repositório nua, leia sobre git init
.
Force Pushing
Git impede que se substitua o histórico do repositório central, recusando pedidos push quando estes resultam numa fusão não rápida. Assim, se o histórico remoto tiver divergido do teu histórico, precisas de puxar o ramo remoto e fundi-lo no teu local, depois tenta empurrar novamente. Isto é semelhante a como o SVN o faz sincronizar com o repositório central através de svn update
antes de submeter um conjunto de alterações.
The --force
flag anula este comportamento e faz com que o ramo do repositório remoto coincida com o seu local, apagando quaisquer alterações a montante que possam ter ocorrido desde a última vez que o puxou. A única altura em que deve forçar o push é quando se apercebe que os compromissos que acabou de partilhar não estavam correctos e os fixa com um git commit --amend
ou um rebase interactivo. Contudo, deve ter a certeza absoluta de que nenhum dos seus colegas de equipa puxou esses commits antes de usar o --force
option.
Default git push
O exemplo seguinte descreve um dos métodos padrão para publicar contribuições locais para o repositório central. Primeiro, assegura-se de que o seu mestre local está actualizado, indo buscar a cópia do repositório central e rebaseando as suas alterações por cima delas. A rebase interactiva é também uma boa oportunidade para limpar os teus compromissos antes de os partilhares. Depois, o comando git push
envia todos os commits do teu master 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
Desde que já nos tenhamos certificado de que o master local estava actualizado, isto deverá resultar numa fusão rápida, e git push
não deverá queixar-se de nenhuma das questões não urgentes discutidas acima.
Força de impulso alterada
O comando git commit
aceita uma opção --amend
que actualizará o compromisso anterior. Um commit é frequentemente alterado para actualizar a mensagem de commit ou adicionar novas alterações. Assim que uma submissão é emendada, uma git push
falhará porque Git verá a submissão emendada e a submissão remota como conteúdo divergente. A opção --force
deve ser utilizada para empurrar uma submissão emendada.
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master
O exemplo acima assume que está a ser executado num repositório existente com um histórico de submissão. git commit --amend
é utilizado para actualizar a submissão anterior. A submissão corrigida é então forçada usando o --force
option.
Apagar uma sucursal remota ou tag
Algumas vezes as sucursais precisam de ser limpas para fins de manutenção de livros ou organizacionais. A eliminação total de um ramo, deve ser eliminada localmente e também remotamente.
git branch -D branch_name
git push origin :branch_name
O acima mencionado eliminará o ramo remoto chamado branch_name passando o nome de um ramo prefixado com dois pontos para git push
eliminará o ramo remoto.