Inverser une série de commits dans git

Comment puis-je annuler une série de commits dans git? En regardant la documentation de gitrevisions , je ne vois pas comment spécifier la plage dont j’ai besoin. Par exemple:

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

Je veux faire l’équivalent de:

 git revert BD 

où le résultat serait:

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

où F contient l’inverse de BD inclus.

Quelle version de Git utilisez-vous?

Le retour de plusieurs commits n’est pris en charge que dans Git1.7.2 +: voir ” Restauration d’une ancienne validation à l’aide de la fonction de restauration multiple ” pour plus de détails.
La page de manuel actuelle de git revert concerne uniquement la version actuelle de Git (1.7.4+).


Comme le rapporte Alex Spurling dans les commentaires:

La mise à niveau vers la version 1.7.4 fonctionne correctement.
Pour répondre à ma propre question, voici la syntaxe que je recherchais:

 git revert B^..D 

B^ signifie “le premier engagement parent de B”: cela permet d’inclure B dans le retour.
Voir ” git rev-parse SPECIFYING REVISIONS section ” qui inclut la syntaxe ^ , par exemple HEAD^ : voir plus à ” Que signifie le caractère caret ( ^ )? “)

Notez que chaque validation annulée est validée séparément.

Henrik N précise dans les commentaires :

 git revert OLDER_COMMIT^..NEWER_COMMIT 

Comme indiqué ci-dessous, vous pouvez revenir sans commettre immédiatement:

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

Si vous souhaitez rétablir la plage de validation B à D (au moins dans la version 2 de git) en une seule validation, vous pouvez le faire.

  git revert -n B^..D 

Cela annule les modifications apscopes par les validations de la validation du parent de B (exclu) par la validation D (incluse), mais ne crée aucun commit avec les modifications annulées. Le retour modifie uniquement l’arbre de travail et l’index.

N’oubliez pas de commettre les modifications après

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

Vous pouvez également annuler plusieurs validations sans rapport dans un même envoi, en utilisant la même méthode. par exemple pour inverser B et D mais pas C

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

Référence: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

Merci Honza Haering pour la correction

Faire git revert OLDER_COMMIT^..NEWER_COMMIT n’a pas fonctionné pour moi.

J’ai utilisé git revert -n OLDER_COMMIT^..NEWER_COMMIT et tout va bien. J’utilise la version 1.7.9.6 git.

Utilisez git rebase -i pour écraser les commits pertinents en un. Ensuite, il vous suffit de vous engager à revenir.