Alguém aceitou uma solicitação pull que não deveria ter. Agora temos um monte de códigos quebrados incorporados. Como você desfaz uma solicitação pull? Ia reverter as alterações no commit antes da mesclagem, mas notei que ele se mesclava em vários commits. Portanto, agora existem todos esses commits dessa pessoa dias antes da mesclagem. Como você desfaz isso?
git
github
merge
pull-request
Vai
fonte
fonte
Respostas:
Existe uma resposta melhor para esse problema, embora eu pudesse apenas detalhar isso passo a passo.
Você precisará buscar e efetuar o checkout das alterações upstream mais recentes, como por exemplo:
Examinando o log de confirmação, você deve encontrar algo semelhante a este:
Agora você deseja reverter toda a solicitação de recebimento com a capacidade de reverter mais tarde. Para fazer isso, você precisará levar o ID da confirmação de mesclagem .
No exemplo acima, a consolidação de mesclagem é a principal, onde diz "Solicitação de recebimento mesclado nº 123 ..." .
Faça isso para reverter as duas alterações ( "Adicionar barra" e "Adicionar foo" ) e você terminará com um commit revertendo toda a solicitação pull, que poderá ser revertida posteriormente e manter limpo o histórico de alterações:
fonte
git checkout upstream/master -b revert/john/foo_and_bar
? o que isso faz exatamente?Veja o seu gráfico de confirmação (com gitk ou um programa similar). Você verá confirmações da solicitação pull e verá suas próprias confirmações e uma confirmação de mesclagem (se não for uma mesclagem de avanço rápido). Você apenas precisa encontrar o último de seus commit antes da mesclagem e redefinir a ramificação para esse commit.
(Se você tiver o reflog do ramo, deve ser ainda mais fácil encontrar o commit antes da mesclagem.)
(Edite depois de mais informações nos comentários :)
Ok, vamos olhar para o gráfico:
Presumo que o último commit (mais à direita) foi sua solicitação de mesclagem errada por pull , que mesclou a linha azul vista aqui. Sua última boa cometer seria o anterior na linha de preto, aqui marcados em vermelho:
Redefina para este commit e você deve ficar bem.
Isso significa que, na sua cópia de trabalho local, faça isso (depois de verificar se você não possui mais itens não confirmados, por exemplo, pelo git stash):
Agora confirme que você está realmente no commit que eu marquei lá, e você não verá nenhuma das coisas puxadas em sua ancestralidade.
(se o seu github remote for nomeado
origin
- altere o nome).Agora, tudo deve estar correto também no github. As confirmações ainda estarão no seu repositório, mas não poderão ser acessadas por nenhum ramo, portanto, não devem causar nenhum dano a ele. (E eles ainda estarão no repositório de RogerPaladin, é claro.)
(Pode haver uma maneira apenas específica da Web do Github de fazer a mesma coisa, mas não estou muito familiarizado com o Github e seu sistema de gerenciamento de solicitações de recebimento.)
Observe que se alguém já tiver puxado seu mestre com a confirmação incorreta, eles terão o mesmo problema que você atualmente e não poderão realmente contribuir de volta. antes de redefinir para sua nova versão principal.
Se é provável que isso aconteceu, ou você simplesmente deseja evitar problemas, use o
git revert
comando em vez degit reset
, para reverter as alterações com uma nova confirmação, em vez de voltar para uma anterior. (Algumas pessoas pensam que você nunca deve redefinir com ramificações publicadas.) Veja outras respostas para esta pergunta sobre como fazer isso.Para o futuro:
Se você deseja apenas alguns dos commit da filial de RogerPaladin, considere usar em
cherry-pick
vez demerge
. Ou comunique-se com RogerPaladin para movê-los para uma ramificação separada e enviar uma nova solicitação de recebimento.fonte
reset --hard
e um push forçado é muito má prática) a resposta por @errordeveloper abaixo mostra uma maneira de fazer isso sem qualquer história reescrita ou força empurrando..Se a atração foi a última coisa que ele fez, então
fonte
git reset --hard HEAD~1
, eu costumavagit push origin -f
atualizar o repositório remoto. Mas tenha cuidado, tenha cuidado antes de fazer isso.A partir de 24 de junho de 2014, você pode tentar cancelar um PR facilmente (consulte " Revertendo uma solicitação de recebimento ") com:
Apresentando o botão Reverter
Resta ainda ser testado se essa reversão usa
-m
ou não (para reverter mesclagens também)Mas Adil H Raza acrescenta nos comentários (dezembro de 2019):
Atenção : Korayem ressalta nos comentários que:
Korayem nos refere ao " Github: Alterações ignoradas após reverter (
git cherry-pick
,git rebase
) " para mais.fonte
Para desfazer uma solicitação pull do github com confirmações que você não deseja excluir, é necessário executar um:
git reset --hard --merge <commit hash>
com o hash de confirmação sendo o commit ANTES de mesclar a solicitação de recebimento. Isso removerá todas as confirmações da solicitação de recebimento sem influenciar nenhuma confirmação no histórico.
Uma boa maneira de encontrar isso é ir para a solicitação pull agora fechada e localizar este campo:
Pull Request Image
Depois de executar o
git reset
, execute um:git push origin --force <branch name>
Isso deve reverter a ramificação antes da solicitação pull, sem afetar nenhuma confirmação na ramificação inserida no histórico de confirmação entre confirmações da solicitação pull.
EDITAR:
Se você clicar no botão reverter na solicitação de recebimento, isso criará uma confirmação adicional na ramificação. NÃO descompacta ou descompacta. Isso significa que, se você apertar o botão de reversão, não poderá abrir uma nova solicitação pull para adicionar novamente todo esse código.
fonte
Eu uso esse lugar o tempo todo, obrigado.
Eu estava procurando como desfazer uma solicitação pull e cheguei aqui.
Eu estava prestes a
git reset --hard
"muito tempo atrás" e avançar rapidamente de volta para onde estava antes de fazer a solicitação de recebimento.Além de procurar aqui, também perguntei ao meu colega de trabalho o que ele faria e ele tinha uma resposta normalmente boa: usando o exemplo de saída na primeira resposta acima:
Como na maioria das coisas no Git, se você está fazendo algo de alguma maneira que não é fácil, provavelmente está fazendo errado.
fonte