Quando trabalhei um pouco com meu código-fonte, fiz o que de costume eu fazia e depois fui para um repositório remoto. Mas então notei que esqueci de organizar minhas importações no código fonte. Então, eu faço o comando de alteração para substituir a confirmação anterior:
> git commit --amend
Infelizmente, o commit não pode ser enviado de volta ao repositório. É rejeitado assim:
> 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.)
git
git-commit
amend
Spoike
fonte
fonte
git push -force
procedimento com mais cuidado .Respostas:
Eu na verdade, uma vez empurrado com
--force
e.git
repositório e tenho repreendido por Linus BIG TIME . Em geral, isso criará muitos problemas para outras pessoas. Uma resposta simples é "Não faça".Vejo que outros deram a receita de qualquer maneira, então não os repetirei aqui. Mas aqui está uma dica para se recuperar da situação depois de enviar o commit corrigido com --force (ou + master).
git reflog
para encontrar o antigo commit que você alterou (chame-oold
, e chamaremos o novo commit que você criou alterandonew
).old
enew
, gravando a árvore denew
, comogit checkout new && git merge -s ours old
.git merge master
git push . HEAD:master
Então, as pessoas que estavam a infelicidade de ter baseado o seu trabalho sobre a cometer você obliterado por que altera e forçando um empurrão verá a fusão resultante vai ver que você é a favor
new
maisold
. Suas fusões posteriores não verão os conflitos entreold
enew
que resultaram da sua alteração, portanto, eles não precisam sofrer.fonte
git reflog
para encontrá-loVocê está vendo um recurso de segurança do Git. O Git se recusa a atualizar a ramificação remota com sua ramificação, porque a confirmação principal da ramificação não é um descendente direto da confirmação principal atual da ramificação na qual você está enviando.
Se não fosse esse o caso, duas pessoas que enviariam para o mesmo repositório mais ou menos na mesma hora não saberiam que havia um novo commit entrando ao mesmo tempo e quem empurrou por último perderia o trabalho do empurrador anterior sem nenhum dos dois. eles percebendo isso.
Se você sabe que é a única pessoa que pressiona e deseja enviar por push uma confirmação ou push que confirme a ramificação, você pode 'forçar' o Git a atualizar a ramificação remota usando o
-f
switch.Mesmo isso pode não funcionar, pois o Git permite que repositórios remotos recusem push não avançados no extremo remoto usando a variável de configuração
receive.denynonfastforwards
. Se for esse o caso, o motivo da rejeição será semelhante a este (observe a parte 'rejeitada remotamente'):Para contornar isso, é necessário alterar a configuração do repositório remoto ou, como um hack sujo, você pode excluir e recriar a ramificação da seguinte maneira:
Em geral, o último parâmetro a
git push
usar o formato<local_ref>:<remote_ref>
, ondelocal_ref
é o nome da ramificação no repositório local eremote_ref
é o nome da ramificação no repositório remoto. Este par de comandos usa duas atalhos.:master
possui um local_ref nulo, o que significa enviar uma ramificação nula para o lado remotomaster
, ou seja, excluir a ramificação remota. Um nome de filial sem:
meios significa enviar a filial local com o nome fornecido para a filial remota com o mesmo nome.master
nesta situação é a abreviação demaster:master
.fonte
git gc
vez os reflogs expiram, os objetos antigos serão podados. Ninguém que clona o repositório obterá objetos que não são mais acessíveis assim que a ramificação for atualizada.Discurso rápido: O fato de ninguém postar a resposta simples aqui demonstra a desesperada hostilidade do usuário exibida pela CLI do Git.
De qualquer forma, a maneira "óbvia" de fazer isso, supondo que você não tenha tentado forçar o empurrão, é puxar primeiro. Isso puxa a alteração que você alterou (e não tem mais) para que você a tenha novamente.
Depois de resolver qualquer conflito, você pode enviar novamente.
Assim:
Se você receber erros no pull, talvez algo esteja errado na configuração do seu repositório local (eu tive uma referência errada na seção .git / config branch).
E depois
Talvez você receba um commit extra com o assunto falando sobre uma "mesclagem trivial".
fonte
git push -f
ougit reset
é o único caminho a percorrer aqui.Resposta curta: não envie confirmações alteradas para um repositório público.
Resposta longa: Alguns comandos do Git, como
git commit --amend
egit rebase
, na verdade, reescrevem o gráfico do histórico. Tudo bem, desde que você não tenha publicado suas alterações, mas, uma vez publicado, você realmente não deve estar mexendo com o histórico, porque se alguém já recebeu suas alterações, então, quando elas tentarem novamente, isso poderá falhar . Em vez de alterar uma confirmação, você deve apenas fazer uma nova confirmação com as alterações.No entanto, se você realmente deseja enviar por push uma confirmação alterada, pode fazer o seguinte:
O
+
sinal principal forçará a ocorrência do envio, mesmo que não resulte em uma confirmação "avanço rápido". (Uma confirmação de avanço rápido ocorre quando as alterações que você está enviando são descendentes diretos das alterações já existentes no repositório público.)fonte
git push -f
.Aqui está uma maneira muito simples e limpa de enviar suas alterações depois que você já fez
commit --amend
:O que faz o seguinte:
Lembre-se de alterar "origem" e "mestre" se aplicá-lo a uma ramificação ou controle remoto diferente.
fonte
git add
antes do meu commit para incluir as alterações.git reset --soft "HEAD^"
. O resto funciona bem.Eu o resolvi descartando meu commit alterado local e adicionando as novas alterações na parte superior:
fonte
Eu tive o mesmo problema.
Como novato no Git, pensei que fosse o FUBAR completo .
Solução: algo como o @bara sugeriu + criou uma ramificação de backup local
Talvez não seja uma solução rápida e limpa, e perdi minha história (1 commit em vez de 5), mas economizou um dia de trabalho.
fonte
Se você não enviou o código para sua ramificação remota (GitHub / Bitbucket), você pode alterar a mensagem de confirmação na linha de comando, como abaixo.
Se você estiver trabalhando em uma ramificação específica, faça o seguinte:
Se você já inseriu o código com uma mensagem errada, precisa ter cuidado ao alterar a mensagem. ou seja, depois de alterar a mensagem de confirmação e tentar enviá-la novamente, você acaba tendo problemas. Para facilitar, siga os seguintes passos.
Leia a resposta completa antes de fazê-lo
Nota importante: Ao usar o push forçado diretamente, você pode acabar com problemas de código nos quais outros desenvolvedores estão trabalhando no mesmo ramo. Portanto, para evitar esses conflitos, você precisa extrair o código do seu ramo antes de fazer a força forçar :
Essa é a melhor prática ao alterar a mensagem de confirmação, se já tiver sido enviada.
fonte
--force
, veja a resposta aceitaSe você sabe que ninguém obteve seu commit não alterado, use a
--force-with-lease
opção degit push
.No TortoiseGit, você pode fazer o mesmo nas opções "Empurrar ...", "Forçar: Pode descartar" e marcar "alterações conhecidas".
fonte
Você está recebendo este erro porque o remoto Git já possui esses arquivos de confirmação. Você precisa forçar o push do branch para que isso funcione:
Além disso, certifique-se de extrair o código do controle remoto, pois outra pessoa da sua equipe pode ter enviado para o mesmo ramo.
Este é um dos casos em que precisamos forçar o envio remoto para commit.
fonte
Aqui está uma maneira muito simples e limpa de enviar suas alterações depois de você já ter feito um
git add "your files"
egit commit --amend
:ou:
fonte
Eu tive que corrigir esse problema retirando do repositório remoto e lidar com os conflitos de mesclagem que surgiram, confirmar e depois enviar. Mas sinto que há uma maneira melhor.
fonte
Eu apenas continuei fazendo o que Git me disse para fazer. Assim:
Nota: O commit alterado foi o mais recente.
fonte
O seguinte funcionou para mim ao alterar o Autor e o Committer de um commit.
git push -f origin master
O Git foi inteligente o suficiente para descobrir que esses eram commits de deltas idênticos, que apenas diferiam na seção de meta informações.
Tanto os chefes locais quanto os remotos apontaram para os commits em questão.
fonte
Se você estiver usando o Visual Studio Code, poderá tentar esta extensão para facilitar.
https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force
Como você pode entender pelo nome, ele executa comandos consecutivamente
git commit --amend
git push --force
fonte
Aqui, como eu corrigi uma edição em um commit anterior:
git stash
agora sua cópia de trabalho está limpa no estado do seu último commit.git commit --all --amend
Seu editor aparecerá solicitando uma mensagem de log (por padrão, a antiga mensagem de log). Salve e saia do editor quando estiver satisfeito com ele.
As novas alterações são adicionadas ao commit antigo. Veja você mesmo com
git log
egit diff HEAD^
Reaplique as alterações ocultas, se feitas:
git stash apply
fonte