Dada uma alteração que foi confirmada usando commit
e depois revertida usando revert
, qual é a melhor maneira de desfazer essa reversão?
Idealmente, isso deve ser feito com um novo commit, para não reescrever o histórico.
Dada uma alteração que foi confirmada usando commit
e depois revertida usando revert
, qual é a melhor maneira de desfazer essa reversão?
Idealmente, isso deve ser feito com um novo commit, para não reescrever o histórico.
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ão git add -A && git commit
.
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 que git 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
Um commit reverso é como qualquer outro commit no git. Ou seja, você pode revertê-lo, como em:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
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:
7963f4b2a9d Revert "Revert "OD-9033 parallel reporting configuration"
"This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
...
a0e5e86d3b6 Revert "OD-9055 paralel reporting configuration"
This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
...
Merge pull request parallel_reporting_dbs to master* commit
'648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'
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.
A reversão da reversão fará o truque
Por exemplo,
Se abcdef
é seu commit e ghijkl
é o commit que você possui ao reverter o commit abcdef
, execute:
git revert ghijkl
Isso reverterá a reversão
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.
Aqui está como eu fiz isso:
Se o ramo my_branchname
foi incluído em uma mesclagem que foi revertida. E eu queria reverter my_branchname
:
I primeiro fazer uma git checkout -b my_new_branchname
de my_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 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.
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
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E <-- fixed-up topic branch
(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:
$ git checkout E
$ git rebase --no-ff P
A nova cópia da sua filial agora pode ser mesclada master
novamente:
A'---B'---C'------------D'---E' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E
Para recuperar as alterações em etapas e em etapas que foram revertidas após uma confirmação:
git reset HEAD@{1}
Para recuperar todas as exclusões não faseadas:
git ls-files -d | xargs git checkout --