Desfazer um compromisso particular no git que foi pressionado a repositórios remotos
-
22-09-2019 - |
Pergunta
Qual é a maneira mais simples de desfazer um compromisso específico que é:
- não na cabeça ou na cabeça
- Foi empurrado para o controle remoto.
Porque se não for o mais recente compromisso,
git reset HEAD
não funciona. E porque foi empurrado para um controle remoto,
git rebase -i
e
git rebase --onto
causará algum problema nos controles remotos.
Mais ainda, não quero modificar a história realmente. Se houvesse código ruim, estava lá na história e pode ser visto. Eu só quero isso na cópia de trabalho e não me importo com uma confirmação de mesclagem reversa.
Em outras palavras, o que é o Git equivalente aos seguintes comandos SVN:
svn merge -r 303:295 http://svn.example.com/repos/calc/trunk
que remove todas as alterações de 295 para 302 por fusão reversa de todas as mudanças nessas revisões, como uma nova confirmação.
svn merge -c -302 ^/trunk
O que desfaz o comprometimento 302, é claro, adicionando outra confirmação que reversa mescla as alterações dessa confirmação respectiva.
Eu pensei que deveria ser uma operação bastante simples no Git e um caso de uso bastante comum. Qual é o ponto de comprometimento atômico?
Temos encenação Angar E tudo para garantir que os compromissos sejam perfeitamente atômicos, você não deve desfazer um ou mais desses compromissos atômicos facilmente?
Solução
Identifique o hash do compromisso, usando git log
, então use git revert <commit>
Para criar uma nova confirmação que remove essas alterações. De certa forma, git revert
é o inverso de git cherry-pick
- O último aplica o patch a um ramo que está perdendo, o primeiro o remove de um ramo que o possui.
Outras dicas
Eu não gosto do comando automático que git revert
Isso, então isso pode ser útil para alguns.
Se você deseja apenas os arquivos modificados, não o compromisso automático, você pode usar --no-commit
% git revert --no-commit <commit hash>
que é o mesmo que o -n
% git revert -n <commit hash>
Como já foi empurrado, você não deve manipular diretamente a história. git revert
reverterá alterações específicas de uma confirmação usando uma nova confirmação, para não manipular o histórico de compromissos.