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.
Réponses:
Activez l' extension " strip " et tapez ce qui suit:
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'--keep
option.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
.hgrc
ouMercurial.ini
et ajoutez-y les éléments suivants: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
strip
commande 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:la source
strip =
va. WhatsNew pour Mercurial 2.8Si vous utilisez Hg Tortoise, activez simplement l'extension " strip " dans:
Sélectionnez ensuite la révision inférieure à partir de l'endroit où vous souhaitez commencer l'entrelacement, en faisant
right click
dessus, et en sélectionnant:Juste comme ça:
Dans cet exemple, il effacera de la 19e révision à la dernière validée (22).
la source
File/Settings/Extensions/
J'aimerais pouvoir ajouter plus de votes. Merci beaucoup!--keep
et TortoiseHg ne donne pas cette option. Donc ... vous devez le faire en ligne de commande avechg strip -r . --keep
.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é.
la source
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 -r
votre 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).
la source
J'ai aussi rencontré ce problème. J'ai fait 2
commit
et je voulais annuler et supprimer les deux validations.Mais
hg rollback
revient 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 rollback
venais d'annuler un commit, j'ai trouvé que je pouvais l'utiliserhg strip #changeset#
. Donc, j'avais l'habitudehg log -l 10
de trouver les 10 derniers commits et d'obtenir le bon ensemble de modifications que je voulaisstrip
.Que veut
abort: local changes found
dire? Cela signifie que leshg
modifications trouvées au code n'ont pas encore été validées. Donc, pour résoudre ce problème, vous devezhg diff
enregistrer le code que vous avez modifié ethg revert
ethg strip #changeset#
. Juste comme ça:Après avoir fait ce qui précède, vous pouvez
patch
le fichier diff et votre code peut être ajouté à votre projet.la source
Vous pouvez contourner ce problème encore plus facilement avec l' extension Rebase , utilisez simplement
hg pull --rebase
et vos validations sont automatiquement réengagées dans la révision extraite, évitant ainsi le problème de branchement.la source
Si vous connaissez git, vous serez heureux d'utiliser histedit qui fonctionne comme
git rebase -i
.la source
hg strip
est ce que vous recherchez. C'est analogue àgit reset
si vous connaissez git.Utilisez la console:
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
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
la source
[Hg Tortoise 4.6.1] S'il s'agit d'une action récente, vous pouvez utiliser l'action "Rollback / Undo" (Ctrl + U).
la source
En plus de l'excellente réponse de Samaursa, vous pouvez utiliser l'
evolve
extensionprune
comme une version sûre et récupérablestrip
qui vous permettra de revenir en arrière si vous faites quelque chose de mal.J'ai ces alias sur mon
.hgrc
:Notez que
prune
doit également--keep
, tout commestrip
, garder le répertoire de travail intact vous permettant de réengager les fichiers.la source