web-dev-qa-db-fra.com

Existe-t-il un moyen de supprimer les commits locaux dans Mercurial?

Donc, je continue à faire une erreur stupide dans Mercurial. Souvent, je commence à travailler sans faire de "hg pull" ni de "hg update". Lorsque j'essaie de pousser mes modifications, j'obtiens une erreur.

Est-il possible de supprimer mon commits locaux afin d'éviter de créer plusieurs têtes, branches, etc.? Je souhaite simplement supprimer mes commits locaux, fusionner mes modifications avec le conseil, puis procéder à une nouvelle validation. Cela semble simple, non? Je n'arrive pas à trouver un moyen de supprimer facilement commits locaux pour pouvoir fusionner proprement avec le conseil.

Encore une fois, j'essaye seulement de supprimer les commits locaux faits avec "hg ci". Je ne veux pas modifier les fichiers, revenir, etc.

201
user191535

Activez l’extension " Strip " et tapez ce qui suit:

hg strip #changeset# --keep

#changeset# est le hachage du jeu de modifications à supprimer. Cela supprimera le changeset mentionné , y compris les changeset qui en descendent et laissera votre répertoire de travail intact . Si vous souhaitez également annuler vos modifications de code engagé, supprimez l'option --keep.

Pour plus d'informations, consultez le Strip Extension .

Si vous obtenez "commande inconnue 'strip'", vous devrez peut-être l'activer. Pour ce faire, recherchez le fichier .hgrc ou Mercurial.ini et 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 devriez pas utiliser la commande de bande pour lutter contre cela. Au lieu de cela, vous devez fusionner votre tête avec la tête entrante, résoudre tous les conflits, tester, puis pousser.

La commande strip est utile lorsque vous souhaitez réellement vous débarrasser des ensembles de modifications qui polluent la branche. En fait, si vous êtes dans la situation de cette question et que vous souhaitez supprimer complètement tous les ensembles de modifications "brouillons" , consultez - la réponse du haut , qui suggère essentiellement de faire:

hg strip 'roots(outgoing())'
236
Samaursa

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

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

Sélectionnez ensuite la dernière révision à partir de laquelle vous souhaitez commencer la répartition, en effectuant right click dessus et en sélectionnant:

  1. Modifier l'historique
  2. Bande

Juste comme ça:

enter image description here

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

96
EliuX

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

Utilisez Phases et marquez la ou les révision (s) que vous ne voulez 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 de phase.

En outre: Vous pouvez également utiliser l'extension "rebase" pour déplacer vos commits locaux vers la tête du référentiel partagé une fois que vous avez extrait.

20
Tom Leys

Comme tout le monde le fait remarquer, vous devriez probablement 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 -r votre repo pour obtenir tous, sauf ces changements.

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

15
Ry4an Brase

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

$ hg rollback

Mais hg rollback revient à la dernière validation, pas aux 2 validations. À ce moment-là, je ne m'en suis pas rendu compte et j'ai changé le code.

Quand j'ai trouvé que hg rollback venait d'annuler un commit, j'ai découvert que je pouvais utiliser hg strip #changeset#. J'ai donc utilisé hg log -l 10 pour rechercher les 10 derniers commits et obtenir le bon jeu de modifications que je souhaitais 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 signifie abort: local changes found? Cela signifie que hg a trouvé des modifications du code qui n'ont pas encore été validées. Donc, pour résoudre ce problème, vous devez hg diff enregistrer le code que vous avez modifié et hg revert et 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#

Une fois que vous avez effectué ce qui précède, vous pouvez patch le fichier diff et votre code peut être rajouté à votre projet.

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

Vous pouvez contourner cela encore plus facilement avec le extension Rebase , utilisez simplement hg pull --rebase et vos validations seront automatiquement ré-validées dans la révision extraite, évitant ainsi le problème de ramification.

9
too much php

Si vous êtes familier avec git, vous serez heureux d'utiliser histedit qui fonctionne comme git rebase -i.

5
neo

hg strip est ce que vous recherchez. C'est analogue à git reset si vous êtes familier avec git.

Utiliser 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 commettre que vous recherchez. Vous avez besoin d'un numéro à 4 chiffres de la ligne de changement de ligne changeset: 5888:ba6205914681

  2. Puis hg strip -r 5888 --keep. Cela supprime l'enregistrement du commit mais conserve tous les fichiers modifiés et vous pouvez ensuite les réitérer. (si vous voulez supprimer des fichiers, supprimez simplement --keep hg strip -r 5888

4
val.sytch