Como faço para forçar um empurrão?
git push
de meu repo local para meu repo remoto, mas eu tenho um erro como:
Pensei que talvez fosse um ...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.
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?
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á.
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.
@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.
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.
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
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
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 desiredOrigin
e crie um PR
Use este seguinte comando:
git push -f origin master