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

Donc je continue à faire une bêtise dans Mercurial. Souvent, je vais commencer à travailler sans faire un “pull hg” et une “mise à jour hg”. Lorsque j’essaie de pousser mes modifications, je reçois une erreur.

Est-il possible de supprimer mes commits locaux pour éviter de créer plusieurs têtes, twigs, etc.? Je veux juste supprimer mes commits locaux, fusionner mes modifications avec le conseil, puis les valider à nouveau. 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 commits locaux effectués avec “hg ci”. Je ne veux pas modifier les fichiers, revenir en arrière, etc.

Activez l’extension ” mq ” et tapez ce qui suit:

hg ssortingp #changeset# 

#changeset# est le hachage pour le changeset que vous voulez supprimer. Cela supprimera ledit ensemble de modifications, y compris les modifications qui en découlent.

Pour plus d’informations, vérifiez l’ extension de bande .

Si vous obtenez une bande de commande “inconnue”, vous devrez peut-être l’activer. Pour ce faire, recherchez le fichier .hgrc ou Mercurial.ini et ajoutez-y les éléments suivants:

 [extensions] mq = 

Notez que (comme Juozas mentionné dans son commentaire) avoir plusieurs têtes est un workflow normal dans Mercurial. Vous ne devez pas utiliser la commande ssortingp pour combattre cela. Au lieu de cela, vous devriez fusionner votre tête avec la tête entrante, résoudre tous les conflits, tester et pousser.

La commande ssortingp est utile lorsque vous voulez vraiment vous débarrasser des changesets qui polluent la twig. En fait, si vous êtes dans la situation de cette question et que vous souhaitez supprimer complètement tous les ensembles de modifications “brouillon” de manière permanente, consultez la réponse supérieure , qui suggère essentiellement:

 hg ssortingp 'roots(outgoing())' 

Si vous utilisez Hg Tortoise, activez simplement l’extension ” mq ” dans:

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

Ensuite, sélectionnez la révision du bas à partir de laquelle vous souhaitez commencer la segmentation, en faisant right click et en sélectionnant:

  1. Modifier l’historique
  2. Bande

Juste comme ça:

entrer la description de l'image ici

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

Comme tout le monde le fait remarquer, vous devriez probablement tirer et 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 toutes ces modifications. .

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

Utilisez les phases et marquez la ou les révisions que vous ne souhaitez pas partager en tant que secret (privé). De cette façon, lorsque vous appuyez, ils ne seront pas envoyés.

Dans TortoiseHG, vous pouvez faire un clic droit sur un commit pour modifier sa phase.

En outre: Vous pouvez également utiliser l’extension “rebase” pour déplacer vos commits locaux en tête du référentiel partagé une fois que vous avez tiré.

Je suis tombé sur ce problème aussi. J’ai fait 2 commit et je voulais annuler et supprimer les deux commits.

 $ hg rollback 

Mais le hg rollback arrière de hg rollback ne fait que revenir au dernier commit, pas aux 2 commits. À ce moment-là, je n’avais pas réalisé cela et j’ai changé le code.

Quand j’ai découvert que hg rollback venait de faire reculer un commit, j’ai trouvé que je pouvais utiliser hg ssortingp #changeset# . Donc, j’ai utilisé hg log -l 10 pour trouver les 10 derniers commits et obtenir le bon ensemble de modifications que je voulais ssortingp .

 $ hg log -l 10 changeset: 2499:81a7a8f7a5cd branch: component_engine tag: tip user: myname date: Fri Aug 14 12:22:02 2015 +0800 summary: get runs from sandbox changeset: 2498:9e3e1de76127 branch: component_engine user: other_user_name date: Mon Aug 03 09:50:18 2015 +0800 summary: Set current destination to a copy incoming exchange ...... $ hg ssortingp 2499 abort: local changes found 

Qu’est-ce que l’ abort: local changes found moyen? Cela signifie que hg trouvé des modifications au code qui n’ont pas encore été validées. Donc, pour résoudre ce problème, vous devez hg diff pour enregistrer le code que vous avez changé et hg revert et hg ssortingp #changeset# . Juste comme ça:

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

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

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

Vous pouvez contourner ce problème encore plus facilement avec l’ extension Rebase , utilisez simplement hg pull --rebase et vos commits sont automatiquement ré-validés pour éviter les problèmes de twigment.

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

hg ssortingp est ce que vous recherchez. Il est analogue à git reset si vous connaissez bien 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 les engagements que vous recherchez. Vous avez besoin d’un numéro à 4 chiffres à partir des modifications apscopes à la ligne changeset: 5888:ba6205914681

  2. Puis hg ssortingp -r 5888 --keep . Cela supprime l’enregistrement de la validation mais conserve tous les fichiers modifiés et vous pouvez les renouveler. (si vous voulez supprimer des fichiers pour simplement supprimer –keep hg ssortingp -r 5888