Mercurial - revenir à l'ancienne version et continuer à partir de là

J'utilise Mercurial localement pour un projet (c'est le seul repo où il n'y a pas de poussée/traction vers/depuis n'importe où ailleurs).

À ce jour, il a une histoire linéaire. Cependant, la chose actuelle sur laquelle je travaille que j'ai maintenant réalisé est une approche terrible et je veux revenir à la version avant que je l'ai commencé et l'appliquer d'une manière différente.

je suis un peu confus avec le branch / revert / update -C commandes en Mercurial. Fondamentalement, je veux revenir à la version 38 (actuellement sur 45) et avoir mes prochaines propagations ont 38 comme parent et continuer à partir de là. Je me fiche que les révisions 39-45 soient perdues à jamais ou finissent dans une branche sans issue.

de quelle commande / série de commandes ai-je besoin?

235
demandé sur van 2010-03-29 22:53:43

7 réponses

hg update [-r REV]

si plus tard vous vous engagez, vous créerez effectivement une nouvelle branche. Vous pourriez alors continuer à travailler uniquement sur cette branche ou éventuellement y fusionner la branche existante.

142
répondu van 2010-03-29 18:56:50

Voici la feuille de tricherie sur les commandes:

  • hg update modifie la révision parent de votre copie de travail et modifie également le contenu du fichier pour correspondre à cette nouvelle révision parent. Cela signifie que new commits continuera à partir de la révision à laquelle vous mettez à jour.

  • hg revert modifie uniquement le contenu du fichier et laisse la copie de travail révision des parents seule. Vous utilisez généralement hg revert lorsque vous décidez que vous ne voulez pas conserver le uncommited modifications que vous avez apportées à un fichier dans votre copie de travail.

  • hg branch commence une nouvelle branche. Pensez à une branche nommée comme un label que vous assignez aux changesets. Donc si vous faites hg branch red , alors les changesets suivants seront marqués comme appartenant à la branche "rouge". Cela peut être une bonne façon d'organiser les ensembles de modifications, surtout quand différentes personnes travaillent sur différentes branches et que vous voulez voir plus tard d'où provient un ensemble de modifications. Mais vous ne voulez pas l'utiliser dans votre situation.

si vous utilisez hg update --rev 38 , alors les changements 39-45 seront laissés comme une impasse - une tête pendante comme nous l'appelons. Vous recevrez un avertissement lorsque vous pousserez, car vous allez créer des "Têtes multiples" dans le dépôt vers lequel vous pousserez. L'avertissement est là puisque c'est un peu impoli de laisser de telles têtes autour, car ils suggèrent que quelqu'un doit faire une fusion. Mais dans votre cas, vous pouvez juste aller de l'avant et hg push --force puisque vous voulez vraiment le laisser en suspens.

Si vous n'avez pas encore poussé la révision de 39-45 ailleurs, vous pouvez les garder privées. C'est très simple: avec hg clone --rev 38 foo foo-38 vous obtiendrez un nouveau clone local qui ne contient que la révision 38. Vous pouvez continuer à travailler dans foo-38 et pousser les nouveaux (bons) changements vous créer. Vous aurez toujours les anciennes (mauvaises) révisions dans votre clone foo . (Vous êtes libre de renommer les clones comme vous le souhaitez, par exemple foo en foo-bad et foo-38 en foo .)

enfin, vous pouvez aussi utiliser hg revert --all --rev 38 et ensuite commit. Cela créera une révision 46 qui semble identique à la révision 38. Vous continuerez ensuite à travailler à partir de la révision 46. Cela ne créera pas une fourche dans l'histoire de la même manière explicite que hg update a fait, mais d'un autre côté on ne pourra pas se plaint d'avoir plusieurs têtes. J'utiliserais hg revert si je collaborais avec d'autres qui ont déjà fait leur propre travail basé sur la révision 45. Sinon, hg update est plus explicite.

382
répondu Martin Geisler 2011-12-07 23:40:30

je viens de rencontrer un cas de nécessité de revenir à la révision précédente, juste après que j'ai fait commit et push. La syntaxe abrégée pour spécifier ces révisions n'est pas couverte par les autres réponses, donc voici la commande pour le faire

hg revert path/to/file -r-2

que -2 va revenir à la version avant la dernière propagation, en utilisant -1 va simplement revenir sur les changements non engagés actuels.

28
répondu hyde 2013-04-09 10:16:59

IMHO, hg strip -r 39 convient mieux à ce cas.

il nécessite que l'extension mq soit activée et présente les mêmes limitations que la" méthode repo cloning " recommandée par Martin Geisler: Si le jeu de modifications a été publié d'une manière ou d'une autre, il retournera (probablement) à votre repo à un moment donné parce que vous avez seulement changé votre repo local.

7
répondu magras 2016-09-20 20:13:45

après avoir utilisé hg update -r REV , il n'était pas clair dans la réponse sur la façon de commettre ce changement afin que vous puissiez ensuite pousser.

si vous essayez simplement de vous engager après la mise à jour, Mercurial ne pense pas qu'il y ait de changements.

je devais d'abord faire un changement à n'importe quel fichier (disons dans un README) si Mercurial reconnu que j'ai fait un nouveau changement, alors je pourrais commettre cela.

cela créa alors deux têtes comme mentionné.

pour me débarrasser de l'autre tête avant de pousser, j'ai alors suivi la no-Op Merges étape pour remédier à cette situation.

j'ai pu pousser.

6
répondu Brian Gershon 2013-08-16 21:54:53

les réponses ci-dessus étaient très utiles et j'ai beaucoup appris. Cependant, pour mes besoins la réponse succincte est:

hg revert --all --rev 

hg commit -m "Restoring branch  as default"

est le numéro de la révision ou le nom de la branche. Ces deux lignes font en fait partie d'un script bash, mais elles fonctionnent très bien si vous voulez le faire manuellement.

c'est utile si vous avez besoin d'ajouter une correction à chaud à une branche de publication, mais besoin de construire à partir de la valeur par défaut (jusqu'à ce que nous obtenions notre CI outils droit et capable de construire à partir de branches et ensuite faire disparaître les branches de libération aussi bien).

3
répondu Brian Carr 2018-02-01 11:05:42

j'installerais Tortoise Hg (un GUI gratuit pour Mercurial) et j'utiliserais ça. Vous pouvez ensuite cliquer avec le bouton droit de la souris sur une révision à laquelle vous voudrez peut - être retourner - avec tous les messages de propagation qui s'y trouvent devant vos yeux-et "inverser tous les fichiers". Rend intuitif et facile à rouler en arrière et en avant entre les versions d'un jeu de fichiers, ce qui peut être vraiment utile si vous cherchez à établir quand un problème est apparu pour la première fois.

1
répondu Geoff Kendall 2017-10-26 12:40:04