Supprimer toutes les modifications locales et revenir à l’arborescence

J’utilise Mercurial et j’ai eu de terribles dégâts localement, avec trois têtes. Je ne peux pas pousser, et je veux juste supprimer tous mes changements locaux et commettre et recommencer avec un code totalement propre et un historique propre.

En d’autres termes, je veux me retrouver avec (a) exactement le même code que celui existant dans la twig distante et (b) aucun historique de commits locaux.

Je sais que la hg update -C écrase tous les changements locaux. Mais comment supprimer des commits locaux?

Pour être clair, je n’ai aucun intérêt à préserver le travail que j’ai effectué localement. Je veux juste le moyen le plus simple de revenir à une caisse locale totalement propre.

Lorsque le moyen le plus simple (un nouveau hg clone ) n’est pas pratique, j’utilise hg ssortingp , qui vient avec l’extension mq :

 % hg outgoing -l 1 % hg ssortingp $rev # replace $rev with the revision number from outgoing 

Répétez jusqu’à ce que le hg outgoing restant rest calme. Notez que hg ssortingp $rev oblitère $rev et tous ses descendants.

PS: une approche encore plus intelligente consiste à utiliser le langage revset et à faire:

 % hg ssortingp 'roots(outgoing())' 

Vous voudrez créer un clone local où vous ne conserverez que les modifications qui sont également présentes dans le référentiel distant. Utilisez TortoiseHg , hg log ou similaire pour savoir laquelle de vos révisions est la dernière révision que vous n’avez pas faite (celle avant le début du désordre). Utiliser hg outgoing peut aider ici – il listera tous les changements que vous avez faits – choisissez un numéro de révision plus tôt que ceux-ci.

Si la révision cible est appelée good et que votre clone s’appelle foo , alors faites:

 hg clone -r good foo foo-clean 

Ce sera une opération rapide et locale – il n’ya aucune raison de tout télécharger à nouveau . Le clone foo-clean ne contiendra que les modifications jusqu’à la révision. Vous pouvez maintenant remplacer foo-clean/.hg/hgrc par foo/.hg/hgrc afin de préserver vos parameters locaux de référentiel tels que le chemin push / pull par défaut.

Lorsque vous êtes convaincu que foo-clean a tout ce dont vous avez besoin de foo , supprimez simplement foo et renommez foo-clean en foo . Faites un hg pull pour obtenir tous les nouveaux changesets du référentiel distant dans votre clone et continuez comme d’habitude.


Si personne n’a poussé de nouveaux ensembles de modifications vers le référentiel distant, il est très simple de déterminer quelle révision vous souhaitez utiliser comme ci-dessus: hg id default vous indiquera l’ID du conseil dans le référentiel distant.

D’accord. Supprimez donc tout le contenu local, hg init le nouveau repository local et hg pull le dernier conseil que vous avez. N’oubliez pas de hg update à hg update après cela.

Vous pouvez utiliser

révision de bande de hg

pour tuer toute révision et son sous-arbre dans votre référentiel local.

https://www.mercurial-scm.org/wiki/Ssortingp

Mais n’essayez pas de l’utiliser pour tout ce qui a déjà été poussé.

Supprimez simplement tout ce que vous avez sur votre système local et re-clonez le repo distant.

  bande de hg `hg out --template" {rev} {author} \ n "|  grep YOUR_AUTHOR_NAME |  cut -d "" -f 1` 

fait le tour pour moi

Il supprime toutes les révisions qui ne sont pas envoyées au référentiel par défaut créé avec le nom de votre auteur.

Vous pouvez également utiliser ce style pour ne pas vérifier avec le référentiel par défaut mais avec un autre référentiel

  bande de hg `hg out OTHER_REPO_ALIAS --template" {rev} {author} \ n "|  grep YOUR_AUTHOR_NAME |  cut -d "" -f 1` 

Si vous utilisez TortoiseHg, un moyen simple de sortir d’un (petit) bourrage est de commencer par mettre à jour vers la dernière révision, puis sélectionnez vos modifications et lancez la “fusion avec local”. Lorsque le dialog de fusion apparaît, cliquez simplement sur la petite icône «+» pour afficher des options supplémentaires, dont l’une est «ignorer les modifications de la révision de la cible de fusion (autre)». Faire cela signifie que vos changesets seront toujours dans le repo et seront poussés, mais n’auront aucun effet, car ils seront éliminés dans la fusion. Si vous avez beaucoup de changements sur plusieurs têtes, vous ne voudrez peut-être pas polluer le repo de cette façon, mais c’est une solution simple à considérer si les modifications que vous supprimez contiennent des données que vous voudrez peut-être référencer ultérieurement.