Existe-t-il un moyen de supprimer les validations locales dans Mercurial?

209

Je continue donc à faire une erreur stupide dans Mercurial. Souvent, je vais commencer à travailler sans faire de "hg pull" et de "hg update". Lorsque j'essaie de pousser mes modifications, j'obtiens une erreur.

Existe-t-il un moyen de supprimer mes validations locales pour éviter de créer plusieurs têtes, branches, etc.? Je veux simplement supprimer mes validations locales, fusionner mes modifications avec le conseil, puis réengager. Cela semble simple, non? Je n'arrive pas à trouver un moyen de supprimer facilement les commits locaux afin que je puisse fusionner proprement avec le conseil.

Encore une fois, j'essaie seulement de supprimer les validations locales faites avec "hg ci". Je ne veux pas modifier des fichiers, revenir en arrière, etc.

user191535
la source
12
Ce n'est pas une erreur stupide, c'est un flux de travail normal lorsque plusieurs personnes travaillent simultanément avec le même référentiel.
Juozas Kontvainis

Réponses:

247

Activez l' extension " strip " et tapez ce qui suit:

hg strip #changeset# --keep

Où se #changeset#trouve le hachage de l'ensemble de modifications que vous souhaitez supprimer. Cela supprimera ledit ensemble de modifications, y compris les ensembles de modifications qui en découlent, et laissera votre répertoire de travail intact . Si vous souhaitez également annuler vos modifications de code validées, supprimez l' --keepoption.

Pour plus d'informations, consultez l' extension de bande .

Si vous obtenez une "bande de commande inconnue", vous devrez peut-être l'activer. Pour ce faire, recherchez le fichier .hgrcou Mercurial.iniet ajoutez-y les éléments suivants:

[extensions]
strip =

Notez que (comme Juozas l'a mentionné dans son commentaire) avoir plusieurs têtes est un flux de travail normal dans Mercurial. Vous ne devez pas utiliser la commande strip pour lutter contre cela. Au lieu de cela, vous devez fusionner votre tête avec la tête entrante, résoudre tout conflit, tester, puis pousser.

La stripcommande est utile lorsque vous voulez vraiment vous débarrasser des changesets qui polluent la branche. En fait, si vous êtes dans la situation de cette question et que vous souhaitez supprimer définitivement tous les ensembles de modifications "brouillon" , consultez la première réponse , qui suggère essentiellement de faire:

hg strip 'roots(outgoing())'
Samaursa
la source
8
@Bharath: Vous devez activer l'extension
Samaursa
1
Depuis mercurial 2.8, strip est une extension autonome, donc ça strip = va. WhatsNew pour Mercurial 2.8
Chih-Hsuan Yen
104

Si vous utilisez Hg Tortoise, activez simplement l'extension " strip " dans:

  1. Fichier / Paramètres / Extensions /
  2. Sélectionnez la bande

Sélectionnez ensuite la révision inférieure à partir de l'endroit où vous souhaitez commencer l'entrelacement, en faisant right clickdessus, et en sélectionnant:

  1. Modifier l'historique
  2. Bande

Juste comme ça:

entrez la description de l'image ici

Dans cet exemple, il effacera de la 19e révision à la dernière validée (22).

EliuX
la source
2
File/Settings/Extensions/J'aimerais pouvoir ajouter plus de votes. Merci beaucoup!
dyatchenko
Argh! J'ai essayé ceci mais il a semblé vider toutes mes modifications malgré le fait de ne pas cocher «aucune sauvegarde» ou «ignorer les modifications locales». Je voulais garder ces changements, mais pas les commettre! Existe-t-il un moyen de les récupérer maintenant ??
Tim Tisdall
2
Je n'arrive pas à trouver un moyen de le faire correctement, mais il semble que le contenu que vous devez passer soit conservé --keepet TortoiseHg ne donne pas cette option. Donc ... vous devez le faire en ligne de commande avec hg strip -r . --keep.
Tim Tisdall
3
from strip help: 'Tous les changesets supprimés sont stockés dans ".hg / strip-backup" en tant qu'ensemble (voir "hg help bundle" et "hg help unbundle"). Ils peuvent être restaurés en exécutant "hg unbundle .hg / strip-backup / BUNDLE", où BUNDLE est le fichier d'ensemble créé par la bande. '
Tim Tisdall
Dans SourceTree, c'était également utile. Merci!
Ponomarenko Oleh
22

Réponse moderne (uniquement pertinente après Mercurial 2.1):

Utiliser des phases et marquez les révisions que vous ne souhaitez pas partager comme secrètes (privées). De cette façon, lorsque vous poussez, ils ne seront pas envoyés.

Dans TortoiseHG, vous pouvez cliquer avec le bouton droit sur un commit pour changer sa phase.

Aussi: Vous pouvez également utiliser l'extension "rebase" pour déplacer vos validations locales vers la tête du référentiel partagé après avoir tiré.

Tom Leys
la source
Privé == secret maintenant
Dmitry Osinovskiy
15

Comme tout le monde le fait remarquer, vous devriez probablement simplement tirer puis fusionner les têtes, mais si vous voulez vraiment vous débarrasser de vos commits sans aucun des outils EditingHistory , vous pouvez simplement hg clone -rvotre repo pour obtenir tout sauf ces changements.

Cela ne les supprime pas du référentiel d'origine, mais cela crée un nouveau clone qui ne les a pas. Ensuite, vous pouvez supprimer le dépôt que vous avez modifié (si vous le souhaitez).

Ry4an Brase
la source
"Hg clone -r" supprime-t-il les modifications locales? Je veux juste supprimer les commits locaux pour garder les choses simples.
user191535
4
Il ne les supprime pas du référentiel cloné, mais il crée un nouveau clone qui ne les a pas. Ensuite, vous pouvez supprimer le référentiel que vous avez modifié si vous le souhaitez.
Ry4an Brase
9

J'ai aussi rencontré ce problème. J'ai fait 2 commitet je voulais annuler et supprimer les deux validations.

$ hg rollback

Mais hg rollbackrevient simplement au dernier commit, pas aux 2 commits. A cette époque, je ne m'en rendais pas compte et j'ai changé le code.

Quand j'ai découvert que je hg rollbackvenais d'annuler un commit, j'ai trouvé que je pouvais l'utiliser hg strip #changeset#. Donc, j'avais l'habitude hg log -l 10de trouver les 10 derniers commits et d'obtenir le bon ensemble de modifications que je voulais strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<[email protected]>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<[email protected]>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

Que veut abort: local changes founddire? Cela signifie que les hgmodifications trouvées au code n'ont pas encore été validées. Donc, pour résoudre ce problème, vous devez hg diffenregistrer le code que vous avez modifié et hg revertet hg strip #changeset#. Juste comme ça:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

Après avoir fait ce qui précède, vous pouvez patchle fichier diff et votre code peut être ajouté à votre projet.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
GoingMyWay
la source
9

Vous pouvez contourner ce problème encore plus facilement avec l' extension Rebase , utilisez simplement hg pull --rebaseet vos validations sont automatiquement réengagées dans la révision extraite, évitant ainsi le problème de branchement.

trop de php
la source
1
Au détriment d'avoir un historique inexact et une possible corruption si vous faites des choses mal.
Ry4an Brase,
5

Si vous connaissez git, vous serez heureux d'utiliser histedit qui fonctionne comme git rebase -i.

néo
la source
4

hg stripest ce que vous recherchez. C'est analogue àgit reset si vous connaissez git.

Utilisez la console:

  1. Vous devez connaître le numéro de révision. hg log -l 10. Cette commande affiche les 10 derniers commits. Trouvez le commit que vous recherchez. Vous avez besoin d'un numéro à 4 chiffres de la ligne de modificationchangeset: 5888:ba6205914681

  2. Alors hg strip -r 5888 --keep. Cela supprime l'enregistrement de la validation mais conserve tous les fichiers modifiés et vous pouvez ensuite les recommencer. (si vous voulez supprimer des fichiers pour simplement supprimer --keephg strip -r 5888

val.sytch
la source
1

[Hg Tortoise 4.6.1] S'il s'agit d'une action récente, vous pouvez utiliser l'action "Rollback / Undo" (Ctrl + U).

HG Tortoise Image

Tomas
la source
Vérifiez l'inclusion d'une image.
Bill Keller
0

En plus de l'excellente réponse de Samaursa, vous pouvez utiliser l' evolveextension prunecomme une version sûre et récupérable stripqui vous permettra de revenir en arrière si vous faites quelque chose de mal.

J'ai ces alias sur mon .hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

Notez que prunedoit également --keep, tout comme strip, garder le répertoire de travail intact vous permettant de réengager les fichiers.

Euller Borges
la source