Comment puis-je annuler une plage 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 B-D
où le résultat serait:
A -> B -> C -> D -> E -> F -> HEAD
où F contient l'inverse de BD inclus.
Réponses:
Quelle version de Git utilisez-vous?
Rétablissement de plusieurs commits uniquement pris en charge dans Git1.7.2 +: voir « Revenir à un ancien commit en utilisant revenir plusieurs fois » pour plus de détails.
La
git revert
page de manuel actuelle concerne uniquement la version actuelle de Git (1.7.4+).Comme le rapporte l' OP 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:
B^
signifie "le premier commit parent de B": cela permet de l'inclureB
dans le retour.Voir la section "
git rev-parse
SPÉCIFICATION DES RÉVISIONS " qui inclut la syntaxe<rev>^
, par exempleHEAD^
: voir plus à " Que signifie le caractère caret (^
)? ")Notez que chaque validation annulée est validée séparément.
Henrik N clarifie dans les commentaires :
Comme indiqué ci-dessous, vous pouvez revenir en arrière sans vous engager immédiatement:
la source
git revert OLDER_COMMIT^..NEWER_COMMIT
^
à un paramètre de révision signifie le premier parent de cet objet de validation".Si vous souhaitez rétablir la plage de validation B en D (au moins dans la version 2 de git) en un seul commit, vous pouvez faire
Cela rétablit les modifications effectuées par les validations du commit parent de B (exclu) vers le commit D (inclus), mais ne crée aucun commit avec les modifications annulées. Le retour ne modifie que l'arborescence de travail et l'index.
N'oubliez pas de valider les modifications après
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
Référence: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html
Merci Honza Haering pour la correction
la source
git revert -n B..D
n'annule pas le commit B, seuls C et D.git revert -n B^..D
annulent également B.git revert -n master~5..master~2
il est dit cinquième dernier commit inclus. Maismaster~5
c'est en fait le 6e dernier commit. Voir la sélection de révision dans la documentation git pour des informations détaillées sur la..
notation :-)Faire
git revert OLDER_COMMIT^..NEWER_COMMIT
n'a pas fonctionné pour moi.Je l'ai utilisé
git revert -n OLDER_COMMIT^..NEWER_COMMIT
et tout est bon. J'utilise la version git1.7.9.6
.la source
-n
ou--no-commit
annulera toutes les modifications de la plage en une seule validation, au lieu de créer une validation de retour pour chaque validation de la plage. Le résultat final est le même, comme dans, les mêmes modifications seront annulées. Cela dépend de la façon dont vous voulez que votre historique git ressemble.Utilisez
git rebase -i
pour écraser les commits pertinents en un seul. Ensuite, vous n'avez qu'un seul commit à annuler.la source