2012-08-22 8 views
9

私は仕事で困ったことがあります(以下の簡単なスケッチで示されています)。ブランチの作成中に何らかの理由でデフォルトがブランチに親として固執しましたが、デフォルトのブランチを別々に保持しています(つまり、今後使用するデフォルトのブランチです)。これにより、2つのデフォルトブランチが残っています。ブランチコミットが破棄された後、Mercurialに2つのデフォルトブランチが張られました

誰かがブランチする前に変更をコミットする方法を間違えたので、branch1で行った変更をbranch2にマージしてしまいました。

私はMercurial: the definitive guideを調べて解決できるかどうかを確認しましたが、バックアウトやクローズに関するどのコマンドが役立つかを知ることができませんでした。一番簡単な方法は、残っているデフォルトのブランチの名前を何とか変更することが可能な場合です。

これを解決する最も簡単な方法は?

私は開発ブランチを正しいデフォルトブランチにマージする準備をしています。メジャーマージを開始する前にこの頭痛を修正しておき、将来これを修正するのがさらに難しくなる可能性があります。

branch problems

答えて

7

ブランチ名だけのコミットを置くラベルであることを忘れないでください - あなたのグラフについては本当に壊れたものは何もありません。ブランチ名はマージ時の処理には影響しません。マージ時にはファイルの内容のみが重要です。言われて、あなたは、defaultbranch1以下のいずれかの余分なヘッドを閉じることができ

$ hg update "min(heads(branch(default)))" 
$ hg commit --close-branch -m "closing this head" 

結構です、あなたのグラフでダングリング近いチェンジを残します。クローズチェンジセットはhg headsから頭を隠し、hg mergeのようなコマンドはもはやこの頭とマージするようには勧めません。

+0

ソートされていると思います。 'hg rebase'や' hg strip'の経験はありますか?いいことは、branch1とbranch2を1つのブランチとして持つことです。 branch2は基本的にbranch1で行われた変更ですが、デフォルトのbranchは含まれていません。 – Patrick

+0

リベースとストリップのドキュメントを読んだら、通常はリポジトリとプッシュまたは共有されていないコミットでのみ使用されます。 – Patrick

+0

@Patrick:あなたはリベースとストリップに関して正しいです。すでにチェンジセットを別の場所にプッシュしていると、両方のコマンドが非効率的になります。何も破損することはありませんが、サーバーからプルすると元のチェンジセットが戻ってくることがわかります。これは、コマンドの効果を無効にします( 'hg strip'の場合)か、乱雑です(' 'hg rebase''の場合)。 –

2

古い質問ですが、これは誰かにとって有用かもしれませんが。

.これは、通常、誰かが引っ張って更新する代わりにhg push -fを実行したときに、1つの分岐が分岐するときに発生します。あなたの場合、強制的な頭部は別の枝にも起こりますが、これは単一の枝でも起こります。私の解決策は、ブランチがマージされるまで座っておくことです。少なくとも、ある時点でそれらをマージする計画があれば。私の意見では、この解決策は誤った頭を閉じるよりも清潔です。

ただし、hg update defaultを実行すると、「デフォルト」の名前で最新のコミットになります。私はこの考え方があなたのケースでは正しいと思いますが、これはあなたが実際に望む「デフォルト」が「デフォルト」のブランチ名を持つ最新のコミットなので、問題はないはずです。しかし、誤った頭が新しい場合、hg update defaultは人を誤った頭に連れてしまうので、かなり混乱する可能性があります。いずれの場合も

、これは問題を解決します:

hg update <revision number of correct 'default' head> 
hg merge <branch the erroneous 'default' head is on> 

したがって、この場合には、hg update defaultが誤っヘッドに更新しますが:

1-2(default) 
\ 
    3(default)-4(branch1) 

あなたがする必要があるでしょう:

hg update 2 
hg merge branch1 
# results in this graph: 
# 1-2---5(default) 
# \ /
# 3-4(branch1) 

以下、hg update defaultはあなたが行動するものに更新されます

1-2------------5(default) 
\ 
    3(default)-4(branch1) 

を..and、それは誰に影響を与えませんので、あなただけの、誤ったデフォルトを無視することができます:uallyとにかく欲しいです。その後、誰かがhg update default; hg merge branch1をやったら、間違った「デフォルト」の祖先なので、間違った頭が黙って消えてしまいます。 ..youも役に立たないが、ご希望のデフォルトにコミット行うことができ、その後、それが最新になり、そしてそれは彼らが行うとき、1人が得るだろう

1-2-5----------11(default) 
\   /
    3-4-[...]-10(branch1) 

:..whichこのようなものになるでしょうhg update defaultしかし、私は本当にジャンクを歴史に残しておきたいとは思わない。

+0

私はなぜ2つのデフォルトブランチを持っていたのだろうと思っていました。私は合併しなければならなかったが、コミットを強制し、回避し、変更が上書きされて以来、簡単な選択肢ではなかった。 –

+0

ええ、この状況は他の人の仕事と統合したくない人にとって不可避です。プッシュを強制すると、他の人に作業が強制されます。 –

関連する問題