Configurei um repositório "principal" remoto e não clonado e o clonei no meu computador. Fiz algumas alterações locais, atualizei meu repositório local e enviei as alterações de volta ao repositório remoto. As coisas estavam bem até esse ponto.
Agora, tive que mudar alguma coisa no repositório remoto. Então mudei algo no meu repositório local. Percebi que a alteração no repositório remoto não era necessária. Então, tentei git push
do meu repositório local para o meu repositório remoto, mas recebi um erro como:
Para impedir que você perca o histórico, as atualizações de avanço rápido não foram rejeitadas Mesclar as alterações remotas antes de enviar novamente. Consulte a seção "Observação sobre avanço rápido"
git push --help
para obter detalhes.
Eu pensei que provavelmente um
git push --force
forçaria minha cópia local a enviar alterações para a remota e torná-la a mesma. Força a atualização , mas quando eu volto ao repositório remoto e faço uma confirmação, percebo que os arquivos contêm alterações desatualizadas (que o repositório remoto principal tinha anteriormente).
Como mencionei nos comentários a uma das respostas :
[I] tentei forçar, mas, ao voltar ao servidor mestre para salvar as alterações, fico com a preparação desatualizada. Assim, quando eu comprometo os repositórios não são os mesmos. E quando tento usar o git push novamente, recebo o mesmo erro.
Como posso corrigir esse problema?
fonte
git push -force
procedimento com mais cuidado .git push --force
é de fato outra maneira válida de forçar push, e empurrará ramificações da mesma forma quegit push origin master --force
com o padrão do Gitpush.default config settings
, embora quais ramificações forçadas especificamente sejam diferentes das versões do Git antes da versão 2.0 e depois da 2.0.git push --force
funciona bem nos dias de hoje, FWIW ...git push --force-with-lease
funciona ainda melhor :), ele se recusará a atualizar um ramo, a menos que seja o estado que você espera. (consulte developer.atlassian.com/blog/2015/04/force-with-lease )Respostas:
Apenas faça:
ou se você tiver um repositório específico:
Isso excluirá o (s) seu (s) commit (s) anterior (es) e enviará o seu atual.
Pode não ser adequado, mas se alguém deparar com esta página, pensou que poderia querer uma solução simples ...
Bandeira curta
Observe também que
-f
é abreviação de--force
, entãotambém irá funcionar.
fonte
git push origin +master
vez disso, você pode usar , o que permite enviar vários refspecs sem forçar todos eles.git push --force
, você pode acabar atrapalhando você branch master (dependendo do seu comportamento padrão push) .. Que pode chupar .. um pouco ..: Dgit push --force
é basicamente forçar o envio da ramificação atualmente em check-out para a parte do contador remoto; portanto, se você tiver a ramificação principal em check-out, será idênticagit push origin master --force
. Será diferente se você estiver usando amatching
configuração parapush.default
, que é o padrão para as versões do Git anteriores à 2.0.matching
empurra todos os habitantes locais ramos para as remotas que têm o mesmo nome, então força empurrando, então definitivamente poderia não ser o que você quer fazer ...git push origin master --force
é.merge -s ours
funcionou para mimE se
push --force
não funcionar, você pode fazerpush --delete
. Olhe para 2 nd linha nesta instância:Mas cuidado...
Nunca mais volte para uma história pública de git!
Em outras palavras:
force
force um repositório público.pull
.reset
ou arewrite
história em um repo alguém já pode ter puxado.É claro que existem exceções excepcionalmente raras até mesmo para essa regra, mas na maioria dos casos não é necessário fazer isso e isso gerará problemas para todos os outros.
Faça uma reversão.
E sempre tenha cuidado com o que você envia a um repositório público . Revertendo:
Com efeito, os dois HEADs de origem (da reversão e da reinicialização incorreta ) conterão os mesmos arquivos.
edite para adicionar informações atualizadas e mais argumentos
push --force
Considere empurrar força com concessão em vez de empurrar, mas ainda prefere reverter
Outro problema
push --force
pode trazer é quando alguém pressiona alguma coisa antes de você, mas depois que você já buscou. Se você pressionar forçar sua versão rebaseada agora, substituirá o trabalho de outras pessoas .git push --force-with-lease
introduzido no git 1.8.5 ( graças ao comentário do @VonC sobre a pergunta) tenta resolver esse problema específico. Basicamente, ele trará um erro e não será enviado se o controle remoto tiver sido modificado desde a última busca.Isso é bom se você realmente tem certeza de que
push --force
é necessário, mas ainda deseja evitar mais problemas. Eu diria que deveria ser opush --force
comportamento padrão . Mas ainda está longe de ser uma desculpa para forçar apush
. As pessoas que buscaram antes da sua recuperação ainda terão muitos problemas, que poderiam ser facilmente evitados se você revertesse .E já que estamos falando de
git --push
instâncias ...Por que alguém iria querer forçar a pressão?
O @linquize trouxe um bom exemplo de força de pressão nos comentários: dados confidenciais . Você vazou erroneamente dados que não devem ser enviados. Se você for rápido o suficiente, poderá "consertá-
*
lo " forçando um empurrão no topo.*
Os dados ainda estarão no controle remoto, a menos que você também faça uma coleta de lixo ou limpe-a de alguma forma . Há também o potencial óbvio de que ele seja espalhado por outras pessoas que já o buscaram , mas você entendeu.fonte
git push origin master --delete # do a very very bad bad thing git push origin master # regular push
isso realmente resolveu meu problema perfeitamente (em um repositório apenas comigo e com meu amigo). talvez seja errado para compromissos públicos, mas para um privado isso salva vidas.Primeiro de tudo, eu não faria nenhuma alteração diretamente no repositório "principal". Se você realmente deseja ter um repositório "principal", deve empurrá-lo apenas, nunca alterá-lo diretamente.
Com relação ao erro que você está recebendo, você tentou
git pull
no repositório local e depoisgit push
no repositório principal? O que você está fazendo no momento (se eu entendi bem) é forçar o empurrão e depois perder as alterações no repositório "principal". Você deve mesclar as alterações localmente primeiro.fonte
git push -f
, use , mas se você alterar seu repositório principal novamente, precisará voltar ao repositório local egit pull
, para que fique sincronizado com as alterações mais recentes. Então você pode fazer seu trabalho e pressionar novamente. Se você seguir esse fluxo de trabalho "push-pull", não receberá o tipo de erro que estava reclamando.Se eu estiver no meu ramo local A e desejar forçar o envio do ramo local B para o IC do ramo de origem, use a seguinte sintaxe:
fonte
git push --force origin B:C
. No meu caso, parece que issogit push --force origin C
passará apenas do mestre local para o ramo C remoto, independentemente de qual ramo eu esteja atualmente.git version 2.3.8 (Apple Git-58)
use este comando a seguir:
fonte
-f
bandeira ...Eu realmente recomendo:
enviar apenas para o repositório principal
verifique se o repositório principal é um repositório simples , para nunca ter nenhum problema com a árvore de trabalho do repositório principal não estar sincronizada com sua
.git
base. Consulte " Como enviar um repositório git local para outro computador? "Se você precisar fazer uma modificação no repositório principal (vazio), clone-o (no servidor principal), faça sua modificação e retorne a ele
Em outras palavras, mantenha um repositório simples acessível a partir do servidor principal e do computador local, a fim de ter um único repositório upstream do / para o qual extrair / extrair.
fonte
Esta foi a nossa solução para substituir o mestre em um repositório corporativo do gitHub, mantendo o histórico.
push -f
dominar repositórios corporativos geralmente é desativado para manter o histórico da filial. Esta solução funcionou para nós.empurre sua filial
desiredOrigin
e crie um PRfonte
Eu tinha a mesma pergunta, mas finalmente entendi. O que você provavelmente precisa fazer é executar os dois comandos git a seguir (substituindo o hash pelo número de revisão de confirmação git):
fonte