web-dev-qa-db-fra.com

Abandon des modifications sans suppression de l'historique

Il y a un commit qui n'a pas fonctionné, alors 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, aucune fusion, aucun souci, continuez simplement à 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 trucs sur la fusion.

172
o0'.

Mettez à jour votre référentiel en tête avec la révision que vous souhaitez oublier, puis utilisez l'option --close-branch en hg commit pour marquer cette branche (anonyme) comme étant fermée. Puis mettez à jour le responsable de la branche que vous faites et continuez de travailler.

Vous pouvez toujours voir la branche fermée si vous utilisez l'option -c pour hg heads, mais elle ne s'affichera pas par défaut et hg 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 transmettez cette tête fermée à un autre référentiel, car vous créez en réalité des têtes supplémentaires dans le référentiel distant lors du Push. Dites donc à Mercurial que cela va bien avec --force. Les personnes qui tirent la tête fermée ne seront pas dérangées par les avertissements.

176
Niall C.

Je sais que vous ne voulez pas travailler avec des branches à ce stade, mais c'est exactement ce que vous avez fait. Lorsque vous êtes revenu à une version antérieure et avez commis un acte qui fonctionnait, vous avez créé une branche - une branche non nommée, mais une branche tout de même.


Ce n'est pas un problème que de continuer à faire ce que vous êtes et de ne pas vous inquiéter d'avoir plusieurs têtes, mais si vous voulez ranger les choses de manière à ne pas choisir la mauvaise tête par inadvertance, vous pouvez tuer l'ancienne branche.

La documentation Mercurial contient une bonne section qui vous guide à travers un certain nombre d'options autour de É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:

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

Tout d'abord, tapez:

hg heads

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

changeset:   223:d1c3deae6297
user:        Your name  <[email protected]>
date:        Mon Jun 09 02:24:23 2014 +0200
summary:     commit description #3

changeset:   123:91c5402959z3
user:        Your name <[email protected]>
date:        Sat Dec 23 16:05:38 2013 +0200
summary:     commit description #2

changeset:   59:81b9804156a8
user:        Your name <[email protected]>
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 reste.

Vous feriez alors comme suit:

Fermer la tête # 59

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

Fermer la tête # 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 bonne tête à la fin

hg up -r 223

Et tu as fini.

20
Artur Barseghyan

Vous voulez utiliser hg backout. Cela supprime les modifications apportées par l'ensemble de modifications de tout ensemble de modifications enfant.

Regardez ceci pour une bonne explication . Mercurial Backout

12
msarchet

Vous pouvez cloner votre pension corrompue sur une nouvelle 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 aucun signe de cette révision indésirable.

hg clone --rev myGoodResition myDirtyRepo myCleanRepo
3
kjam

Les réponses de Niall et de Nick vont droit au but. Parce que je me retrouve à créer beaucoup de têtes pendantes, j'ai fini par écrire un pseudonyme 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 l'ajouter à la place)

Vous pouvez maintenant fermer une tête dans une seule commande (sans avoir à mettre à jour manuellement un ensemble de modifications différent) comme ceci:

$ hg behead 123

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.

1
jjst

Ceci est un cas d'utilisation de l'extension Evolve . Il n’est actuellement pas intégré à Mercurial. Il s’agit donc techniquement d’une extension tierce. Mais il est très utilisé par un groupe de personnes, y compris les développeurs de Mercurial, est en train d'être développé très activement et ne va nulle part.

Avec l'extension Evolve, vous faites simplement

hg Prune -r revname

et continuez votre vie. Le jeu sera toujours là, mais obsolète. Il ne sera visible que si vous passez l'option --hidden aux commandes Mercurial et, par défaut, ne sera pas poussé vers des référentiels distants. Bien que je pense que vous pouvez le forcer si vous 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 ne devez rien faire.

1
Faheem Mitha

J'ai rencontré ce problème plusieurs fois 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, obtenez le dernier et ensuite:

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

  2. Dénudez-le.


Source: TipsAndTricks .

Source: PruningDeadBranches # Using_strip .

hg --config extensions.hgext.mq= strip -n <rev>
  1. Faites une mise à jour de fichier triviale (ajoutez un espace blanc à un fichier), validez et Push.

Votre repo devrait maintenant avoir la tête dépouillé. La dernière étape est importante, car le stripping ne crée aucune modification pouvant être transmise à votre référentiel central. Sans la dernière étape, vous n’avez que dépouillé la tête localement.

0
sonjz