Mercurial: décapiter une tête

Il y a un commit qui ne fonctionnait pas, donc je veux l’abandonner sans le supprimer de l’historique.

J’ai mis à jour depuis une révision antérieure et je me suis engagé, créant ainsi une nouvelle tête.

Je n’ai pas de twigs, je ne veux pas de twigs, je veux juste continuer avec la nouvelle tête exactement comme elle est, rien de compliqué, pas de fusion, pas de soucis, continuez à oublier le précédent.

Je n’arrive pas à trouver comment faire cela et je commence à croire que cela ne peut être fait. Tout ce que je trouve, ce sont des trucs sur les twigs, ou des trucs sur la fusion.

    Mettez à jour votre repository vers la tête avec la révision que vous souhaitez oublier, puis utilisez l’option --close-branch pour hg commit afin de marquer cette twig (anonyme) comme fermée. Puis mettez à jour le responsable de la twig que vous voulez et continuez à travailler.

    Vous pouvez toujours voir la twig fermée si vous utilisez l’option -c pour hg heads , mais elle ne s’affichera pas par défaut et hg merge ne saura pas essayer de fusionner avec la tête fermée.

    Vous devrez utiliser hg push --force la première fois que vous poussez cette tête fermée dans un autre référentiel car vous créez en fait des en-têtes supplémentaires dans le référentiel distant lorsque vous poussez. Alors, dis à Mercurial que ça va bien avec --force . Les gens qui tirent la tête fermée ne seront pas dérangés par des avertissements.

    Je sais que vous ne voulez pas travailler avec les twigs à ce stade, ce qui est bien, mais c’est exactement ce que vous avez fait. Lorsque vous êtes retourné à une version antérieure et que vous avez commis un problème, vous avez créé une twig – une twig non nommée, mais une twig tout de même.

    Il n’y a pas de problème à continuer comme vous et à ne pas se soucier d’avoir plusieurs têtes, mais si vous voulez ranger les choses afin de ne pas choisir accidentellement la mauvaise tête, vous pouvez tuer l’ancienne.

    Il y a une bonne section dans la documentation de Mercurial qui vous guide à travers un certain nombre d’options relatives à Pruning Dead Branches .

    Je pense que la meilleure option pour vous est de marquer l’ancienne twig comme “fermée”. Si votre ancienne tête est la révision “123” alors:

     hg update -r 123 hg commit --close-branch -m 'Closing old branch' hg update -C default 

    Tout d’abord, tapez:

     hg heads 

    Imaginez, vous avez trois têtes répertoriées:

     changeset: 223:d1c3deae6297 user: Your name  date: Mon Jun 09 02:24:23 2014 +0200 summary: commit description #3 changeset: 123:91c5402959z3 user: Your name  date: Sat Dec 23 16:05:38 2013 +0200 summary: commit description #2 changeset: 59:81b9804156a8 user: Your name  date: Sat Sep 14 13:14:40 2013 +0200 summary: commit description #1 

    Disons que vous voulez garder la dernière tête active (223) et fermer le rest.

    Vous feriez alors comme suit:

    Fermez la tête n ° 59

     hg up -r 59 hg ci --close-branch -m "clean up heads; approach abandoned" 

    Fermez la tête n ° 123

     hg up -r 123 hg ci --close-branch -m "clean up heads; approach abandoned" 

    Commettre les changements

     hg push 

    N’oubliez pas de passer à la tête droite à la fin

     hg up -r 223 

    Et tu as fini.

    Vous voulez utiliser la hg backout . Cela supprime les modifications apscopes par l’ensemble de modifications de tout ensemble de modifications enfant.

    Vérifiez ceci pour une bonne explication. Mercurial Backout

    Vous pouvez cloner votre repo corrompu sur un nouveau sans cloner cette tête indésirable. Supprimez ensuite l’ancien référentiel, déplacez le clone nouvellement créé vers l’emplacement d’origine et continuez à l’utiliser. Cela prendra un certain temps, mais vous obtiendrez un référentiel parfaitement propre, sans signe de cette révision indésirable.

     hg clone --rev myGoodResition myDirtyRepo myCleanRepo 

    Les réponses de Niall et de Nick sont claires. Comme je me retrouve à créer beaucoup de têtes pendantes, j’ai fini par écrire un alias pour fermer les têtes plus facilement. En ajoutant ceci à votre .hgrc :

     [alias] behead = !REV=$($HG id -i); $HG update $@ -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q 

    (si vous avez déjà une section [alias] , vous pouvez y append à la place)

    Vous pouvez maintenant fermer une tête en une seule commande (et sans avoir à mettre à jour manuellement un autre ensemble de modifications) comme ceci:

     $ hg behead 123 

    Note: l’alias tire parti du fait que les alias Mercurial peuvent être des commandes shell . Cela signifie que cela ne fonctionnera probablement que sous UNIX, pas sous Windows.

    J’ai rencontré ce problème à plusieurs resockets lorsque je voulais décapiter une tête créée par erreur. Je veux toujours le voir disparaître de la surface de la Terre.

    Sur votre copie locale, procurez-vous les derniers puis:

    1. Trouvez le début d’une tête que vous voulez supprimer (où un nouveau cou commence à se twigr), obtenez le numéro de révision

    2. Dénouez le.


    Source: TipsAndTricks .

    Source: PruningDeadBranches # Using_ssortingp .

     hg --config extensions.hgext.mq= ssortingp -n  
    1. Faites une mise à jour du fichier sortingvial (ajoutez un espace dans un fichier), validez et appuyez sur.

    Votre repo devrait maintenant avoir la tête dénudée. La dernière étape est importante, car la suppression ne crée aucune modification que vous pouvez envoyer à votre référentiel central. Sans la dernière étape, vous avez seulement dépouillé la tête localement.