@phuclv um comentário para possível duplicação por lá, aponta aqui. Um deve ser marcado como original e um deve ser marcado como duplicado
John Demetriou
@JohnDemetriou não, a pergunta que tem um conjunto melhor de respostas deve ser mantida em aberto. O tempo não é relevante aqui Como lidar com perguntas duplicadas?
phuclv
Eu não disse sobre o tempo. Acabei de comentar um dos dois sobre o assunto
John Demetriou
Respostas:
385
Se você ainda não fez essa alteração, git reset --hard HEAD^
Caso contrário, reverter a reversão é perfeitamente aceitável.
Outra maneira é git checkout HEAD^^ -- .e então git add -A && git commit.
Observe que se você deseja cancelar a reversão sem aplicar imediatamente as alterações originais na ramificação principal, você pode (1) restaurar a ramificação original se excluída, (2) clicar em "reverter" na ramificação de reversão, conforme observado por Adam; 3) clique em "editar" no cabeçalho do PR resultante e altere o ramo de destino para o ramo original em vez de mestre. Agora sua ramificação original pode ser re-mesclada para efetuar as alterações revertidas anteriormente.
pauljm 26/09/14
1
Observe que isso removerá todas as alterações na árvore de trabalho e no índice. Use o git stash para salvar as alterações que você não quer perder.
zpon 30/08/16
3
Qual é a vantagem do método checkout && commit? Parece que, no caso geral git cherry-pickou alternativamente, git revertsão as formas mais diretas de reverter uma reversão.
Robert Jack Will
5
Eu acho que seria útil mostrar como: Otherwise, reverting the revert is perfectly fine.e também explicar o que git checkout HEAD^^ -- .está fazendo.
Todd
3
Bom Deus, não use git add -A... a menos que você queira adicionar todos os arquivos ao controle de versão, o que provavelmente não é o que você deseja.
Kaitain 29/01
474
git cherry-pick <original commit sha>
Fará uma cópia do commit original, reaplicando essencialmente o commit
A reversão da reversão fará a mesma coisa, com uma mensagem de confirmação mais confusa: git revert <commit sha of the revert>
Qualquer uma dessas maneiras permitirá que você git pushsubstitua o histórico, pois cria um novo commit após a reversão.
Ao digitar o commit sha, normalmente você precisa apenas dos primeiros 5 ou 6 caracteres: git cherry-pick 6bfabc
Essa é facilmente a solução mais elegante e completa para a questão dos OPs. Muito melhor do que a resposta aceita com suas suposições sobre o fato de o commit de reversão estar no HEAD da árvore de commit. O op também pediu especificamente uma solução que não reescreva o histórico, portanto a solução difícil oferecida na resposta aceita está simplesmente errada.
Timo
6
@Timo Para esclarecer, a resposta aceita contém a solução que eu usei ("reverter a reversão") e foi publicada poucas horas depois da minha pergunta - um claro 3 anos antes dessa resposta. Portanto, a marca de seleção.
precisa saber é o seguinte
6
@JimmidyJoo Eu sei que eu tinha 3 anos de atraso, eu só as pessoas queriam que vêm aqui a partir de uma pesquisa no Google para ver uma resposta melhor
Stephan
2
@ Stephan Sim, mas, novamente, para esclarecer - é uma resposta melhor, mas não a que usei para resolver meu problema. Eu estava simplesmente comentando por que a marca de seleção é onde está. Pergunta para todos: a convenção de SO determina que devo "manter" minhas perguntas anteriores e reatribuir marcas de verificação à medida que novas respostas chegam?
precisa saber é o seguinte
3
@JimmidyJoo Eu não tenho idéia sobre a convenção SO. Mas como pesquisador do Google, eu realmente prefiro ver a melhor resposta marcada. E agradeceria os esforços de qualquer pessoa para manter suas perguntas passadas.
Paiman Roointan 29/07/19
30
Um commit reverso é como qualquer outro commit no git. Ou seja, você pode revertê-lo, como em:
Obviamente, isso só faz sentido quando as alterações foram enviadas, e especialmente quando você não pode forçar o envio para a ramificação de destino (o que é uma boa idéia para sua ramificação mestre ). Se a alteração não tiver sido enviada, basta selecionar, reverter ou simplesmente remover o commit de reversão, conforme outras postagens.
Em nossa equipe, temos uma regra para usar uma reversão em confirmações de reversão que foram confirmadas na ramificação principal, principalmente para manter o histórico limpo, para que você possa ver qual confirmação reverte o que:
Dessa forma, você pode rastrear a história e descobrir toda a história, e mesmo aqueles sem o conhecimento do legado poderiam descobrir por si mesmos. Visto que, se você escolher ou refazer as coisas, essas informações valiosas serão perdidas (a menos que você as inclua no comentário).
Obviamente, se um commit revertido e revertido mais de uma vez, isso se torna bastante confuso.
Parece estúpido para mim. Mas eu estava na mesma situação e reverti para confirmações revertidas. Eu fiz revertimentos em número, então tive que reverter para cada 'reverter confirmação'.
Agora minha história de commit parece um pouco estranha.
É um projeto de estimação, então está tudo bem. Mas, no projeto da vida real, eu daria preferência ao último commit antes de reverter a restauração de todo o código revertido juntos em um commit e um comentário mais razoável.
Você pode evitar a auto comprometer e escolha de se comprometer mensagem usando a bandeira --no-commit ao reverter e, em seguida, para cometer com a mensagem relevante
David Barda
Além disso, você pode especificar vários IDs de confirmação ao usar o git revert (eles devem estar na ordem correta, eu acho).
Aalex Gabi
Posso fazer isso no desktop do github?
Guillaume F.
4
Aqui está como eu fiz isso:
Se o ramo my_branchnamefoi incluído em uma mesclagem que foi revertida. E eu queria reverter my_branchname:
I primeiro fazer uma git checkout -b my_new_branchnamede my_branchname.
Em seguida, faço um git reset --soft $COMMIT_HASHwhere onde $COMMIT_HASHestá o hash de confirmação do commit imediatamente antes do primeiro commit de my_branchname(consulte git log).
Depois, faço um novo commit. git commit -m "Add back reverted changes"
Então empurro git push origin new_branchname
o novo branch.
Caminho a percorrer quando há muitas "escolhas" para fazer. Eu não entendo por que esta resposta tem tão poucos upvotes
Fundhor
2
Ou você poderia git checkout -b <new-branch>e git cherry-pick <commit>antes para o e git rebasepara soltar revertcommit. envie solicitação de recebimento como antes.
Se você não gosta da idéia de "reverter uma reversão" (especialmente quando isso significa perder informações de histórico para muitas confirmações), você sempre pode ir para a documentação do git sobre "Revertendo uma fusão defeituosa" .
Boa ideia e obrigado pelo link do documento. Geralmente, nos refazemos com o master antes de nos juntar novamente, mas o git parece reconhecer que A ', B', C 'são os mesmos que os anteriores, e agora tenho D, E após W ( pastebin ). Sugestões sobre como resolver isso?
Kristoffer Bakkejord 28/06/19
0
Para recuperar as alterações em etapas e em etapas que foram revertidas após uma confirmação:
Respostas:
Se você ainda não fez essa alteração,
git reset --hard HEAD^
Caso contrário, reverter a reversão é perfeitamente aceitável.
Outra maneira é
git checkout HEAD^^ -- .
e entãogit add -A && git commit
.fonte
git cherry-pick
ou alternativamente,git revert
são as formas mais diretas de reverter uma reversão.Otherwise, reverting the revert is perfectly fine.
e também explicar o quegit checkout HEAD^^ -- .
está fazendo.git add -A
... a menos que você queira adicionar todos os arquivos ao controle de versão, o que provavelmente não é o que você deseja.git cherry-pick <original commit sha>
Fará uma cópia do commit original, reaplicando essencialmente o commit
A reversão da reversão fará a mesma coisa, com uma mensagem de confirmação mais confusa:
git revert <commit sha of the revert>
Qualquer uma dessas maneiras permitirá que você
git push
substitua o histórico, pois cria um novo commit após a reversão.Ao digitar o commit sha, normalmente você precisa apenas dos primeiros 5 ou 6 caracteres:
git cherry-pick 6bfabc
fonte
Um commit reverso é como qualquer outro commit no git. Ou seja, você pode revertê-lo, como em:
Obviamente, isso só faz sentido quando as alterações foram enviadas, e especialmente quando você não pode forçar o envio para a ramificação de destino (o que é uma boa idéia para sua ramificação mestre ). Se a alteração não tiver sido enviada, basta selecionar, reverter ou simplesmente remover o commit de reversão, conforme outras postagens.
Em nossa equipe, temos uma regra para usar uma reversão em confirmações de reversão que foram confirmadas na ramificação principal, principalmente para manter o histórico limpo, para que você possa ver qual confirmação reverte o que:
Dessa forma, você pode rastrear a história e descobrir toda a história, e mesmo aqueles sem o conhecimento do legado poderiam descobrir por si mesmos. Visto que, se você escolher ou refazer as coisas, essas informações valiosas serão perdidas (a menos que você as inclua no comentário).
Obviamente, se um commit revertido e revertido mais de uma vez, isso se torna bastante confuso.
fonte
A reversão da reversão fará o truque
Por exemplo,
Se
abcdef
é seu commit eghijkl
é o commit que você possui ao reverter o commitabcdef
, execute:Isso reverterá a reversão
fonte
Parece estúpido para mim. Mas eu estava na mesma situação e reverti para confirmações revertidas. Eu fiz revertimentos em número, então tive que reverter para cada 'reverter confirmação'.
Agora minha história de commit parece um pouco estranha.
É um projeto de estimação, então está tudo bem. Mas, no projeto da vida real, eu daria preferência ao último commit antes de reverter a restauração de todo o código revertido juntos em um commit e um comentário mais razoável.
fonte
Aqui está como eu fiz isso:
Se o ramo
my_branchname
foi incluído em uma mesclagem que foi revertida. E eu queria revertermy_branchname
:I primeiro fazer uma
git checkout -b my_new_branchname
demy_branchname
.Em seguida, faço um
git reset --soft $COMMIT_HASH
where onde$COMMIT_HASH
está o hash de confirmação do commit imediatamente antes do primeiro commit demy_branchname
(consultegit log
).Depois, faço um novo commit.
git commit -m "Add back reverted changes"
Então empurro
git push origin new_branchname
o novo branch.
fonte
Ou você poderia
git checkout -b <new-branch>
egit cherry-pick <commit>
antes para o egit rebase
para soltarrevert
commit. envie solicitação de recebimento como antes.fonte
Se você não gosta da idéia de "reverter uma reversão" (especialmente quando isso significa perder informações de histórico para muitas confirmações), você sempre pode ir para a documentação do git sobre "Revertendo uma fusão defeituosa" .
Dada a seguinte situação inicial
(W é sua reversão inicial da mesclagem M; D e E são correções para sua ramificação / consolidação de recurso inicialmente interrompida)
Agora você pode simplesmente reproduzir as confirmações de A a E, para que nenhuma delas "pertença" à mesclagem revertida:
A nova cópia da sua filial agora pode ser mesclada
master
novamente:fonte
Para recuperar as alterações em etapas e em etapas que foram revertidas após uma confirmação:
Para recuperar todas as exclusões não faseadas:
fonte