2010-05-10 5 views
1

J'ai deux machines, A et B qui accèdent à un référentiel hg externe.Est-ce une situation où je devrais "hg push -f"?

J'ai fait du développement sur A, je n'étais pas prêt à pousser les changesets vers l'externe, et j'ai dû changer de machines, donc j'ai poussé les changesets à B en utilisant hg serve. Changesets a continué sur B, ont été commis, puis poussés à des repo externes.

J'ai ensuite tiré sur A et mis à jour par défaut/pourboire. Cela a laissé les modifications locales qui avaient été précédemment poussées vers B comme une branche, mais à cause de la façon dont j'ai poussé les choses, les changements dans les changesets locaux sont déjà dans default/tip.

J'ai maintenant continué à faire des changements et à commettre localement sur A, mais quand j'essaye de pousser hg me demande de fusionner ou fais push -f à la place. Je sais que push -f est presque jamais recommandé. Cette situation est proche de celle où je devrais utiliser rebase, cependant les changesets qui seraient "rebased" je n'ai pas vraiment besoin localement ou dans le repository externe puisqu'ils sont déjà effectivement par défaut/tip via le push à B.

Maintenant, je sais que je pourrais fusionner avec le dernier changeset local et juste rejeter les changements, mais alors je devrais encore commettre la fusion qui me renvoie en territoire de rebase.

Est-ce un cas où je pourrais faire hg push -f?

De même, pourquoi pousser à partir de A créer des têtes distantes si j'ai mis à jour par défaut/conseil avant de continuer à valider les changesets?

Répondre

2

Je sauvegarder mes A & dépôts B puis essayez ceci:

rem Machine A 
rem --------- 
hg merge 
hg commit -m"merge" 
hg push 

rem Machine B 
rem --------- 
hg pull 

La fusion doit veiller à ce que vous avez une instance de chaque changeset visible de la pointe, plus un changeset de fusion supplémentaire sans fichier changements. Il devrait être sûr de pousser la fusion engagée - bien que je vérifierais ceci avant de le faire. Une des caractéristiques de Mercurial est qu'il est bon à fusionner, donc vous pouvez essayer de profiter de cela. Si vous êtes nerveux au sujet de l'effet d'une fusion, vous pouvez essayer:

hg merge --preview 

pour obtenir une meilleure idée de ce qu'il est sur le point de le faire. Si vous voulez vraiment un historique non-ramifié, vous pouvez créer un clone propre du référentiel externe [si ce n'est pas trop grand] et appliquer vos modifications de A en tant que patches.