web-dev-qa-db-ja.com

Mercurial / Meldでの3ウェイマージはどのように機能しますか?

私は、すぐには発見されなかった主要な問題を伴う機能を導入するコミットがあるプロジェクトに取り組んでいます。作業を続けながらそのリビジョンを完全に削除したいのですが、この3ウェイマージに頭を悩ませています。これが私のプロジェクトの簡略化されたグラフです。

 oチェンジセット:134:7f81764aa03a 
 |タグ:tip 
 |親:128:451d8a19edea 
 |概要:バックアウトされたチェンジセット451d8a19edea 
 | 
 | @チェンジセット:133:5eefa40e2a29 
 | |要約:(変更を維持する必要があります)
 | | 
 * snip3コミット* 
 | oチェンジセット:129:5f6182a97d40 
 | /要約:(変更を保持する必要があります)
 | 
 oチェンジセット:128:451d8a19edea 
 |要約:(大きな問題を引き起こした変更)
 | 
 oチェンジセット:127:4f26dc55455d 
 |要約:(要約はこの質問には関係ありません)

これを正しく理解していれば、r127とr134はまったく同じです。私がhg up -C -r 133そして実行hg merge、Meldは、私のファイルの1つであるローカル、ベース、その他の3つの形式でポップアップ表示されます。ローカルはr133のようですが、「ベース」と「その他」の意味に頭を悩ませるのに苦労しています。

33
Asa Ayers

ローカルはr133です

その他はr134です

ベースはr128(r133とr 134の両方に共通の祖先)

3ウェイマージを実行すると、3つすべてを比較して、何をどこから取得するかを決定するのに役立ちます。他のリビジョンでどのような変更があり、共通の祖先がどのように見えるかを確認することで、何を保持し、何を変更するかについて、より多くの情報に基づいた決定を下すことができます。

35
Matthew Manela

あなたの質問は本当に紛らわしいですが、ここにあなたを助けるかもしれないいくつかの情報があります。

  • ベースとは何ですか?

ベースは、現在チェックアウトして作業しているリビジョンの変更されていないバージョンです。おそらく他の変更が分岐している場合(現在のローカルとベースの間にリビジョンを含めることができます!)。その後、他のフォークが迂回していない最も近いリビジョン(同じ親)(あなたの場合はr128)

  • 頭とは?

Headは、バージョン管理の最新リビジョンです。 1つのコピーだけで単独で作業する場合は、おそらくベースになります。しかし、同僚が同じファイルを変更してバージョン管理にチェックインした可能性があります。その場合、headはベースよりも遅くなります。

  • ローカルとは何ですか?

ローカルは変更されたバージョンです(あなたの場合はr133)

  • 他には何がありますか?

その他は、親としてベース(この場合はr134)も持つフォーク/ブランチです。

  • 3方向マージはどのように機能しますか?

3ウェイマージは(少なくともメルドでは)階層的に機能します。通常、このように左から右へ:

ローカル>ベース>その他/ヘッド

ローカル/ベースは、変更したものだけなので、ほとんどの場合簡単です。

次に、変更をヘッドリビジョンまたは同僚のリビジョンなどにマージできます。

他の/ヘッドリビジョンが複数存在する可能性がありますが、マージするのはあなたの仕事ではないため、3つ以上の方法で比較しても意味がありません。

11
The Surrican