web-dev-qa-db-fra.com

Annuler une gamme de validations dans git

Comment puis-je annuler une plage de commits dans git? En regardant la documentation 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 B-D

où le résultat serait:

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

où F contient l'inverse de B-D inclus.

105
Alex Spurling

Quelle version de Git utilisez-vous?

La restauration de plusieurs validations n'est prise en charge que dans Git1.7.2 +: voir " revenir à une ancienne validation en utilisant plusieurs fois la restauration. " pour plus de détails.
Le courant git revert page de manuel est uniquement pour la version actuelle Git (1.7.4+).


Comme le rapporte OP Alex Spurling dans les commentaires:

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

git revert B^..D 

B^ signifie "le premier commit parent de B": cela permet d'inclure B dans le retour.
Voir " git rev-parse SECTION SPÉCIFICATION DES RÉVISIONS "qui inclut le <rev>^, par exemple. HEAD^ syntaxe: voir plus sur " Qu'est-ce que le curseur (^) signifie le caractère? ")

Notez que chaque commit annulé est validé séparément.

Henrik N clarifie dans les commentaires :

git revert OLDER_COMMIT^..NEWER_COMMIT

Comme indiqué ci-dessous, vous pouvez annuler sans vous engager immédiatement:

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

Si vous souhaitez rétablir la plage de commit B à D (au moins dans git version 2) en un seul commit, vous pouvez le faire

 git revert -n B^..D

Cela annule les modifications effectuées par les validations du commit parent B (exclu) au commit D (inclus), mais ne crée aucun commit avec les modifications annulées. Le retour modifie uniquement l'arborescence de travail et l'index.

N'oubliez pas de valider les modifications après

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

Vous pouvez également annuler plusieurs validations non liées en une seule validation, en utilisant la même méthode. par exemple pour inverser B et D mais pas C

 git revert -n B D
 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 le correction

9
Ramast

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 git 1.7.9.6.

6
Orlando

Utilisation git rebase -i pour écraser les commits concernés en un seul. Ensuite, vous n'avez qu'un seul commit à annuler.

0
Graham Borland