Mercurial : éditer l'historique d'un dépôt (les changesets) avec les MQ
J’ai toujours[1] cru qu’on ne pouvait éditer l’historique des ‘changesets’ de Mercurial, mais en fait si ! Et c’est grâce à ce billet sur le blog de Jesper Noehr (un des gars derrière bitbucket) que j’ai découvert qu’en fait c’est tout à fait possible.
En utilisant les MQ (mercurial queues) dont je vous ai déjà parlé, il est donc tout à fait possible de rééditer des modifications déjà enregistrées (committées) dans votre dépôt Mercurial.
Bien évidemment, ce genre de manipulations n’est possible que si vous contrôlez votre dépôt et ses éventuels clones. Dès l’instant où celui-ci a pu être cloné, vous avez perdu la maîtrise de votre code et les modifications sur lesquelles vous voulez revenir sont déjà parties.
Nous sommes dans un dépôt test avec 3 changesets
$ hg log changeset: 2:6a2d12a15cda tag: tip summary: modifications de a et b changeset: 1:ca5faf3b4493 summary: ajout de b changeset: 0:66545c7be018 summary: ajout de a
et nous souhaitons revenir sur les changesets 1 et 2.
Nous initialisons d’abord un dépôt de MQ si ce n’est pas déjà fait
$ hg qinit -c
[2]
Puis nous importons les changesets que nous voulons modifier
$ hg qimport -r 2:1
Si on regarde maintenant le log
changeset: 2:6a2d12a15cda tag: qtip tag: 2.diff tag: tip summary: modification de a et b changeset: 1:ca5faf3b4493 tag: 1.diff tag: qbase summary: ajout de b changeset: 0:66545c7be018 tag: qparent summary: ajout de a
on retrouve bien nos 3 différents changesets sauf que les 2 derniers sont différents : ce sont maintenant des patchs sous forme MQ que nous pouvons alors manipuler de façon classique[3]
On peut donc dépiler tous les patchs pour revenir dans l’état qu’on voulait avant les changesets 1 et 2
$ hg qpop -a Patch queue now empty $ hg log changeset: 0:66545c7be018 tag: tip summary: ajout de a
On peut alors à coup de hg qpush/hg qpop empiler/dépiler nos patchs afin de les modifier, les réorganiser ou ajouter des changesets, et donc revenir sur l’historique de notre dépôt.
J’ai découvert qu’en fait cette information est également disponible sur le site de Mercurial, voyez http://www.selenic.com/mercurial/wi…
Notes
[1] “toujours” est peut-être un trop grand mot, ça ne fait pas non plus si longtemps que ça que je connais Mercurial ;-)…
[2] tant qu’à faire nous ajoutons -c pour avoir un dépôt MQ ‘versionnable’
[3] je vous renvoie vers les chapitre 12 et 13 du hgbook pour plus d’infos