Como posso enviar um commit fixo para um repositório Git remoto?

Quando fiz algum trabalho sobre o código-fonte, fiz o que costumava fazer e depois clicava no repositório remoto. Mas então percebi que esqueci de organizar a importação no código-fonte. Portanto, estou fazendo um comando change para substituir o commit anterior:

 > git commit --amend 

Infelizmente, o commit não pode ser retornado ao repositório. É rejeitado da seguinte forma:

 > git push origin To //my.remote.repo.com/stuff.git/ ! [rejected] master -> master (non-fast forward) error: failed to push some refs to '//my.remote.repo.com/stuff.git/' 

O que devo fazer? (Eu posso acessar o repositório remoto.)

475
31 окт. Spoike set 31 de outubro 2008-10-31 13:23 '08 at 1:23 pm 2008-10-31 13:23
@ 13 respostas

Na verdade, eu cliquei uma vez no repositório --force e .git e recebi uma maldição da Linus BIG TIME . Em geral, isso criará muitos problemas para outras pessoas. A resposta simples é: "Não faça isso".

Eu vejo outros dando uma receita para isso, então eu não vou repeti-los aqui. Mas aqui vai uma dica para se recuperar da situação depois que você empurrou a correção corrigida com --force (ou + master).

  • Encontre o antigo commit que você contribuiu para ele (chame de old , e vamos selecionar o novo comando que você criou alterando o new ).
  • Crie uma mesclagem entre o old e o new escrevendo uma new árvore, por exemplo, git checkout new git merge -s ours old .
  • Combine isso com o seu mestre usando o git merge master
  • Atualize seu assistente com o resultado do git push . HEAD:master git push . HEAD:master
  • Imprima o resultado.

Então pessoas que não tiveram sucesso o suficiente para basear seu trabalho na fixação que você destruiu, corrigindo e forçando o empurrão (que você é um menino muito ruim ), verá o resultado da fusão e verá que você está usando o new longo do tempo. As suas fusões subseqüentes não verão os conflitos entre o old e o new , que surgiram como resultado das mudanças, portanto eles não precisam sofrer.

371
11 янв. a resposta é dada por gitster 11 jan. 2009-01-11 10:36 '09 às 10:36 2009-01-11 10:36

Você vê o recurso de segurança do Git. O Git se recusa a atualizar uma ramificação remota de uma ramificação porque o seu cabeçalho não é um descendente direto da fixação atual do cabeçalho da ramificação na qual você clica.

Se não fosse esse o caso, então duas pessoas que estavam empurrando o mesmo repositório ao mesmo tempo não saberiam que um novo commit ocorreu ao mesmo tempo, e aquele que empurrou o último teria perdido o emprego. empurrador anterior sem que nenhum deles soubesse disso.

Se você sabe que é a única pessoa que clicou e deseja pressionar a correção fixa ou pressionar a correção que vetou a ramificação, você pode "forçar" o Git a atualizar a ramificação remota com a opção -f .

 git push -f origin master 

Mesmo isso pode não funcionar, já que o Git permite que repositórios remotos desistam de cliques rápidos na extremidade remota usando a receive.denynonfastforwards configuração receive.denynonfastforwards . Se este for o caso, o motivo da rejeição será semelhante a este (observe a parte "falha remota"):

border=0
  ! [remote rejected] master -> master (non-fast forward) 

Para contornar isso, você precisa alterar a configuração do repositório remoto ou, como uma invasão, pode excluir e recriar a ramificação da seguinte maneira:

 git push origin :master git push origin master 

Em geral, o último parâmetro do git push usa o formato <local_ref>:<remote_ref> , onde local_ref é o nome da ramificação no repositório local e remote_ref é o nome da ramificação no repositório remoto. Este par de comandos usa duas abreviações. :master é nulo local_ref, o que significa a imposição de um ramo zero no lado remoto do master , ou seja, a exclusão de um ramo remoto. Nome da ramificação sem : significa que a ramificação local com o nome especificado é redirecionada para a ramificação remota com o mesmo nome. master nesta situação é curto para master:master .

218
01 нояб. Resposta dada por Charles Bailey 01 de novembro. 2008-11-01 00:58 '08 às 0:58 am 2008-11-01 00:58

Discurso rápido: o fato de ninguém ter postado uma resposta simples demonstra a hostilidade desesperada do usuário, manifestada com o Git CLI.

Em qualquer caso, a maneira "óbvia" de fazer isso, supondo que você não tentou forçar um push, é puxá-lo primeiro. Isso levará à mudança que você fez nela (e, portanto, não está mais lá) para que apareça novamente.

Assim que você resolver algum conflito, você poderá clicar novamente.

Então:

 git pull 

Se você receber erros no pull, talvez algo esteja errado com sua configuração de repositório local (eu tive um ref inválido na seção .git / config).

E depois

 git push 

Você pode receber uma fixação adicional com o assunto da "Mesclagem Trivial".

184
22 сент. Resposta dada por Tim Band 22 de set 2009-09-22 13:46 '09 às 13:46 2009-09-22 13:46

A resposta curta é: não pressione as correções corrigidas no repositório público.

Resposta longa: vários comandos do Git, como git commit --amend e git rebase , reescrevem o histórico. Tudo bem, até que você publique suas alterações, mas uma vez que você fizer isso, você realmente não deve ser enganado pela história, porque se alguém já tiver recebido suas mudanças, quando elas tentarem puxá-las para fora novamente, em vez de fazer mudanças Em um commit, você deve apenas fazer um novo commit com mudanças.

No entanto, se você realmente quiser pressionar uma mensagem corrigida, você pode fazer assim:

 $ git push origin +master:master 

O sinal de + principal o forçará a pressionar, mesmo que não leve a uma fixação de "avanço rápido". (O avanço rápido ocorre quando as alterações nas quais você clica são descendentes diretos das alterações que já estão no repositório público.)

86
31 окт. a resposta é dada por mipadi em 31 de outubro 2008-10-31 17:35 '08 às 17:35 2008-10-31 17:35

Aqui está uma maneira fácil e limpa de fazer suas alterações depois de ter feito o commit --amend :

 git reset --soft HEAD^ git stash git push -f origin master git stash pop git commit -a git push origin master 

O que faz o seguinte:

  • Redefina as ramificações dos ramos para o pai.
  • Clique no último commit.
  • Forçado pressionando o controle remoto. Agora o computador remoto não tem o último commit.
  • Entre na sua carteira.
  • Leia limpo.
  • Clique no controle remoto.

Não se esqueça de alterar a "origem" e "mestre", se você aplicar isso a outra filial ou dispositivo remoto.

20
21 июня '15 в 17:41 2015-06-21 17:41 a resposta é dada Faiza 21 de junho de '15 às 17:41 2015-06-21 17:41

Eu resolvi isso descartando a correção local e adicionando novas alterações do topo:

 # Rewind to commit before conflicting git reset --soft HEAD~1 # Pull the remote version git pull # Add the new commit on top git add ... git commit git push 
16
24 сент. A resposta é dada bara 24 de setembro 2012-09-24 18:46 '12 em 6:46 PM 2012-09-24 18:46

Eu tive o mesmo problema.

  • A última correção que já foi pressionada foi ajustada aleatoriamente.
  • Muitas alterações feitas localmente, feitas cinco vezes
  • Tentei clicar, obter um erro, pânico, mesclar o acesso remoto, obter um monte de não-meus arquivos, clicado, falhou, etc.

Como um git-newbie, achei que foi concluído por FUBAR .

A decisão. Um pouco diferente, como a @bara sugeriu + criar um ramo de backup local

 # Rewind to commit just before the pushed-and-amended one. # Replace <hash> with the needed hash. # --soft means: leave all the changes there, so nothing is lost. git reset --soft <hash> # Create new branch, just for a backup, still having all changes in it. # The branch was feature/1234, new one - feature/1234-gone-bad git checkout -b feature/1234-gone-bad # Commit all the changes (all the mess) not to lose it  not to carry around git commit -a -m "feature/1234 backup" # Switch back to the original branch git checkout feature/1234 # Pull the from remote (named 'origin'), thus 'repairing' our main problem git pull origin/feature/1234 # Now you have a clean-and-non-diverged branch and a backup of the local changes. # Check the needed files from the backup branch git checkout feature/1234-gone-bad -- the/path/to/file.php 

Talvez esta não seja uma decisão rápida e limpa, e eu perdi minha história (1 commit ao invés de 5), mas ele manteve seu trabalho diário.

7
20 февр. A resposta é dada davisca 20 de fevereiro 2014-02-20 13:24 '14 às 13:24 2014-02-20 13:24

Se você sabe que ninguém retirou sua correção sem modificação, use a opção git push --force-with-lease git push .

No TortoiseGit, você pode fazer o mesmo nas configurações "Push ..." "Force: May discard" e checar por "mudanças conhecidas".

Force (pode rejeitar alterações conhecidas) permite que o repositório remoto tenha uma transição mais segura e não rápida. Isso pode fazer com que o repositório remoto perca seu commit; use-o com cautela. Isso pode impedir que você perca alterações desconhecidas de outras pessoas no controle remoto. Ele verifica se a ramificação do servidor aponta para a mesma fixação que a ramificação de rastreamento remoto (alterações conhecidas). Se assim for, a energia será pressionada. Caso contrário, será rejeitado. Como o git não possui tags com rastreamento remoto, as tags não podem ser sobrescritas com essa opção.

3
07 июня '16 в 3:03 2016-06-07 03:03 a resposta é dada por ShawnFeatherly em junho 07 '16 em 3:03 2016-06-07 03:03

Aqui está uma maneira fácil e limpa de fazer alterações depois de ter feito o git add "your files" e git commit --amend :

 git push origin master -f 

ou

 git push origin master --force 
2
18 янв. A resposta é dada por Marwen Bkh 18 jan. 2016-01-18 11:29 '16 às 11:29 2016-01-18 11:29

Se você não pressionou o código na ramificação remota (GitHub / Bitbucket), você pode alterar a mensagem de confirmação na linha de comando, como mostrado abaixo.

  git commit --amend -m "Your new message" 

Se você estiver trabalhando em uma ramificação específica, faça o seguinte:

 git commit --amend -m "BRANCH-NAME: new message" 

Se você já clicou no código com a mensagem errada, você precisa ter cuidado ao alterar a mensagem. depois de alterar a mensagem de confirmação e tentar pressioná-la novamente, você terá problemas. Para facilitar, siga estas etapas.

Por favor, leia a resposta completa antes de fazer isso.

 git commit --amend -m "BRANCH-NAME : your new message" git push -f origin BRANCH-NAME # Not a best practice. Read below why? 

Nota importante: Quando você pressiona push, pode encontrar problemas de código nos quais outros desenvolvedores estão trabalhando na mesma ramificação. Portanto, para evitar esses conflitos, você precisa extrair o código de sua ramificação antes de pressionar a força :

  git commit --amend -m "BRANCH-NAME : your new message" git pull origin BRANCH-NAME git push -f origin BRANCH-NAME 

Essa é uma prática recomendada ao alterar uma mensagem de confirmação, se já tiver sido pressionada.

2
13 янв. A resposta é dada por Packer Jan 13 2015-01-13 10:20 '15 às 10:20 2015-01-13 10:20

Você obtém esse erro porque o Git remote já possui esses arquivos de confirmação. Você deve clicar com força em uma ramificação para que isso funcione:

 git push -f origin branch_name 

Além disso, certifique-se de retirar o código do controle remoto, já que alguém da sua equipe pode mudar para um ramo.

 git pull origin branch_name 

Este é um dos casos em que precisamos forçar uma correção para um remoto.

1
21 янв. a resposta é dada por Praveen Dhawan 21 de janeiro 2016-01-21 09:35 '16 às 9:35 2016-01-21 09:35

Eu tive que corrigir esse problema, puxando de um repositório remoto e resolver os conflitos de mesclagem que surgiram, corrigir e, em seguida, clique em OK. Mas sinto que há um caminho melhor.

1
31 окт. a resposta é dada Spoike Out. 31. 2008-10-31 14:39 '08 at 2:39 pm 2008-10-31 14:39

Eu apenas continuei fazendo o que Git me disse. Então:

  • Não é possível clicar devido a uma correção.
  • Eu tento como eu esperava.
  • Erro de mesclagem então eu corrijo manualmente.
  • Crie um novo commit (marcado como "merge") e clique nele.
  • Parece que funciona!

Nota A fixação modificada foi a última.

1
02 дек. A resposta é dada Rolf 02 dez. 2016-12-02 19:29 '16 às 19:29 2016-12-02 19:29

Outras questões sobre ou fazem uma pergunta