Acho que essa pergunta foi feita muitas vezes, mas a solução normalmente é "Excluí o diretório e refiz meu trabalho com uma nova verificação." Fiz um commit e push, mas percebi que me referi ao número do ticket errado na mensagem de commit. Procurei uma solução rápida no SO e acabei digitando o seguinte no terminal:
$ git reset --soft HEAD^
$ git commit -m "... correct message ..."
O único problema é que estou recebendo a seguinte mensagem de erro:
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
Estou usando o modelo git-flow e trabalhando no branch de desenvolvimento. Como posso mesclar as coisas de volta para deixar o git feliz novamente?
git
version-control
rynmrtn
fonte
fonte
Respostas:
Força
git push
:fonte
receive.denyNonFastForwards
na resposta de Brian Campbell :+
ou--force
pode não ser suficientemente forte, dependendo de como eles - quem quer que sejam - configuraram seu repositório Git.Se você empurrar um commit para o servidor, e depois reescrever que cometem localmente (com
git reset
,git rebase
,git filter-branch
ou qualquer outra manipulação história) e, em seguida, empurrou o reescrito cometer volta para o servidor, você vai estragar qualquer outra pessoa que tinha puxado. Aqui está um exemplo; digamos que você tenha confirmado A e enviado para o servidor.Agora você decide reescrever A, da maneira que você mencionou, redefinindo e confirmando. Observe que isso deixa um commit pendente, A, que eventualmente será coletado como lixo, pois não está acessível.
Se outra pessoa, digamos Fred, puxar para baixo
master
do servidor enquanto você estiver fazendo isso, eles terão uma referência a A, a partir da qual eles podem começar a trabalhar:Agora, se você pudesse empurrar seu A 'para origin / master, o que criaria um avanço não rápido, ele não teria A em seu histórico. Então, se Fred tentasse puxar novamente, ele de repente teria que fundir e reintroduziria o commit A:
Se Fred perceber isso, ele poderia fazer um rebase, o que evitaria que o commit A reaparecesse. Mas ele teria que perceber isso e se lembrar de fazer isso; e se você tiver mais de uma pessoa que puxou A para baixo, todos eles teriam que rebase para evitar o commit extra de A na árvore.
Portanto, geralmente não é uma boa ideia alterar o histórico em um repo que outras pessoas usam. Se, no entanto, você souber que ninguém mais está puxando desse repo (por exemplo, é o seu próprio repo privado ou você só tem um outro desenvolvedor trabalhando no projeto com quem você pode coordenar facilmente), então você pode forçar atualizar executando:
ou
Ambos irão ignorar a verificação de um push não acelerado e atualizar o que está no servidor para sua nova revisão A ', abandonando a revisão A para que eventualmente seja coletada como lixo.
É possível que os push push sejam totalmente desativados com a
receive.denyNonFastForwards
opção config. Esta opção é habilitada por padrão em repositórios compartilhados. Nesse caso, se você realmente quiser forçar um push, a melhor opção é excluir o branch e recriá-lo comgit push origin :master; git push origin master:master
. No entanto, adenyNonFastForwards
opção está habilitada por um motivo, que é descrito acima; em um repositório compartilhado, isso significa que agora todos os que o usam precisam garantir que eles sejam realocados no novo histórico.Em um repositório compartilhado, geralmente é melhor apenas enviar novos commits para corrigir qualquer problema que você tenha; você pode usar
git revert
para gerar commits que irão desfazer as mudanças dos commits anteriores.fonte
+develop
o comando dele - então o cheque vai para ele. Você tem um número astronômico de pontos de qualquer maneira: Pgit push --force
receive.denyNonFastForwards
opção de configuração. Esta opção é habilitada por padrão em repositórios compartilhados. Nesse caso, se você realmente quiser forçar um push, a melhor opção é excluir o branch e recriá-lo comgit push origin :remote_A; git push origin local_A:remote_A
. Mas leia o que escrevi acima sobre por que não é uma boa ideia fazer esse tipo de fluxo de trabalho em um repositório compartilhado. Você só deve tentar fazer isso se tiver algo que cause problemas sérios no commit do qual está tentando se livrar ou reescrever.Você pode ter que fazer um
git pull
, que PODE mesclar coisas automaticamente para você. Então você pode se comprometer novamente. Se você tiver conflitos, ele solicitará que você os resolva.Lembre-se de que você deve especificar de qual branch extrair se não tiver atualizado seu gitconfig para especificar ...
Por exemplo:
fonte
! [rejected] develop -> develop (non-fast-forward)
git push origin develop
)Eu estava usando o EGit e também enfrentei esse problema. Apenas tentei
rebase
o ramo atual e funcionou.fonte