Question Annuler une validation particulière dans Git qui a été transmise aux repos éloignés


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é à distance,

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

En d'autres termes, quelle est la Git équivalent des commandes svn suivantes:

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

qui supprime tous les changements de 295 à 302 en inversant toutes les modifications de ces révisions, comme une nouvelle validation.

svn merge -c -302 ^/trunk

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

Je pensais que ce devrait être une opération assez simple dans Git et un cas d'utilisation assez commun. Quoi d'autre est le point de commits atomiques?

Nous avons une mise en scène cacher et tout pour s'assurer que les commits sont parfaitement atomiques, ne devriez-vous pas pouvoir défaire facilement un ou plusieurs de ces commits atomiques?


605
2018-02-23 14:21


origine


Réponses:


Identifiez le hachage du commit, en utilisant git log, puis utilisez git revert <commit> pour créer un nouveau commit qui supprime ces modifications. Dans un sens, git revert est l'inverse de git cherry-pick - ce dernier applique le patch à une branche qui le manque, le premier le supprime d'une branche qui l'a.


945
2018-02-23 14:31



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

Si vous voulez juste les fichiers modifiés, pas l'auto-commit, vous pouvez utiliser --no-commit

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

qui est le même que le -n

% git revert -n <commit hash>

290
2018-05-16 22:50



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


32
2018-02-23 14:28