Annulez un commit en particulier dans Git qui a été repoussé vers les repos distants

Quel est le moyen le plus simple pour annuler un commit particulier qui est:

  • 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é vers 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’histoire. S’il y avait du mauvais code, il était là dans l’histoire et peut être vu. Je veux juste le sortir dans la copie de travail, et cela ne me dérange pas un commit de fusion inverse.

En d’autres termes, quelle 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 inversant la fusion de toutes les modifications apscopes à ces révisions, en tant que nouvelle validation.

 svn merge -c -302 ^/trunk 

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

Je pensais que cela devrait être une opération assez simple dans Git et un cas d’utilisation assez commun. Quel est le but des commits atomiques?

Nous avons des mises en scène et tout pour garantir que les commits sont parfaitement atomiques, ne devriez-vous pas être en mesure de défaire facilement une ou plusieurs de ces validations atomiques?

Identifiez le hachage de la validation, en utilisant git log , puis utilisez git revert 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 twig qui le manque, le premier le supprime d’une twig qui le possède.

Je n’aime pas l’auto-commit que git revert , donc cela pourrait être utile pour certains.

Si vous voulez juste que les fichiers modifiés ne soient pas auto-commit , vous pouvez utiliser --no-commit

 % git revert --no-commit  

qui est le même que le -n

 % git revert -n  

Parce qu’il a déjà été poussé, vous ne devriez pas manipuler directement l’historique. git revert annulera les modifications spécifiques d’un commit en utilisant un nouvel commit, afin de ne pas manipuler l’historique des validations.