web-dev-qa-db-fra.com

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

J'utilise Mercurial localement pour un projet (c'est le seul référentiel où il est impossible de pousser/tirer vers/de nulle part ailleurs).

À ce jour, il possède une histoire linéaire. Cependant, je réalise maintenant que je travaille sur une chose qui est terrible et je veux revenir à la version avant de la démarrer et la mettre en œuvre de manière différente.

Je suis un peu confus avec les commandes branch/revert/update -C dans Mercurial. En gros, je veux revenir à la version 38 (actuellement sur 45) et laisser mes prochains commits avoir 38 ans en tant que parent et continuer à partir de là. Je me fiche de savoir si les révisions 39 à 45 sont perdues à jamais ou se retrouvent dans une branche sans issue.

De quelle commande/ensemble de commandes ai-je besoin?

248
Paolo
hg update [-r REV]

Si vous vous engagez plus tard, vous créerez effectivement une nouvelle branche. Ensuite, vous pouvez continuer à travailler uniquement sur cette branche ou éventuellement y fusionner celle existante.

148
van

Voici la feuille de triche sur les commandes:

  • hg update modifie votre révision parente de la copie de travail et modifie également le contenu du fichier pour correspondre à cette nouvelle révision parente. Cela signifie que les nouvelles mises à jour continueront à partir de la révision mise à jour.

  • hg revert modifie uniquement le contenu du fichier et laisse la révision parente de la copie de travail seule. Vous utilisez généralement _hg revert_ lorsque vous décidez que vous ne souhaitez pas conserver les modifications non validées que vous avez apportées à un fichier dans votre copie de travail.

  • hg branch démarre une nouvelle branche nommée. Pensez à une branche nommée comme une étiquette que vous affectez aux ensembles de modifications. Donc, si vous faites _hg branch red_, alors les changesets suivants seront marqués comme appartenant à la branche "rouge". Cela peut constituer un bon moyen d’organiser les ensembles de modifications, en particulier lorsque différentes personnes travaillent dans différentes branches et que vous souhaitez ensuite voir d’où provient un ensemble de modifications. Mais vous ne voulez pas l'utiliser dans votre situation.

Si vous utilisez _hg update --rev 38_, les jeux de modifications 39 à 45 resteront comme une impasse - une tête pendante comme nous l'appelons. Vous recevrez un avertissement lorsque vous appuierez sur la création de "plusieurs têtes" dans le référentiel vers lequel vous appuyez. L'avertissement est là car il est un peu impoli de laisser de telles têtes, car ils suggèrent que quelqu'un doit faire une fusion. Mais dans votre cas, vous pouvez simplement 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 39-45 ailleurs, vous pouvez la garder privée. C'est très simple: avec _hg clone --rev 38 foo foo-38_, vous obtiendrez un nouveau clone local ne contenant que jusqu'à la révision 38. Vous pouvez continuer à travailler dans _foo-38_ et pousser les nouveaux (bons) jeux de modifications que vous créez. 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 à _foo-bad_ et _foo-38_ à foo.)

Enfin, vous pouvez également utiliser _hg revert --all --rev 38_ puis commit. Cela créera une révision 46 qui ressemblera à la révision 38. Vous continuerez ensuite à travailler à partir de la révision 46. Cela ne créera pas de fork dans l'historique de la même manière explicite que _hg update_, mais vous ne se plaint pas d'avoir plusieurs têtes. J'utiliserais _hg revert_ si je collaborais avec d'autres personnes qui ont déjà réalisé leur propre travail sur la base de la révision 45. Sinon, _hg update_ est plus explicite.

398
Martin Geisler

Je viens de rencontrer un cas de nécessité de restaurer un seul fichier à la révision précédente, juste après avoir validé et envoyé. La syntaxe abrégée pour spécifier ces révisions n'est pas couverte par les autres réponses, alors voici la commande pour le faire

hg revert path/to/file -r-2

Ce -2 reviendra à la version antérieure à la dernière validation. Utiliser -1 reviendrait simplement à annuler les modifications en cours non validées.

29
hyde

IMHO, hg strip -r 39 convient mieux à cette affaire.

Cela nécessite que l'extension mq soit activée et a les mêmes limites que la "méthode de référentiel de clonage" recommandée par Martin Geisler. votre repo local.

7
magras

Après avoir utilisé hg update -r REV, la réponse à la question de savoir comment appliquer cette modification n’était pas claire, de sorte que vous puissiez ensuite appuyer sur Push.

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

Je devais d'abord modifier n'importe quel fichier (par exemple, dans un fichier README) pour que Mercurial sache que j'ai effectué une nouvelle modification, puis je pourrais le valider.

Cela a ensuite créé deux têtes comme mentionné.

Pour me débarrasser de l’autre tête avant de pousser, j’ai ensuite suivi l’étape No-Op Merges pour remédier à cette situation.

Je pouvais alors pousser.

6
Brian Gershon

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

hg revert --all --rev ${1}

hg commit -m "Restoring branch ${1} as default"

${1} est le numéro de la révision ou le nom de la branche. Ces deux lignes font en réalité partie d'un script bash, mais elles fonctionnent bien si vous voulez le faire manuellement.

Ceci est utile si vous devez ajouter un correctif à une branche de version, mais que vous devez créer à partir de la valeur par défaut (jusqu'à ce que nos outils de CI soient corrects et capables de créer à partir de branches, puis de supprimer les branches de version).

5
Brian Carr

J'installerais Tortoise Hg (une interface graphique gratuite pour Mercurial) et l'utiliserais. Vous pouvez ensuite cliquer avec le bouton droit de la souris sur une révision à laquelle vous souhaitez retourner (avec tous les messages de validation là devant vos yeux) et sur "Rétablir tous les fichiers". Il est intuitif et facile de passer d’une version à l’autre d’un ensemble de fichiers à l’autre, ce qui peut s'avérer très utile si vous souhaitez établir à quel moment un problème est apparu.

1
Geoff Kendall