129 votes

Mercurial undo last commit

Comment puis-je annuler ma dernière modification accidentellement commitée (non poussée) dans Mercurial ?

Si possible, un moyen de le faire avec TortoiseHg serait préférable.

Mise à jour

Dans mon cas concret, j'ai commité un changeset (pas poussé). Puis j'ai tiré et mis à jour depuis le serveur. Avec ces nouvelles mises à jour, j'ai décidé que mon dernier commit est obsolète et que je ne veux pas le synchroniser. Il semble donc que hg rollback n'est pas exactement ce que je recherche, car cela annulerait le pull au lieu de mon commit.

1 votes

Et si on faisait deux hg rollback et de tirer à nouveau ?

1 votes

Le premier rollback annule le pull, le second me dit "no rollback information available".

1 votes

J'ai rencontré la même situation, et pour autant que je sache, une fois que vous avez effectué une autre opération, vous ne pouvez pas revenir en arrière ou la supprimer de l'historique. Vous devriez cloner à nouveau le référentiel hg.

82voto

VonC Points 414372

Une façon de faire serait hg rollback (déprécié à partir de Hg2.7, août 2013)

Veuillez utiliser hg commit --amend au lieu de rollback pour corriger les erreurs de la dernière livraison.

Annule la dernière transaction dans un référentiel.

Quand commettre o fusionner Mercurial ajoute l'option changeset entrée en dernier.
Mercurial conserve un journal des transactions indiquant le nom de chaque fichier touché et sa longueur avant la transaction. En cas d'abandon, il tronque chaque fichier à sa longueur antérieure. Cette simplicité est l'un des avantages de faire de revlogs en annexe seulement. Le journal des transactions permet également une opération d'annulation.

Voir Section de rétablissement de la tortueHg :

alt text

Ce fil détaille également la différence entre hg rollback y hg strip :
(écrit par Martin Geisler qui contribue également à l'OS)

  • ' hg rollback ' supprimera la dernière transaction. Les transactions sont un concept que l'on retrouve souvent dans les bases de données. Dans Mercurial, nous démarrons une transaction lorsque certaines opérations sont exécutées, telles que commit, push, pull...
    Lorsque l'opération se termine avec succès, la transaction est marquée comme terminée. Si une erreur se produit, la transaction est "annulée" et le référentiel est laissé dans le même état qu'avant.
    Vous pouvez déclencher manuellement un retour en arrière avec 'hg rollback'. Cela annulera la dernière commande transactionnelle. Si une commande pull a apporté 10 nouveaux changesets dans le dépôt sur différentes branches, alors ' hg rollback ' les supprimera tous. Remarque : il existe aucune sauvegarde lorsque vous annulez une transaction !

  • ' hg strip ' supprimera un changeset et tous ses descendants. Le site changesets sont sauvegardés comme un paquet, que vous pouvez appliquer à nouveau si vous si vous en avez besoin.

ForeverWintr suggère dans les commentaires (en 2016, 5 ans après)

Vous pouvez "annuler" des fichiers en les oubliant d'abord dans hg, par exemple : hg forget filea; hg commit --amend mais cela ne semble pas intuitif.
hg strip --keep est probablement une meilleure solution pour les hg modernes.

0 votes

Si je comprends bien, le rollback supprime la dernière transaction. Dans mon cas, j'ai fait un commit, puis j'ai fait un pull sur le serveur. Cela signifie-t-il que je devrais faire un rollback de l'extraction au lieu du commit ?

1 votes

@Martin Buberl : Selon selenic.com/mercurial/hg.1.html#rollback le tirage est considéré comme une transaction. Donc si vous avez tiré, exécuté hg rollback annulera le pull au lieu du commit.

0 votes

Merci, je vais modifier un peu ma question pour mieux l'indiquer.

47voto

Peter Graham Points 2630

hg strip supprimera complètement une révision (et ses descendants) du référentiel.

Pour utiliser la bande, vous devez installer MqExtension en ajoutant les lignes suivantes à votre .hgrc (ou mercurial.ini) :

[extensions]
mq =

Dans TortoiseHg la commande strip est disponible dans l'atelier. Faites un clic droit sur une révision et choisissez 'Modifier l'historique' -> 'Dépouiller'.

Desde strip modifie l'historique du dépôt, vous ne devez l'utiliser que pour les révisions qui n'ont pas encore été partagées avec qui que ce soit. Si vous utilisez mercurial 2.1+, vous pouvez utiliser phases pour suivre ces informations. Si un commit est toujours dans la phase de brouillon, il n'a pas été partagé avec d'autres dépôts, vous pouvez donc le dépouiller sans risque. (Merci à Zasurus de l'avoir signalé).

3 votes

SI la révision en question est toujours dans la phrase de brouillon (ou si vous avez accès à TOUS les repo dans lesquels elle a été poussée/tirée et que vous pouvez appliquer la bande à tous) (ce qui est le cas dans cette description), alors c'est vraiment l'option la meilleure et la plus propre.

5 votes

Si vous avez installé TortoiseHg, il y a une interface graphique pour activer globalement mq. Dans la version actuelle : activez "file->settings->global settings tab->extensions->mq" ou accédez au fichier de paramètres via le bouton "Edit file".

19voto

Ry4an Points 56453

Puisque vous ne pouvez pas revenir en arrière, vous devriez fusionner ce commit dans la nouvelle tête que vous avez obtenue lorsque vous avez tiré. Si vous ne voulez pas du travail que vous avez fait, vous pouvez facilement le faire en utilisant la commande ce conseil .

Donc si vous avez tiré et mis à jour à leur tête vous pouvez le faire :

hg --config ui.merge=internal:local merge

conserve tous les changements dans la révision actuellement extraite, et aucun des changements dans la révision non extraite (celle que vous avez écrite et que vous ne voulez plus).

C'est une excellente façon de procéder, car votre historique reste précis et complet. Si dans 2 ans quelqu'un trouve un bug dans ce que vous avez retiré, vous pouvez regarder dans votre implémentation (inutilisée mais sauvegardée) de la même chose et dire, "oh, je l'ai bien fait" :)

6voto

Tim Henigan Points 19948

hg rollback est ce que vous voulez.

Dans TortoiseHg, le hg rollback se fait dans la boîte de dialogue de validation. Ouvrez la boîte de dialogue de validation et sélectionnez "Annuler".

alt text

1 votes

J'ai fait un commit, puis un pull et un update/sync. Avec ces nouveaux changements, j'ai décidé que mon dernier commit est obsolète et je veux l'annuler. Le bouton Annuler dans TortoiseHg est désactivé dans mon cas.

0 votes

Le retour en arrière est maintenant déprécié.

0 votes

Dans la version actuelle de Tortoise HG, vous pouvez accéder à l'option Rollback/Undo à partir de l'élément de menu Repository.

0voto

cabhishek Points 287

Après avoir retiré et mis à jour votre espace de travail, faites un thg et un clic droit sur le jeu de modifications dont vous voulez vous débarrasser, puis cliquez sur modifier l'historique -> supprimer, cela supprimera le jeu de modifications et vous pointerez vers le conseil par défaut.

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