Como remover commits de uma solicitação pull


105

Eu fiz uma solicitação de pull, mas depois fiz alguns commits no projeto localmente que acabou poluindo minha solicitação de pull, tentei removê-la, mas sem sorte.

Eu encontrei algumas perguntas semelhantes no StackOverflow, mas não consigo aplicar o que está lá. É minha primeira solicitação de pull no GitHub, então é meio estranho para mim como tudo isso funciona.

O commit destacado é aquele que preciso manter e remover todas as outras coisas. Tornou-se o quarto commit da história porque eu fiz algumas coisas de mesclagem.

insira a descrição da imagem aqui

meu log git insira a descrição da imagem aqui

Alguém pode explicar o que está acontecendo e como resolver esse problema?


2
Você precisa fazer o rebase e apenas "escolher" o commit "adicionado do github" (ou seja, comentar as linhas para cada outro commit)
Robbie Averill

1
rebase qual branch em qual branch você pode adicionar mais explicação.
Humazed

what branch= o branch em que você está trabalhando, onto what branch= o branch para o qual você está puxando o pedido
Robbie Averill

Expliquei o que @Robbie Averill insinuou em minha resposta. É estranho que ninguém tenha escrito uma resposta explicando isso até agora.
Ferit

Respostas:


108

Você tem várias técnicas para fazer isso.

Este post - leia a parte sobre a reversão irá explicar em detalhes o que queremos fazer e como fazer.

Aqui está a solução mais simples para o seu problema:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
git push origin <branch>

O comando revert criará um novo commit com o desfazer do commit original.


2
Funciona mesmo quando separamos o projeto de outra pessoa e queremos remover alguns comentários na solicitação pull?
Dr.jacky de

107

As pessoas não gostariam de ver um commit errado e um commit de reversão para desfazer as alterações do commit errado. Isso polui a história do commit.

Aqui está uma maneira simples de remover o commit errado em vez de desfazer as alterações com um commit de reversão.

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n// onde né o número dos últimos commits que você deseja incluir no rebase interativo.

  3. Substitua pickpor droppara commits que você deseja descartar.
  4. Salvar e sair.
  5. git push --force

8
isso funcionou para mim como um encanto. Eu tinha um monte de commits que não deveriam estar no PR. Acabei de fazer um
rebase interativo

1
Você deve sincronizar com o mestre remoto antes de iniciar um pr de qualquer maneira, não?
Ferit

5
Para empurrar eu tinha que fazer: git push origin HEAD:myBranch --force. Mas, de outra forma, é ótimo e útil.
ScottyBlades

@ScottyBlades Eu omiti essa parte intencionalmente porque está fora do escopo. Se você não definiu o branch de rastreamento, você precisa defini-lo ou, como fez, empurre explicitamente.
Ferit

4
Isso também é útil quando você deseja corrigir um PR aberto no GitHub, você só precisa ser capaz de fazer um push forçado
Vladimir Hidalgo

6

Se você está removendo um commit e não quer manter suas alterações, @ferit tem uma boa solução.

Se você deseja adicionar esse commit ao branch atual, mas não faz sentido fazer parte do pr atual, você pode fazer o seguinte:

  1. usar git rebase -i HEAD~n
  2. Troque o commit que deseja remover para a posição inferior (mais recente)
  3. Salvar e sair
  4. use git reset HEAD^ --softpara descomprimir as alterações e colocá-las de volta em um estado de teste.
  5. use git push --forcepara atualizar o branch remoto sem seu commit removido.

Agora você terá removido o commit de seu controle remoto, mas ainda terá as alterações localmente.


2

Então faça o seguinte,

Vamos dizer que o nome do seu branch é my_branch e este tem os commits extras.

  1. git checkout -b my_branch_with_extra_commits (Manter este ramo salvo com um nome diferente)
  2. gitk (Abre o console git)
  3. Procure o commit que deseja manter. Copie o SHA desse commit em um bloco de notas.
  4. git checkout my_branch
  5. gitk (Isso abrirá o console git)
  6. Clique com o botão direito no commit para o qual deseja reverter (Estado antes de suas alterações) e clique em " reset branch to here"
  7. Faça um git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

Agora olhe para o histórico de commits do branch local e certifique-se de que está tudo certo.


0

Isso é o que me ajudou:

  1. Crie uma nova filial com a existente. Vamos chamar o existente branch_olde o novo de branch_new.

  2. Redefina branch_newpara um estado estável, quando você não teve nenhum problema de commit. Por exemplo, para colocá-lo em seu nível de mestrado local, faça o seguinte:

    git reset —hard master git push —forçar origem

  3. cherry-pickos commits de branch_oldparabranch_new

  4. git push
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.