web-dev-qa-db-fra.com

Annuler une poussée hg (backout?)

J'ai fait un gros oups, et je pourrais avoir besoin d'aide pour le défaire.

Nous avons deux référentiels: un référentiel assez stable et un référentiel dans lequel nous travaillons sur des changements. Je viens de corriger un défaut dans notre référentiel stable et je le déplaçais vers le référentiel de travail. Je me suis retiré du référentiel stable, j'ai fusionné, puis j'ai accidentellement poussé vers le référentiel stable.

Le référentiel stable ressemble maintenant à ceci:

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

a est le commit qui devrait être la pointe du référentiel stable, b est tout ce que nous avons fait dans le référentiel de développement, et c est le point nous avons ramifié le référentiel de développement.

Comment puis-je revenir à:

*a
|
*c

(Je sais que je ne peux pas vraiment faire de 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.

41
Neil

hg rollback annule la dernière transaction, il vous restera donc une fusion inachevée, que vous devrez utiliser hg update -C sortir.

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


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

Puisque la fusion est déjà repoussée, JAMAIS JAMAIS faites ce que j'ai suggéré plus tôt. Les courriels de haine des autres développeurs auraient été le meilleur résultat.

Faites ceci à la place:

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

Ou vous pourriez être plus casher:

hg up -r<*merge>
hg backout -r<*merge> --parent<*a>
49
Geoffrey Zheng

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

Vous pouvez essayer avec des extensions MQ, mais cela fonctionne également localement. hg strip ne modifiera que votre dépôt local. Vous pouvez bien sûr essayer de modifier votre référentiel de serveur directement sur le serveur mais si quelqu'un l'a retiré, il est trop tard.

Une autre option est décrite dans chapitre 9 of hgbook in section Backing out a merge. Ça implique hg backout commande mais cela pourrait être exagéré pour vous ...

Je suggère à 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:

*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 .

2
Michal Sznajder

hg rollback annulera le dernier commit, supprimant tout historique qui aurait été effectué autrement.

Donc, si vous commencez par ceci:

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

hg rollback donnera:

*a  *b
|  / 
*c

notez que vous ne pouvez faire que hg rollback juste une fois.

Vous devez effectuer une sauvegarde complète du référentiel avant de procéder à la restauration. Pour ce faire, il suffit de hg clone l'ensemble du référentiel.

0
Lie Ryan

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

Ce que j'ai fait, je me suis connecté sur le bureau distant à mon référentiel central, et là, avec l'extension mq, le statut de révision a été changé en "draft" et "stip" -ed.

Le seul inconvénient est que si quelqu'un a une copie du repo avec des révisions supprimées et poussera, il réapparaîtra. Donc, si vous le pouvez, demandez aux autres de a) faire de même (brouillon, supprimer) b) supprimer leur référentiel local et resynchroniser avec celui modifié

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

0
Szymon Toda