web-dev-qa-db-ja.com

Mercurial:1つのリポジトリ内のブランチ間で1つのファイルをマージする

Hgリポジトリに2つのブランチがある場合、チェンジセットの他のすべてのファイルをマージせずに、1つのファイルのみを別のブランチにマージするにはどうすればよいですか?

チェンジセット全体ではなく、特定のファイルのみをマージすることは可能ですか?

49
Jox

警告:@Martin_Geislerによって推奨されているような「ダミーマージ」は、後で2つのブランチの真のマージを実行したい場合に、実際に混乱させる可能性があります。ダミーマージが記録され、ダミーマージを行ったブランチにマージすると言います。変更は表示されません。または、他のブランチにマージした場合、その他のブランチでの変更は元に戻されます。

ファイル全体をあるブランチから別のブランチにコピーするだけの場合は、次のようにするだけです。

   hg update -r to-branch
   hg revert -r from-branch file
   hg ci -m 'copied single file from from-branch to to-branch

そのファイルのさまざまな部分を選択する場合は、"hg record"は便利です。

私は自分のホームディレクトリ.hgignoreでこれを実行しました。

両方のブランチが保持したいファイルに変更を加えた場合、汚いトリックは、おそらく/おそらくさらに別のブランチで、hg mergeを使用して2つのブランチのマージを作成し、それをチェックインしてから、単一のファイルをコピーすることです。マージとto-branchの間:

   hg update -r to-branch
   branch merge-branch
   hg merge -r from-branch
   hg ci -m 'temp merge to be discarded"
   hg update -r to-branch
   hg revert -r merge-branch single-file
   hg ci -m 'merged single-file from from-branch to to-branch"
   hg strip merge-branch

言及する価値があります:「ブランチ間で単一のファイルをコピーする」(またはリビジョン間、またはリビジョンからマージまで、または....)方法は「hgrevert」です。つまり.

   hg update -r Where-you-want-to-copy-to
   hg revert -r Where-you-want-to-copy-from file-you-want-to-copy
   ...
   hg ci

どういうわけか、私と私の同僚の何人かは、これを見つけます[〜#〜]非常に[〜#〜]混乱します。 "revert" == "copy" ...いくつかの使用パターンには意味がありますが、すべてではありません。

55
Krazy Glew

いいえ。 Mercurialはチェンジセットベースで動作します。

ただし、「 ダミーマージ 」を実行して、ブランチの1つからの着信変更を無視することができます。コミットする前に、選択したファイルを任意の状態に戻すことができます。

% HGMERGE=internal:local hg merge     # keep my files
% hg revert --rev other-branch a.txt  # update a.txt to other branch
% hg commit -m 'Dummy merge to pick a.txt from other-branch.'

多分それはあなたを少し助けるでしょう。

18
Martin Geisler

vimdiffのような外部ツールを使用して、マージする2つのファイルを比較し、それらをマージします。これの利点は、ファイルの一部を選択的に編集できることです。例えば:

hg update -r branch-merging-to
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging

これを行うには、.hgrcで外部ツールを有効にする必要があります。これは、次の行を追加することを意味します。

[extensions]
hgext.extdiff =  
1
Toby Searle