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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top