41 votes

Annuler un hg push (backout ?)

J'ai fait un gros oops, et j'aurais besoin d'aide pour le défaire.

Nous avons deux dépôts - un dépôt assez stable, et un dépôt dans lequel nous travaillons sur des changements. Je viens de corriger un défaut dans notre dépôt stable, et j'étais en train de le déplacer vers le dépôt de travail. J'ai tiré du dépôt stable, fusionné, puis poussé accidentellement vers le dépôt stable.

Le dépôt stable ressemble maintenant à ceci :

*merge
| \
|  \
|   *b
*a  |
|  / 
*c

où a est le commit qui devrait être la pointe du dépôt stable, b est tout ce que nous avons fait dans le dépôt de développement, et c est le point où nous avons branché le dépôt de développement.

Comment dois-je m'y prendre pour le faire revenir :

*a
|
*c

(Je sais que je ne peux pas vraiment faire disparaître les changements, je cherche juste une structure fonctionnelle...)

J'ai lu des choses qui me font penser que hg backout est la commande dont j'ai besoin, mais je ne sais pas exactement ce qu'elle fait.

51voto

Geoffrey Zheng Points 3503

hg rollback annule la dernière transaction, ce qui vous laisse avec une fusion non finie, que vous devez utiliser. hg update -C pour sortir.

Si vous ne voulez pas *b (vous l'avez dans un autre clone), alors activez l'extension MQ intégrée et exécutez hg strip -r <*b> . Il se débarrasse de *b et *merge. Par défaut, il enregistre une sauvegarde au cas où vous changeriez à nouveau d'avis.


MISE À JOUR (selon le commentaire de @Rudi : désolé d'avoir manqué la partie "déjà poussé")

Puisque la fusion est déjà poussée, JAMAIS JAMAIS faites ce que j'ai suggéré plus tôt. Des emails de haine de la part de collègues développeurs auraient été le meilleur résultat.

Faites plutôt ça :

hg up -r<*merge>
hg revert -r<*a> -a
hg ci -m "undo unintended merge"

Ou tu pourrais être plus kascher :

hg up -r<*merge>
hg backout -r<*merge> --parent<*a>

2voto

Michal Sznajder Points 6292

Je pense qu'il est trop tard pour faire hg rollback puisque vous avez déjà poussé vos changements.

Vous pouvez essayer avec les extensions MQ mais cela fonctionne aussi localement. hg strip ne modifiera que votre repo local. Vous pouvez bien sûr essayer de modifier le dépôt du serveur directement sur le serveur, mais si quelqu'un le retire, il est trop tard.

Une autre option est décrite dans chapitre 9 de hgbook en section Revenir en arrière dans une fusion . Il s'agit de hg backout mais cela pourrait être une surcharge pour vous...

Je suggère de hg update -C à *une révision, fusionner avec tip et ignorer toutes les modifications de *merge ? Votre référentiel ressemblera plus ou moins à ceci que :

*second merge
 |  \ 
 |   \ 
 |    \     
 |     \ 
*merge | 
| \    |
|  \   |
|   *b |
*a  | /
|  / /
*c---

Les commandes pour cela sont

  • $ hg --config ui.merge=internal:local merge #keep my files
  • $ hg --config ui.merge=internal:other merge #keep their files

Plus de détails peuvent être trouvés ici

0voto

Lie Ryan Points 24517

hg rollback rétablira le dernier commit, effaçant tout historique qui aurait été fait autrement.

Donc, si tu commences avec ça :

*merge
| \
|  \
|   *b
*a  |
|  / 
*c

hg rollback donnera :

*a  *b
|  / 
*c

Notez que vous pouvez seulement faire hg rollback une seule fois.

Vous devez faire une sauvegarde complète du référentiel avant de faire un rollback. Pour ce faire, il suffit de hg clone l'ensemble du référentiel.

0voto

Ultra Points 813

Vous présentez tous une solution peu compliquée à ce problème, qui peut arriver à chacun d'entre nous.

Ce que j'ai fait, c'est que je me suis connecté à distance à mon référentiel central, et là avec mq L'extension a changé le statut de révision en "brouillon" et les a "stipulés".

Le seul inconvénient est que si quelqu'un a une copie du dépôt avec des révisions supprimées et qu'il pousse, elles réapparaîtront. Donc si vous le pouvez, demandez aux autres de a) de faire la même chose (brouillon, dépouiller) b) de supprimer leur dépôt local et de se resynchroniser avec le dépôt modifié

Tout cela peut être réalisé facilement avec TortoiseHg

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X