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.