249 votes

Mercurial — revenir à l’ancienne version et continuer a partir de là

Je suis en utilisant Mercurial localement pour un projet (c'est le seul repo il n'y a pas de pousser/tirer les vers/à partir de n'importe où ailleurs).

À ce jour, il a une histoire linéaire. Par contre, la chose dont je suis le travail que j'ai réalisé aujourd'hui est un terrible approche, et je veux revenir à la version d'avant je l'ai commencé à la mettre en œuvre d'une manière différente.

Je suis un peu confus avec l' branch / revert / update -C commandes Mercurial. Fondamentalement, je veux revenir à la version 38 (actuellement sur 45) et de mon côté s'engage 38 en tant que parent et de poursuivre à partir de là. Je ne m'inquiète pas si les révisions de 39-45 sont perdus pour toujours ou vous retrouver dans une impasse direction de leur propre.

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

403voto

Martin Geisler Points 44779

Voici la feuille de triche sur les commandes:

  • hg update des changements de votre copie de travail révision parent et modifie également le contenu du fichier pour correspondre à cette nouvelle révision parent. Cela signifie que les nouvelles révisions vont continuer sur la révision de la mise à jour.

  • hg revert modifie le contenu d'un fichier seulement et laisse la copie de travail de révision parent seul. 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 nommée. Pensez à une branche nommée comme une étiquette que vous attribuez à la révision. Donc, si vous n' hg branch red, alors la suite des révisions seront marqués comme appartenant à la "rouge" de la branche. Cela peut être une belle façon d'organiser les révisions, particulièrement lorsque plusieurs personnes travaillent sur les différentes branches et que vous souhaitez voir d'où un ensemble de modifications proviennent. Mais vous ne voulez pas l'utiliser dans votre situation.

Si vous utilisez hg update --rev 38, puis les révisions de 39-45 sera laissé comme un mort de fin une balançant la tête, comme nous l'appelons. Vous recevez un avertissement lorsque vous appuyez puisque vous allez créer "plusieurs têtes" dans le référentiel de vous pousser à. L'avertissement est là depuis 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 simplement aller de l'avant et de l' hg push --force depuis que vous avez vraiment ne voulez laisser pendre.

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 contient uniquement des révisions 38. Vous pouvez continuer à travailler dans foo-38 et insérez-le (bon) révisions que vous créez. Vous aurez encore l'ancien (mauvais) des révisions de votre foo clone. (Vous êtes libre de renommer les clones toutefois vous souhaitez, par exemple, foo de foo-bad et foo-38 de foo.)

Enfin, vous pouvez également utiliser hg revert --all --rev 38 puis valider. Cela va créer une révision 46, qui ressemble à de révision 38. Vous pourrez ensuite continuer à travailler de la révision 46. Cette habitude de créer une branche dans l'histoire de la même façon explicite comme hg update a fait, mais d'un autre côté on ne pourra pas se plaint d'avoir plusieurs têtes. Je voudrais utiliser hg revert si je devais collaborer avec d'autres personnes qui ont déjà fait leur propre travail basé sur la révision de 45. Sinon, hg update est plus explicite.

151voto

van Points 18052
<pre><code></code><p>Si plus tard vous vous engagez, vous allez effectivement créer une nouvelle branche. Vous pourriez ensuite continuer à travailler uniquement sur cette branche ou éventuellement fusionner celui existant dedans.</p></pre>

31voto

hyde Points 13720

J’ai juste rencontré un cas de devoir revenir un seul fichier à la précédente révision, juste après que je l’avais fait commit et pousser. La syntaxe abrégée pour spécifier ces révisions n’est pas couvert par les autres réponses, alors voici la commande pour le faire

Que va revenir à la version avant dernier commit, en utilisant reviendrait juste actuelles modifications non validées.

7voto

Petr Pervukhin Points 73

À mon humble avis, `` convient mieux à cette affaire.

Il nécessite mq extension soit activé et a les mêmes limitations que le clonage méthode repo qui a été recommandé par Martin Geisler : si l’ensemble de modifications a été publiée en quelque sorte, il va revenir (probablement) votre repo quelque temps, parce que vous aviez modifié votre repo local uniquement.

6voto

Brian Gershon Points 81

Après l'utilisation de hg update -r REV il n'était pas clair dans la réponse sur la façon de s'engager à ce que le changement de sorte que vous pouvez pousser.

Si vous essayez juste de s'engager après la mise à jour, Mercurial ne pense pas qu'il y a des changements.

J'ai dû d'abord faire un changement de tout type de fichiers (mot à dire dans le fichier README), de sorte Mercurial reconnu que j'ai fait un nouveau changement, alors je pourrais commettre.

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

Pour se débarrasser de l'autre de la tête avant de pousser, j'ai ensuite suivi la Non-Op Fusionne étape pour remédier à cette situation.

J'ai ensuite été en mesure de pousser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X