web-dev-qa-db-fra.com

Annuler un commit particulier dans Git qui a été poussé vers un dépôt distant

Quel est le moyen le plus simple d'annuler un commit particulier:

  • pas dans la tête ou la tête
  • A été poussé à la télécommande.

Parce que si ce n'est pas le dernier commit,

git reset HEAD

ne fonctionne pas. Et parce qu'il a été poussé sur une télécommande,

git rebase -i

et

git rebase --onto

causera un problème dans les télécommandes.

Plus encore, je ne veux pas vraiment modifier l'historique. S'il y avait un mauvais code, il était dans l'histoire et peut être vu. Je veux juste que ce soit dans la copie de travail, et je ne crains pas un commit de fusion inversée.

En d'autres termes, quel est l'équivalent Git des commandes svn suivantes:

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

qui supprime toutes les modifications de 295 à 302 en fusionnant de manière inverse toutes les modifications de ces révisions, en tant que nouvelle validation.

svn merge -c -302 ^/trunk

annule le commit 302, bien sûr en ajoutant un autre commit qui inverse les modifications de ce commit.

Je pensais que cela devrait être une opération assez simple sous Git et un cas d'utilisation assez courant. Quel est le point des commits atomiques?

Nous avons mis en scène stashing et tout pour que les commits soient parfaitement atomiques, ne devriez-vous pas pouvoir annuler facilement un ou plusieurs de ces commits atomiques?

724
Lakshman Prasad

Identifiez le hachage de la validation en utilisant git log, puis utilisez git revert <commit> pour créer une nouvelle validation qui supprime ces modifications. D'une certaine manière, git revert est l'inverse de git cherry-pick - ce dernier applique le correctif à une branche qui le manque, le premier le supprime d'une branche qui en est dotée.

1118
Andrew Aylett

Je n'aime pas le auto-commit que git revert aime, alors cela pourrait être utile pour certains.

Si vous ne voulez que les fichiers modifiés et non la validation automatique, vous pouvez utiliser --no-commit

% git revert --no-commit <commit hash>

qui est le même que le -n

% git revert -n <commit hash>
348
user633183

Parce que cela a déjà été poussé, vous ne devriez pas manipuler directement l’histoire. git revert annulera les modifications spécifiques d'une validation en utilisant une nouvelle validation, afin de ne pas manipuler l'historique de validation.

36
moatPylon