web-dev-qa-db-fra.com

Comment puis-je réinitialiser --hard HEAD sur Mercurial?

Je suis un utilisateur Git essayant d'utiliser Mercurial.

Voici ce qui s'est passé: j'ai fait un hg backout sur un ensemble de modifications que je voulais rétablir. Cela a créé une nouvelle tête, donc hg m'a demandé de fusionner (retour à "par défaut", je suppose). Après la fusion, il m'a dit que je devais encore m'engager. Ensuite, j'ai remarqué quelque chose que j'avais mal fait lors de la résolution d'un conflit lors de la fusion, et j'ai décidé que je voulais tout avoir comme avant hg backout, c'est-à-dire que je veux que cette fusion non engagée disparaisse. Sur Git, ce truc non engagé serait dans l'index et je ferais juste un git reset --hard HEAD pour l'effacer mais, d'après ce que j'ai lu, l'index n'existe pas sur Mercurial. Alors, comment puis-je me retirer de cela?

70
hsribei

Si vous ne vous êtes pas encore engagé, et il semble que vous ne l'ayez pas fait, vous pouvez annuler tout le travail de fusion avec hg update --clean.

Cependant, dans les nouveaux Mercurial, il existe une commande pratique pour fusionner à nouveau un seul fichier: hg resolve path/to/file.ext. Du hg help resolve:

The available actions are: ...

 4) discard your current attempt(s) at resolving conflicts and

redémarrez la fusion à partir de zéro: "hg résoudre le fichier ..." (ou "-a" pour tous les fichiers non résolus)

87
Ry4an Brase

C'est proche:

hg update --clean

21
sblom

La page GitConcepts du manuel Hg explique comment effectuer de nombreuses actions que les utilisateurs git connaissent dans Mercurial.

Mercurial n'a pas de comportement git reset --hard Intégré. Cependant, l'extension strip fournit une commande strip qui le fait. Pour utiliser, activez d'abord strip dans votre fichier ~/.hgrc ::

[extensions]
strip =

Remarque: cette extension est livrée dans la nouvelle version de Mercurial 2.8. Les versions précédentes fournissaient la commande strip dans l'extension mq .

Vous pouvez maintenant exécuter des commandes comme hg strip Ou même hg help strip. Pour supprimer un changeset et tous ses enfants, spécifiez simplement ce changeset comme argument à hg strip. Par exemple, pour supprimer le dernier commit que vous venez de faire (après avoir utilisé des commandes qui ont fait que hg rollback Signale qu'il n'y a plus de transaction à annuler), vous pouvez supprimer la révision tip. Chaque fois que vous exécutez cette commande, une autre révision sera supprimée. Les actions de hg strip Doivent être considérées comme irréversibles; les utilisateurs peu familiers devraient faire des sauvegardes de leurs référentiels avant d'utiliser.

$ hg strip tip

Par exemple, avec syntaxe des revsets , j'indique que je veux supprimer tous les commits qui entraînent l'affichage de têtes supplémentaires lorsque j'exécute hg heads. Si vous spécifiez une révision particulière dans l'expression ci-dessous autre que tip, tout dans la branche actuelle qui n'est pas un ancêtre de votre révision choisie sera coupé. Cela semble plus proche du comportement que je souhaite lorsque j'émets la commande git reset --hard HEAD.

$ hg strip "branch(tip) and not(ancestors(tip)::tip)"
11
binki

Depuis git, les commandes:

git reset --hard     # reset to last commit    
git clean -df        # delete untracked files

sont égaux à

hg update --clean    # reset to last commit  
hg purge             # delete untracked files
8
Dariusz Filipiak