Annuler un commit particulier dans Git qui a été poussé à distance prises en pension
-
22-09-2019 - |
Question
Quelle est la façon la plus simple d'annuler une livraison particulière qui est:
- pas dans la tête ou HEAD
- a été poussé à la télécommande.
Parce que s'il n'est pas la dernière commettras,
git reset HEAD
ne fonctionne pas. Et parce qu'il a été poussé à une télécommande,
git rebase -i
et
git rebase --onto
causera un problème dans les télécommandes.
Plus, je ne veux pas modifier l'histoire vraiment. S'il y avait du mauvais code, il était là dans l'histoire et peut être vu. Je veux simplement dans la copie de travail, et je ne me dérange pas une fusion inverse commit.
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 fusionnant inverse toutes les modifications de ces révisions, comme un commit.
svn merge -c -302 ^/trunk
qui annule la 302 commit, bien sûr en ajoutant un autre commit qui inverse fusionne les modifications de cette engager respective.
Je pensais que ce devrait être une opération assez simple dans Git et un cas d'utilisation assez courante. Qu'est-ce d'autre point de commits atomiques?
Nous avons la mise en scène stashing et tout pour que les commits sont parfaitement atomique, ne devrait pas vous être en mesure d'annuler une ou plusieurs de ces commits atomiques facilement?
La solution
Identifier le hachage du commit, en utilisant git log
, puis utilisez git revert <commit>
pour créer un nouveau commit qui supprime ces changements. D'une certaine manière, git revert
est l'inverse de git cherry-pick
- celui-ci applique le patch à une branche qui manque ce, l'ancien qu'il retire d'une branche qui l'a
Autres conseils
Je n'aime pas le fait d'auto-validation que git revert
, donc cela pourrait être utile pour certains.
Si vous voulez juste les fichiers modifiés pas auto-validation , vous pouvez utiliser --no-commit
% git revert --no-commit <commit hash>
qui est la même que la -n
% git revert -n <commit hash>
Parce qu'il a déjà été poussé, vous ne devriez pas manipuler directement l'histoire. git revert
va revenir sur des changements spécifiques d'un engagement à l'aide d'un nouveau commit, afin de ne pas manipuler l'histoire commettre.