Ces commandes proviennent toutes de Mercurial lui-même, et il y a beaucoup de bons articles de comparaison/contraste pour elles. Cependant, nous les présentons ici en bref :
-
rollback
: annulation à un niveau. Annulera le dernier pull ou commit ( peut être dangereux )
-
backout
: créer un nouveau commit qui est l'inverse d'un commit donné. L'effet net est une annulation, mais le changement reste dans votre historique.
-
strip
: supprimer ( détruire ) de l'historique. La suppression d'un changeset supprime également tous ses enfants, donc il ne peut être utilisé que pour tronquer l'historique, et non pour supprimer une tranche.
Les trois sont très bien décrits ici : http://www.selenic.com/mercurial/hg.1.html
Pour votre question 2, vous pourriez utiliser strip
pour supprimer le commit le plus récent et cela ne modifiera pas les fichiers de votre répertoire de travail.
Pour répondre à votre question 3, vous pouvez facilement faire des changements sur une autre partie de ce projet :
hg commit -m 'commit your half done work'
hg update OLDERCHANGESET # your working directory now is without the half-done-work
.. do that quickfix ...
hg commit -m 'quickfix'
hg push tip # this pushes the tip revision (latest) and its ancestors, but the half-don't work isn't an ancestor so it doesn't get pushed
hg update HALFDONEWORK # you can find the right revision number using "hg heads"
C'est ce qu'on appelle une "branche anonyme" et c'est une façon très courante de travailler. Vous finissez par engager la fonctionnalité à moitié achevée, mais vous pouvez la reprendre plus tard et vous n'avez pas besoin de la pousser.
Ce document contient une excellente explication des branches anonymes : http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/#branching-anonymously