Comment annuler plusieurs commits dans le cadre d'un seul commit

Ce n'est pas un problème majeur, juste quelque chose que je veux savoir si c'est possible ou non.

Disons que nous avons deux commits, abcd123 et wxyz789, qui se produisent à des endroits non adjacents et séparés, loin de l'histoire d'un repo. Maintenant, disons que nous voulons les annuler. Faire

git revert abcd123 wxyz789

Entraînerait deux des livraisons séparées, l'une revenant abcd123 et l'autre de revenir wxyz789.

Tout va bien, mais que se passe-t-il si les erreurs que nous voulons corriger dans les deux commits sont logiquement lié, et à des fins d'auto-documentation, nous aimerions faire un seul commit contenant un seul" j'ai cassé quelque chose alors maintenant je retourne les fichiers x, Y et z " commentaire? Est-il une commande git qui fait cela?

(je suis bien sûr conscient qu'il est possible de créer un commit où je corrige manuellement toutes les modifications, puis pousse. C'est douloureux pour toutes les raisons obscures.)

46
demandé sur JimmidyJoo 2012-05-02 18:16:17

3 réponses

Vous pouvez faire:

git revert abcd123
git revert --no-commit wxyz789
git commit --amend

... puis écrivez un message de validation approprié décrivant l'effet combiné de la restauration des deux validations.

60
répondu Mark Longair 2012-05-02 14:25:07

En cas de reverts compliqués, qui se modifient, le revert --no-commit peut être problématique.

Ma solution simple était de faire un vrai revert, et le squash:

git revert <all commits>
git rebase -i

Puis marquez tous les reverts comme squash, sauf le premier, pour créer un seul commit.

32
répondu ElyashivLavi 2013-10-23 08:47:12
git revert -n <commits>
git commit

La première commande fera tous les reverts sans créer de commits et mettra en scène le résultat final (l'option-n). Après cela, la commande commit crée un seul commit.

20
répondu lyu 2015-12-08 02:08:20