Mercurial annule le dernier commit

125

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

Si possible, une façon de le faire avec TortoiseHg serait préférable.

Mettre à jour

Dans mon cas concret, j'ai commis un changeset (non poussé). Ensuite, j'ai tiré et mis à jour 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 ce hg rollbackn'est pas exactement ce que je recherche, car cela annulerait le pull au lieu de mon commit.

Martin Buberl
la source
1
Qu'en est-il de faire deux hg rollback, puis de tirer à nouveau?
VonC le
1
Le premier rollback annule l'extraction, le second rollback m'indique "aucune information d'annulation disponible".
Martin Buberl
1
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 auriez besoin de recloner le référentiel hg.
3
strip --keep: stackoverflow.com/questions/29413851/… résout directement la tâche, tout comme MQ qimport. Sinon, il peut être préférable de simplement rebasedans le scénario si les changements locaux doivent également être conservés et qu'il n'y a pas de conflit. (Utilisez une fusion pour conserver certaines modifications combinées des deux branches lorsque c'est l'objectif final du graphe souhaité, en particulier dans un cas non rapide.) Il peut également être valide de fermer la branche, ce qui `` préserve l'historique '' (mais différemment d'une fusion) en fonction de l'état final souhaité.
user2864740
2
Comme @ user2864740 dit, hg strip --keepest la commande ne pas utiliser, mais vous devez fournir une révision, par exemple: hg strip --keep -r .. Cette réponse explique bien stackoverflow.com/a/19064016/1286571
ForeverWintr

Réponses:

77

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

Veuillez utiliser à la hg commit --amendplace derollback pour corriger les erreurs du dernier commit.

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

Lors de la validation ou de la fusion , Mercurial ajoute l' entrée de l' ensemble de modifications 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 créer des revlogs uniquement en append. Le journal des transactions permet également une opération d'annulation.

Voir la section Récupération de TortoiseHg :

texte alternatif

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

  • ' 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'auparavant.
    Vous pouvez déclencher manuellement une restauration avec «hg rollback». Cela annulera la dernière commande transactionnelle. Si une commande pull a apporté 10 nouveaux ensembles de modifications dans le référentiel sur différentes branches, alors « hg rollback» les supprimera tous. Remarque: il n'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 appliquer à nouveau si vous en avez besoin.

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

Vous pouvez «annuler la validation» des fichiers en les oubliant d'abord, par exemple hg forget filea; hg commit --amend:, mais cela semble peu intuitif.
hg strip --keepest probablement une meilleure solution pour le mercure moderne.

VonC
la source
Lorsque je comprends cela, la restauration supprime la dernière transaction. Dans mon cas, j'ai fait un commit, puis j'ai tiré du serveur. Alors, cela signifie-t-il que je annulerais le pull au lieu de commettre?
Martin Buberl
1
@Martin Buberl: Selon selenic.com/mercurial/hg.1.html#rollback , pull est considéré comme une transaction. Donc, si vous avez tiré, l'exécution hg rollbackannulera l'extraction au lieu de la validation.
Tim Henigan
2
Je ne sais pas comment hg commit --amendest censé fonctionner, mais pour moi, cela m'a donné un éditeur pour modifier le message de validation et aucune méthode pour modifier les fichiers inclus. J'ai quitté l'éditeur sans enregistrer et j'ai constaté que mon commit erroné avait été modifié pour inclure TOUS les fichiers modifiés!
Tim Tisdall
2
Je ne sais pas comment répondre à la question en utilisant hg commit --amend. Vous pouvez «annuler la validation» des fichiers en les hg forgetajoutant d' abord , par exemple hg forget filea; hg commit --amend:, mais cela semble peu intuitif. hg strip --keep est probablement une meilleure solution pour le hg moderne.
ForeverWintr
1
@JasonS book.mercurial-scm.org/read/… est une bonne lecture, même si dans votre cas, vous pouvez également envisager de réinitialiser hg: stackoverflow.com/a/31302998/6309
VonC
46

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

Pour utiliser strip, vous devrez 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» -> «Supprimer».

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

Peter Graham
la source
2
SI la révision en question est toujours dans le brouillon de phrase (ou si vous avez accès à TOUS les dépôts vers lesquels elle a été poussée / tirée et appliquez la bande à tous) (ce qui est le cas dans cette description) alors c'est sooo la meilleure et la plus propre option.
GazB
4
Si TortoiseHg est installé, il existe une interface graphique pour activer globalement mq. Dans la version actuelle: activez "fichier-> paramètres-> onglet paramètres globaux-> extensions-> mq" ou accédez au fichier de paramètres via le bouton "Modifier le fichier".
David
19

Puisque vous ne pouvez pas revenir en arrière, vous devez 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 cette astuce .

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 de la révision actuellement extraite, et aucune des modifications de la révision non extraite (celle que vous avez écrite et que vous ne voulez plus).

C'est un excellent moyen de le faire, car cela permet de garder votre historique précis et complet. Si dans 2 ans quelqu'un trouve un bogue dans ce que vous avez abattu, 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". :)

Ry4an Brase
la source
5

hg rollback est ce que vous voulez.

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

texte alternatif

Tim Henigan
la source
1
J'ai fait un commit, puis un pull et update / sync. Avec ces nouveaux changements que j'ai, 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.
Martin Buberl
La restauration est désormais obsolète.
UpTheCreek
Dans la version actuelle de Tortoise HG, vous pouvez accéder à l'option Rollback / Undo à partir de l'élément de menu Repository.
daveywc
Citation @UpTheCreek nécessaire.
DanMan
@DanMan - vérifiez le lien qu'il a fourni.
UpTheCreek
3

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

TmTron
la source
1

Sa solution de contournement.

Si vous ne poussez pas vers le serveur, vous clonerez dans un nouveau dossier, sinon supprimerez (supprimez tous les fichiers) de votre dossier de référentiel et clonerez un nouveau.

ITsDEv
la source
0

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

cabhishek
la source