Il y a un commit qui n'a tout simplement pas fonctionné, donc je veux l'abandonner sans le supprimer de l'historique .
J'ai mis à jour à partir d'une révision précédente et engagé, créant ainsi une nouvelle tête.
Je n'ai pas de branches, je ne veux pas de branches, je veux simplement continuer avec la nouvelle tête exactement telle qu'elle est, rien d'extraordinaire, pas de fusion, pas de soucis, continuez juste à oublier la précédente.
Je n'arrive pas à trouver comment faire cela, et je commence à croire que cela ne peut pas être fait. Tout ce que je trouve, ce sont des trucs sur les branches ou des fusions.
Réponses:
Mettez à jour votre référentiel vers l'en-tête avec la révision que vous voulez oublier, puis utilisez
hg commit --close-branch
pour marquer cette branche (anonyme) comme fermée. Ensuite , mettre à jour à la tête de la branche que vous ne voulez, et continuer à travailler.Vous pouvez toujours voir la branche fermée si vous utilisez l'
-c
option tohg heads
, mais elle n'apparaîtra pas par défaut ethg merge
saura ne 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 vers un autre référentiel car vous créez en fait des têtes supplémentaires dans le référentiel distant lorsque vous poussez. Dites donc à Mercurial que tout va bien--force
. Les personnes qui tirent la tête fermée ne seront pas dérangées par les avertissements.la source
hg heads
... J'utilise mercurial 1.4.3, est-ce une nouvelle fonctionnalité?hg branches
devrait toujours afficher le nom de la branche sur laquelle vous vous trouvez. Plutôt que d'essayer de fermer la branche, fusionnez votre branche anonyme dans la branche d'origine, en annulant toutes les modifications.Je sais que vous ne voulez pas travailler avec des succursales à ce stade, mais c'est exactement ce que vous avez fait. Lorsque vous êtes revenu à une version antérieure et que vous avez commis quelque chose qui fonctionnait, vous avez créé une branche - une branche sans nom, mais une branche tout de même.
Il n'y a aucun problème à continuer comme vous êtes et à ne pas vous soucier d'avoir plusieurs têtes, mais si vous voulez ranger les choses pour ne pas choisir accidentellement la mauvaise tête une fois, vous pouvez tuer l'ancienne branche.
Il y a une bonne section dans la documentation Mercurial qui vous présente un certain nombre d'options autour de l' élagage des branches mortes .
Je pense que la meilleure option pour vous est de marquer l'ancienne branche comme "fermée". Si votre ancienne tête est la révision "123", alors:
la source
-C
enhg update
? Il semblerait qu'aucun fichier n'aurait été modifié, il devrait donc fonctionner sans lui.Tout d'abord, tapez:
Imaginez, vous avez trois têtes répertoriées:
Disons que vous voulez garder la dernière tête active (223) et fermer le reste.
Vous feriez alors comme suit:
Fermer la tête # 59
Fermer la tête # 123
Validez les changements
N'oubliez pas de passer à la bonne tête à la fin
Et tu as fini.
la source
--close-branch -m "Closing branch - technique #2 abandoned in favor of technique #3"
.hg up -r 223
avant d'apporter des modifications.hg push --force
, pas seulementhg push
de passer l'avertissement concernant le fait de pousser plusieurs têtes.hg push
en soi ne fonctionnait pas pour moi. Comment recommandez-vous de pousser les modifications vers un repo externe s'il refuse en raison de plusieurs têtes?Vous souhaitez utiliser
hg backout
. Cela supprime les modifications apportées par l'ensemble de modifications de tout ensemble de modifications enfant.Vérifiez ceci pour une bonne explication. Désactivation Mercurial
la source
Les réponses de Niall et de Nick sont directes. Parce que je me surprends à 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
:(si vous avez déjà une
[alias]
section, vous pouvez y ajouter à la place)Vous pouvez maintenant fermer une tête en une seule commande (et sans avoir à mettre à jour manuellement un ensemble de modifications différent) comme ceci:
Remarque: 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.
la source
Une alternative à la fermeture ou à la suppression de la branche indésirable serait de la fusionner d'une manière qui élimine totalement ses effets, mais la laisse dans l'histoire. Cette approche permettra à ces changements indésirables de se propager dans une poussée - utilisez donc ceci uniquement si c'est l'effet recherché.
Disons que l'historique des modifications ressemble à ceci:
et c'est
5
et6
qui ne sont plus voulus.Tu peux le faire:
ce qui créera ceci:
La mise à jour
8
garantit que vous travaillez à la tête souhaitée dans l'histoire, que vous souhaitez conserver.Le
-t :local
hg demande à hg d'utiliser l '"outil" de fusion appelé local qui lui dit d'ignorer les changements de l'autre branche, c'est-à-dire celle qui n'est PAS représentée par l'état actuel du dossier de travail. Plus d'infos .Ainsi, les changements indésirables dans
5
et6
sont préservés dans l'histoire mais n'affectent rien de plus récent.la source
Il s'agit d'un cas d'utilisation de l' extension Evolve . Il n'est actuellement pas fourni avec Mercurial, il s'agit donc techniquement d'une extension tierce. Mais il est largement utilisé par un groupe de personnes, y compris les développeurs Mercurial, est en cours de développement très actif et ne mène nulle part.
Avec l'extension Evolve, vous faites simplement
et continue ta vie. Le cset sera toujours là, mais obsolète. Il ne sera pas visible à moins que vous ne passiez l'
--hidden
option aux commandes Mercurial, et par défaut, il ne sera pas poussé vers les référentiels distants. Bien que je pense que vous pouvez le forcer si vous le voulez vraiment.Si le cset que vous élaguez a des ancêtres que vous souhaitez conserver, vous devrez alors exécuter
hg evolve
pour rebaser ces changesets.hg evolve
le fera automatiquement. Sinon, vous n'avez rien à faire.la source
Vous pouvez cloner votre dépôt corrompu vers 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 du temps, mais vous obtiendrez un référentiel parfaitement propre sans signe de cette révision indésirable.
la source
J'ai rencontré ce problème à plusieurs reprises lorsque je veux 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, obtenez la dernière version, puis:
Trouvez le début d'une tête que vous souhaitez dénuder (où un nouveau cou commence à se ramifier), obtenez le numéro de révision
Déshabillez-le.
Source: TipsAndTricks .
Source: PruningDeadBranches # Using_strip .
Votre repo devrait maintenant avoir la tête dépouillée. La dernière étape est importante car le décapage ne crée aucune modification que vous pouvez pousser vers votre référentiel central. Sans la dernière étape, vous n'avez décapé la tête que localement.
la source