54 votes

Comment puis-je annuler une fusion dans Mercurial et ensuite revenir à cette branche?

J'ai deux branches, par défaut et de branch1. Par erreur, une personne de notre équipe a fusionné branch1 avec défaut. Le contenu de branch1 n'est pas encore prêt à fusionner avec par défaut (il contient une refonte complète de la construire et de déployer de l'environnement).

Nous avons fait une expérience avec hg sauvegarde', la sauvegarde de la fusion (pas sûr que ce soit la bonne façon de le faire). Ensuite, les changements de branch1 est supprimé par défaut, ce qui est bien - mais nous ne pouvons pas refait surface avec branch1.

Comment devrions-nous résoudre ce problème?

91voto

Lasse V. Karlsen Points 148037

Il existe de nombreux scénarios où vous pourriez vouloir faire cela, je vais faire de chaque scénario d'un titre, de sorte que vous pouvez trouver le scénario qui correspond à votre cas. Remarque que je suis encore à apprendre Mercurial, et j'aimerais pointeurs si quelque chose que je dis est faux, l'utilisation de la mauvaise terminologie, pourrait faire mieux, etc.

Aucune autre modification, de fusion, non partagée (pas de pousse/tire)

Le programmeur a fusionné, mais ne fait pas autre chose, ni a (s)il a partagé les changements avec quelqu'un, en quelque sorte

Dans ce cas, il suffit de jeter le clone local, et obtenir une nouvelle clone à partir d'un coffre de dépôt.

Les modifications locales sur le dessus de la fusion, ne partage pas

Le programmeur a fusionné, et a continué à travailler basé sur cette fusion. Les révisions qui ont suivi la fusion doit être maintenue, mais la fusion elle-même doit être supprimé. Les changements (fusion + suite à des révisions) n'ont pas été partagés avec n'importe qui

Dans ce cas, je voudrais faire l'un des quatre:

  1. Essayez d'utiliser le REBASE extension, cela vous permettra de déplacer les révisions d'un endroit à un autre. Si les révisions sont fondées sur le code des changements qui ont été introduites avec la fusion, à quelque travail manuel doit être fait pour concilier les différences.
  2. Essayez d'utiliser la MQ extension de tirer les révisions qui seront conservés dans un patch de la file d'attente, puis le pousser en arrière dans un emplacement différent. Ce sera, cependant, ont le même problème que le REBASE extension en termes de changements basée sur la fusion
  3. Essayez d'utiliser la GREFFE de extension à "copier" les modifications à partir d'un emplacement à un autre. Encore, le même problème existe avec les deux premiers.
  4. Faire le travail à nouveau, probablement avec l'aide d'un outil de comparaison pour prendre les modifications effectuées dans les révisions, je veux jeter, et re-faire dans l'emplacement correct.

Pour se débarrasser de la révision de la fusion + toutes les révisions, il y a deux options:

  1. L'utilisation de la bande de commande dans la MQ extension

    hg strip <hash of merge changeset>
    
  2. Clone et le pull, et spécifier la valeur de hachage de la révision avant, mais ne comprenant pas la fusion. En essence, créer un nouveau clone en tirant à partir de la partie endommagée du clone dans un nouveau, et éviter de tirer dans la fusion vous ne voulez pas.

    hg clone damaged -r <hash of first parent> .
    hg pull damaged -r <hash of second parent>
    

Fusion poussé pour d'autres, le contrôle des clones

Le programmeur a poussé à référentiel maître, ou à quelqu'un d'autre, ou quelqu'un a de la part des programmeurs référentiel. Cependant, vous (comme dans le groupe de développeurs) ont le contrôle sur tous les dépôts, comme dans, vous pouvez contacter et parler à tout le monde avant de plus le travail est effectué

Dans ce cas, je voudrais voir si l'étape 1 ou 2 pourrait être fait, mais il peut être fait dans beaucoup d'endroits, de sorte que cela peut impliquer beaucoup de travail.

Si personne n'a fait un travail basé sur la révision de la fusion, je voudrais utiliser l'étape 1 ou 2 pour nettoyer, puis poussez le référentiel maître, et demandez à chacun de se faire une douce clone du dépôt principal.

Fusion poussé, vous n'avez pas de contrôle sur les clones

Le programmeur a poussé le mergeset, et vous ne savez pas qui aura la révision de la fusion. En d'autres termes, si vous avez réussi à l'éradiquer de vos dépôts, un chien errant coup de pouce de quelqu'un qui a toujours il va le ramener.

Ignorer la révision de la fusion et de travailler dans les deux branches, comme si ça n'était jamais arrivé. Cela laissera une balançant la tête. Vous pouvez ensuite plus tard, quand vous avez fusionné les deux branches, faire un null-fusion pour cette tête de se débarrasser de lui.

  M         <-- this is the one you want to disregard
 / \
*   *
|   |
*   *
|   |

Simplement continuer à travailler dans les deux branches:

|   |
*   *
| M |       <-- this is the one you want to disregard
|/ \|
*   *
|   |
*   *
|   |

Puis, plus tard, la fusion des deux, le réel de fusion que vous voulez:

  m
 / \
*   *
|   |
*   *
| M |       <-- this is the one you want to disregard
|/ \|
*   *
|   |
*   *
|   |

Vous pouvez ensuite faire un null-fusionner pour se débarrasser de la balançant la tête. Malheureusement, je ne sais pas comment le faire que par TortoiseHg. Il a une case où je peux annuler toutes les modifications à partir de l'une des branches.

Avec TortoiseHg, je voudrais le mettre à jour pour la fusion je veux garder (le premier, m minuscule), sélectionnez puis cliquez-droit sur le balançant de fusion de la tête ci-dessous, puis cochez la case "ignorer toutes les modifications de la fusion de la cible (autres) révision": discard changes from target

1voto

Peter Moberg Points 1281

Merci à tous pour la grande entrée! Puisque nous étions en quelque sorte dans une ruée pour résoudre le problème, et notre groupe est relativement nouveau Mercurial, nous avons utilisé un très solution pragmatique.

Sur notre repository server nous avons créé un nouveau référentiel, nous avons cloné l'ancien dépôt, jusqu'à la révision juste avant la fusion. Ensuite poussé le nouveau clone pour le serveur et envoyé le lien à tout le monde. Heureusement, nous sommes une très petite équipe de développement.

Peut-être pas le plus cosher façon de résoudre le problème, mais il a travaillé :)

0voto

Ringding Points 2400

Vous ne pouvez pas vraiment éviter une fusion bien. OMI, la meilleure façon de gérer cela serait tout simplement d’abandonner la fusion et de continuer la série de changesets d’avant la fusion, en laissant une tête pendante (qui peut être supprimée). Si d’autres changements sont intervenus depuis la fusion, ils peuvent être redistribués sur la nouvelle "bonne" tête.

0voto

Tim Post Points 21270

Cette réponse suppose que vous avez déjà poussé

Cela aurait pour conséquence (au moins un) non résolus de la tête, selon ce que vous avez tout simplement oublié. De plus, selon qui tout simplement poussé à partir de la branche.

J'aime HG et de l'utiliser avec avidité, mais leur idée d'une branche peuvent conduire quelqu'un batty, lorsqu'il est couplé avec une histoire qui est (par conception) intentionnellement immuable.

J'ai l'habitude de clone de sauvegarde (localement) de l'opération avant de faire une branche de fusion, justement pour cette raison. Je vérifie toujours avant de tirer.

Eric Raymond est de travailler sur quelque chose qui est plus ou moins DVCS agnostique qui peuvent l'être (espérons-le) de l'aide dans des situations comme la oups, vous avez décrit, mais je ne pense pas qu'il va avoir HG en charge intégralement mis en œuvre pour une semaine ou deux. Encore, il peut être vaut la peine de regarder.

Mais, n'est utile que si personne n'a tiré la "ooopsie' astuce.

0voto

Justin Points 608

J'ai eu exactement ce problème. Un collègue accidentellement fusionné ma branche dans la branche par défaut alors qu'il était encore incomplète. Au départ, j'ai juste soutenu que l'opération de fusion qui semblait aller bien jusqu'à ce que je voulais fusionner ma branche en défaut pour la garde. Les fichiers que j'avais besoin étaient marqués pour la suppression lors de la fusion.

La solution était d'aller tout le chemin du retour à mon premier retour que ma collègue de l'erreur et à l'arrière qu'à revenir. Cet arrêté les fichiers marqués comme supprimés et permettez-moi de fusionner ma branche en défaut.

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