web-dev-qa-db-fra.com

Mercurial annule le dernier commit

Comment annuler mon dernier changement dans Mercurial, commis accidentellement (non poussé)?

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

Mise à jour

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

122
Martin Buberl

Une façon serait hg rollback (obsolète à partir de Hg2.7, août 2013)

Veuillez utiliser hg commit --amend au lieu de rollback pour corriger les erreurs du dernier commit.

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

Lorsque validation ou fusion , Mercurial ajoute l’entrée changeset en dernier.
Mercurial tient un journal des transactions avec le nom de chaque fichier touché et sa longueur avant la transaction. En cas d'abandon, il tronque chaque fichier à sa longueur précédente. Cette simplicité est l’un des avantages de faire revlogs append-only. Le journal des transactions permet également une opération d'annulation.

Voir section TortoiseHg Recovery :

alt text

Ce fil détaille également la différence entre hg rollback et hg strip:
(écrit par Martin Geisler qui contribue également à SO)

  • 'hg rollback 'enlèvera la dernière transaction. Les transactions sont un concept souvent trouvé dans les bases de données. Dans Mercurial, nous commençons 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 reste dans le même état qu'auparavant.
    Vous pouvez déclencher manuellement une annulation avec 'annulation hg'. Cela annulera la dernière commande transactionnelle. Si une commande pull apporte 10 nouveaux ensembles de modifications dans le référentiel sur différentes branches, alors 'hg rollback 'les supprimera tous. Remarque: il y a pas de sauvegarde lorsque vous annulez une transaction!

  • 'hg strip 'supprimera un changeset et tous ses descendants. Les ensembles de modifications sont enregistrés en tant qu'ensemble que vous pouvez réappliquer si vous avez besoin de les récupérer.

ForeverWintr suggère dans les commentaires (en 2016, 5 ans plus tard)

Vous pouvez "annuler la validation" de fichiers en commençant par les oublier, par exemple: hg forget filea; hg commit --amend, mais cela ne semble pas intuitif.
hg strip --keep est probablement une meilleure solution pour le hg moderne.

74
VonC

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

Pour utiliser strip, vous devez installer MqExtension en ajoutant les lignes suivantes à votre fichier .hgrc (ou Mercurial.ini):

[extensions]
mq =

Dans TortoiseHg, la commande strip est disponible dans le workbench. Faites un clic droit sur une révision et choisissez 'Modifier l'historique' -> 'Strip'.

Puisque strip change l'historique du référentiel, vous ne devriez l'utiliser que sur des révisions qui n'ont encore été partagées avec personne. Si vous utilisez Mercurial 2.1+, vous pouvez utiliser phases pour suivre ces informations. Si un commit est toujours en phase de projet, il n'a pas été partagé avec d'autres référentiels, vous pouvez donc le supprimer en toute sécurité. (Merci à Zasurus pour l'avoir signalé).

44
Peter Graham

Puisque vous ne pouvez pas revenir en arrière, vous devriez fusionner cet engagement dans la nouvelle tête que vous aviez lorsque vous avez tiré. Si vous ne voulez pas du travail que vous avez fait, vous pouvez facilement le faire en utilisant this tip .

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

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

conserve toutes les modifications dans la révision actuellement extraite, et aucune des modifications dans la révision non extraite (celle que vous avez écrite et que vous ne souhaitez plus).

C’est un excellent moyen de le faire car cela permet de garder votre historique exact et complet. Si, dans 2 ans, quelqu'un trouve un bogue dans ce que vous avez retiré, vous pouvez regarder dans votre implémentation (non utilisée mais sauvegardée) de la même chose et aller: "oh, je l'ai bien fait". :)

19
Ry4an Brase

hg rollback est ce que vous voulez.

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

alt text

5
Tim Henigan

Dans la version actuelle de TortoiseHg Workbench 4.4.1 (07.2018), vous pouvez utiliser Repository - Rollback/undo...:
enter image description here

2
TmTron

après avoir extrait et mis à jour votre espace de travail, faites un clic droit sur le groupe de modifications dont vous souhaitez vous débarrasser, puis cliquez sur modifier l'historique -> la bande, cela supprimera le groupe de modifications et vous indiquerez le conseil par défaut.

0
cabhishek

Sa solution de contournement.

Si vous n’appliquez pas au serveur Push, vous clonerez dans un nouveau dossier, sinon laver (supprimer tous les fichiers) de votre dossier de référentiel et en cloner un nouveau.

0
ITsDEv