Reverter um intervalo de commits no git

Como posso reverter um intervalo de commits no git? Olhando para a documentação das gitrievisões , não consigo ver como especificar o intervalo de que preciso. Por exemplo:

A -> B -> C -> D -> E -> HEAD 

Eu quero fazer o equivalente a:

 git revert BD 

onde o resultado seria:

 A -> B -> C -> D -> E -> F -> HEAD 

onde F contém o reverso de BD inclusive.

Qual versão do Git você está usando?

Revertendo múltiplos commits apenas suportados no Git1.7.2 +: veja ” Reverter para um commit antigo usando reverter múltiplas vezes. ” Para mais detalhes.
A página man atual do git revert é apenas para a versão atual do Git (1.7.4+).


Como o OP Alex Spurling relata nos comentários:

Atualizando para 1.7.4 funciona bem.
Para responder a minha própria pergunta, esta é a syntax que eu estava procurando:

 git revert B^..D 

B^ significa “a primeira confirmação pai de B”: que permite include B na reversão.
Consulte a seção ” git rev-parse ESPECIFICANDO REVISÕES “, que inclui a syntax ^ , por exemplo, HEAD^ : veja mais em ” O que significa o caractere circunflexo ( ^ )? “)

Observe que cada confirmação revertida é confirmada separadamente.

Henrik N esclarece nos comentários :

 git revert OLDER_COMMIT^..NEWER_COMMIT 

Como mostrado abaixo, você pode reverter sem se comprometer imediatamente:

 git revert -n OLDER_COMMIT^..NEWER_COMMIT git commit -m "revert OLDER_COMMIT to NEWER_COMMIT" 

Se você quiser reverter o intervalo de confirmação B para D (pelo menos na versão 2 do git) em um único commit, você pode fazer

  git revert -n B^..D 

Isso reverte as alterações feitas por commits do commit pai de B (excluído) para o D commit (incluído), mas não cria nenhum commit com as mudanças revertidas. A reversão apenas modifica a tree de trabalho e o índice.

Não se esqueça de confirmar as alterações depois

  git commit -m "revert commit range B to D" 

Você também pode reverter vários commits não relacionados em um único commit, usando o mesmo método. por exemplo, para reverter B e D, mas não C

  git revert -n BD git commit -m "Revert commits B and D" 

Referência: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

Obrigado Honza Haering pela correção

Fazer o git revert OLDER_COMMIT^..NEWER_COMMIT não funcionou para mim.

Eu usei git revert -n OLDER_COMMIT^..NEWER_COMMIT e tudo está bem. Estou usando o git versão 1.7.9.6 .

Use git rebase -i para esmagar os commits relevantes em um. Então você só tem um compromisso para reverter.