Quel est le moyen le plus simple d'annuler un commit particulier:
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?
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.
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>
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.