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.
Activez l’extension " Strip " et tapez ce qui suit:
hg strip #changeset# --keep
Où #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())'
Si vous utilisez Hg Tortoise, activez simplement l’extension "strip" dans:
- Fichier/Paramètres/Extensions /
- 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:
- Modifier l'historique
- Bande
Juste comme ça:
Dans cet exemple, il sera effacé de la 19e révision à la dernière (22).
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.
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).
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
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.
Si vous êtes familier avec git, vous serez heureux d'utiliser histedit qui fonctionne comme git rebase -i
.
hg strip
est ce que vous recherchez. C'est analogue à git reset
si vous êtes familier avec git.
Utiliser la console:
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
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