Como faço para forçar um empurrão?

Montei um repo principal remoto e clonei - o para o meu computador. Eu fiz algumas mudanças locais, atualizei meu repositório local, e empurrei as mudanças de volta para o meu repo remoto. As coisas estavam bem até lá.

Tive de mudar alguma coisa no repo remoto. Depois mudei uma coisa no meu relatório local. Percebi que a mudança para o repo remoto não era necessária. Então eu tentei git push de meu repo local para meu repo remoto, mas eu tenho um erro como:

To evitar que você perca a história, as atualizações não-fast-forward foram foi rejeitada a junção das alterações remotas antes de carregar de novo. Ver a nota sobre a secção de fast-forwards de git push --help para mais detalhes.

Pensei que talvez fosse um ...
git push --force

forçaria a minha cópia local a introduzir alterações no remoto e torná-lo-ia igual. ele obriga a atualização , mas quando eu voltar para o remote repo e fazer um commit, eu reparo que os arquivos contêm alterações desatualizadas (aquelas que o principal repo remoto tinha).

Como mencionei nos comentários a uma das respostas:

Tentei forçar, mas ao voltar ao servidor mestre para salvar as mudanças, fiquei desactualizado. Assim, quando comprometo os repositórios não são os mesmos. E quando tento usar o git push novamente, Tenho o mesmo erro.

Como posso resolver este problema?

Author: Community, 2011-04-01

7 answers

Faz apenas:

git push origin <your_branch_name> --force

Ou se tiver um acordo de recompra específico:

git push https://git.... --force

Isto irá apagar o(s) Seu (s) commit (s) anterior (AIS) e carregar no seu (s) commit (s) actual (s).

Pode não ser apropriado, mas se alguém tropeçar nesta página, pensou que poderia querer uma solução simples...

Bandeira curta

Note também que {[3] } é diminutivo de --force, por isso

git push origin <your_branch_name> -f

Também funcionará.

 1800
Author: Katie S, 2017-06-21 13:19:08

E se push --force não funcionar, você pode fazer push --delete. Veja a linha 2nd nesta instância:

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push
Mas cuidado... Nunca mais voltes a uma história pública!

Por outras palavras:

    Nunca empurre para um repositório público. Não faças isto nem nada que possa quebrar a de alguém. Nunca ou nunca na história de um acordo de recompra alguém pode já ter puxado.

De claro que há exceções excepcionalmente raras mesmo para esta regra, mas na maioria dos casos não é necessário fazê-lo e irá gerar problemas para todos os outros.

Em vez disso, reverta.

E tenham sempre cuidado com o que empurram para um repo público. Reverter:

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

Com efeito, ambas as cabeças de origem{[da reverter e da reset do mal ) conterão os mesmos ficheiros.


Editar para adicionar informação actualizada e mais argumentos à volta de push --force

Considere forçar a força com o arrendamento em vez de empurrar, mas ainda prefere reverter

Outro problema que {[[2]} pode trazer é quando alguém empurra qualquer coisa antes de você fazer, mas depois de você já ter ido buscar. Se empurrar force a sua versão rebaseada Agora irá substituir o trabalho de outros .

git push --force-with-lease introduzido no git ([68]) 1.8.5 ( graças a @VonC comment on the question) tries to address this specific issue. Basicamente, ele irá trazer um erro e não empurrar se o remoto foi modificado desde a sua última busca.

Isto é bom se você realmente tem certeza de que um {[[2]} é necessário, mas ainda quer evitar mais problemas. Diria que deve ser o comportamento padrão. Mas ainda está longe de ser uma desculpa para forçar a push. Pessoas que obtidos antes de seu rebase ainda vai ter muitos problemas, que poderiam ser facilmente evitados se você tivesse revertido Sim.

E já que estamos a falar de casos... Porque é que alguém iria querer forçar?

@linquize trouxe um bom exemplo de força de empurrão nos comentários: dados sensíveis . Divulgou dados que não deviam ser pressionados. Se você é rápido o suficiente, você pode "corrigir"* forçando um empurrão para cima.

* Os dados ainda estarão no remoto a menos que você também faça uma recolha de lixo, ou Limpa de alguma forma. Há também o potencial óbvio para que ele seja espalhado por outros que já o conseguiram , mas você tem a idéia.

 203
Author: cregox, 2017-07-24 15:24:25
Em primeiro lugar, não faria quaisquer alterações directamente no Acordo de recompra "principal". Se você realmente quer ter um repo "principal", então você só deve empurrar para ele, nunca mudá-lo diretamente.

Em relação ao erro que você está recebendo, você já tentou {[[0]} de seu repo local, e então git push para o repo principal? O que você está fazendo atualmente (se eu entendi bem) é forçar o empurrão e, em seguida, perder suas mudanças no repo "principal". Você deve juntar as alterações localmente primeiro.

 17
Author: ubik, 2011-04-01 05:42:29

Se estou no meu ramo local a, e quero forçar o ramo local B ao ramo de origem C Posso usar a seguinte sintaxe:

git push --force origin B:C
 13
Author: IcedDante, 2015-05-28 18:25:43

Eu realmente recomendaria a:

  • Empurrar apenas para o repo principal

  • Certifique-se de que o repo principal é um repo, de modo a nunca ter qualquer problema com a árvore de trabalho principal do repo não estar em sincronia com a sua base {[[0]}. Ver " Como enviar um repositório de git local para outro computador?"

  • Se você tiver que fazer modificação no repo principal (bare), cloná-lo( no servidor principal), faça a sua modificação e empurre de volta para it

Por outras palavras, manter um repo acessível tanto a partir do servidor principal como do computador local, a fim de ter um único repo a montante de/para o qual puxar/puxar.
 10
Author: VonC, 2017-05-23 12:02:46
Esta foi a nossa solução para substituir o master num repositório GitHub corporativo, mantendo a história.

push -f dominar repositórios corporativos é muitas vezes desativado para manter o histórico do branch. Esta solução funcionou para nós.

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

Pressione o seu ramo para desiredOrigine crie um PR

 5
Author: mihai, 2016-05-26 21:31:51

Use este seguinte comando:

git push -f origin master
 4
Author: mustafa Elsayed, 2017-04-10 14:00:18