最近、Mercurialに切り替えました。コミットされた変更が2つ失われるまで、すべてが順調に進んでいました。ログを調べても、私たちは賢くなりませんでした。
以下に例を示します。(1)でコミットされたファイルは、それらのファイルがマージで言及されていなくても、(2)で以前の状態に戻ります。
ファイルが元に戻った理由を理解するために何を確認できますか?
最近、Mercurialに切り替えました。コミットされた変更が2つ失われるまで、すべてが順調に進んでいました。ログを調べても、私たちは賢くなりませんでした。
以下に例を示します。(1)でコミットされたファイルは、それらのファイルがマージで言及されていなくても、(2)で以前の状態に戻ります。
ファイルが元に戻った理由を理解するために何を確認できますか?
このグラフには、(2)マージに影響を与える可能性のある3つの興味深いチェンジセットがあります。
Mercurialがマージを行う場合、重要な3つのチェンジセットは、マージする2つのヘッドとそれらの共通の祖先だけです。3方向マージでは、ロジックは次のようになります。
ancestor parent1 parent2 => merge
X X Y Y (clean)
X Y X Y (clean)
X Y Y Y (clean)
X Y Z W (conflict)
次のような表を読んでください。「祖先がX
で、最初の親もX
で、2番目の親がだったY
場合、マージにはY
」が含まれます。言い換えると、3方向のマージは変更を優先し、変更が優先されます。
あなたは先祖を見つけることができます
$ hg log -r "ancestor(p1(changeset-2), p2(changeset-2))"
ここで、changeset-2
は上記の(2)でマークされたものです。あなたが言う時
(1)でコミットされたファイルは、それらのファイルがマージで言及されていなくても、(2)で以前の状態に戻ります。
次に、「マージ」は、他の2つのチェンジセットを組み合わせる方法を示す単なるスナップショットであることを理解することが重要です。マージの「中で」行われた変更は、このスナップショットとその2つの親チェンジセットの違いです。
$ hg status --rev "p1(changeset-2):changeset-2"
$ hg status --rev "p2(changeset-2):changeset-2"
これは、マージチェンジセットが最初の親および2番目の親とそれぞれどのように異なるかを示しています。結局のところ、マージが原因でない限り、ファイルはこれらのリストの1つに記載されていると確信しています。
3つのチェンジセットとそれらの違いを調べると、誰かが競合を解決する必要があり(上記のマージテーブルの4行目)、途中のある段階で間違ったファイルを選択したことがわかります。
2でのマージは、非常に古いブランチ(ダークブルー、コミット1の直後にメインライン/グリーンブランチから分岐)とさらに古いブランチ(ライトブルー、コミット1の前からメインラインと同期されていない)の間です。
2でのマージで間違ったバージョンのファイルが選択された可能性があります。これが、間違ったバージョンのファイルを選択したツールなのか、ユーザーが手動で間違ったバージョンを選択したのかをここから判断することはできません。
追加するために編集:
2で何が変更されたかを正確に追跡するためにhg diff -r REV1 -r REV2
、を使用できます。これにより、任意の2つのリビジョン間の行ごとの違いが表示されます。
悪意がポイント1とポイント2の間に発生したことがわかっている場合はhg bisect
、悪意の正確な原因を突き止めるのに役立つ可能性があります。
hg bisect [-gbsr] [-U] [-c CMD] [REV]
チェンジセットの細分化検索
This command helps to find changesets which introduce problems. To use,
問題が発生していることがわかっている最も古いチェンジセットを不良としてマークし、問題のない最新のチェンジセットを良好としてマークします。
Bisectは、テスト用のリビジョンに作業ディレクトリを更新します(-U /-noupdateオプションが指定されていない場合)。テストを実行したら、作業ディレクトリに良いまたは悪いのマークを付けます。bisectは、別の候補のチェンジセットに更新するか、悪いリビジョンが見つかったことを通知します。