(これはBjörn Kautler's answerに追加するものではなく、コメントには長すぎるとフォーマット-Yです。)
編集:その第一及び第二の両親へのマージを比較し、-s ours
マージを見つけるために(追加の親があれば)。最初のものと同じであるが他のものと異なる場合は、-s ours
で行われたマージ、または同等のものを生成した手動の解決で完了したマージです。シェルワンライナー(も...とても長い1行、およびテストされていない)として
:
git rev-list --merges --parents HEAD |
while read commit first rest; do
test $(git diff --name-only $commit $first | wc -l) -ne 0 && continue;
set -- $rest;
anydiff=false;
for i do
test $(git diff --name-only $commit $i | wc -l) -ne 0 && anydiff=true;
done;
$anydiff && echo "merge $commit is (effectively) -s ours";
done
すべてがここに(HEAD)から到達可能なマージ見つけ、です。いくつかありますが:
- が
$commit
は$first
(その最初の親)と異なる場合、スキップ:ありません-s ours
。
- 残りの親の場合
$commit
が$i
と異なる場合は、それが異なっていることに注意してください(これもまたスピードアップの点ではbreak
でも可能です)。
- 最初の親と同じだが他の親とは違う場合は、
-X ours
と-s ours
の間には大きな、重要な違いがあります。それはcalled out in the documentationです:これはヘッドの任意の数を解決する
[-s]私たちが、マージの結果ツリーは、効果的にすべての変更をすべて無視して、常に現在のブランチヘッドのものです他の支店。これは、サイドブランチの古い開発履歴に取って代わるために使用されることを意図しています。これは再帰マージ戦略の-Xours
オプションとは異なります。
私はこのメモが本当に強くないと思います。私はまだそれに取り組んでおりますが、ここで私は、「マージ」の章ではこれについて言うことです:私たちはすでに-X theirs
オプションを見てきました
。 -X ours
は、Mercurialの:merge-local
ツール に対応し、競合が発生した場合には という変更を選択します。 キャロルのマージの場合、 これは、アリスの変更が の場合、 の方がボブの変更を受け入れることになりますが、 はコンフリクトがないことを意味します。
は、[...]これらの-X
のオプションに加えて
、 git merge
は-s strategy
オプションを提供します。 これらのほとんどは、私たちがここでは無視するために十分に特化されていますが、 を悪用しやすいので、特に を呼び出す必要があります。
紛らわしい、 git merge
は-s ours
、 を提供していますが-s ours
は非常に異なるアクション-X ours
より を持っています。 のGitの-s ours
コミット現在のと同じソースツリーを維持 、その作用であるにすべてのターゲット・ファイルを無視し廃棄 (またはMercurialの中他ファイル) 、Mercurialの:local
マージツールに相当します。 Git でのこの種のマージの主な用途は、トピックまたは機能ブランチ をkillして、つまりメインラインブランチに戻すことです。 これは、履歴調査のコミットDAGに、 と記録されていますが、メインラインブランチ からすべての処理が廃棄されました。 失敗した実験としてマークします。 (私たちは、もちろん、:local
を使用してMercurialに、 で同じことを行うことができます。 しかし、Mercurialの枝が殺されることができない、 ので、これには実際のポイントはありません。)
この缶--strategy strategy
、 を綴ったが、私は、これは実際に”を拡張だけ“放置-X
で-s
と-X
、 を覚えるよりも もっと混乱して見つけること。
おそらく、問題は 'git pull -s ours'でもっと問題になります。私がそれを行い、 'git log'でファイルの履歴を見ると、他の人の変更は表示されません。彼らが姿を消したようです。そして、マージが歴史に現れないので、いつ起きたのかわかりません。 –
Adi
まあ、 '-s ours'は、矛盾したファイルだけでなく、すべてのファイルの"すべてのバージョンをマージから取る "と言っています。併合はもちろん歴史の一部であり、あなたは他の人々の変化を持っています。マージがあると、履歴は2つのパスになります。あなたが最初の親だけに従うならば、あなたはもちろんあなたの変更を見るでしょう、もしあなたが第2の親に従うならば、あなたは他の人の変化を見るでしょう。マージで新しい変更が導入されなかったため、マージでdiffが表示されません。マージの意味であるマージでファイルまたはバージョンの1つのバージョンを選択したばかりです... – Vampire
...ファイルのどのバージョンがマージの正しい結果であるか、または2つの開発ブランチまた、 '-s ours'は、実際にそのオプションを使用せずに簡単に達成できるショートカットです。しかし、マージの親に対してポスト・マージ状態を比較することによって、それが使用されたかどうか(または同じ結果を出すために実行されたコマンド)をチェックすることができます。両親のうちの1つに相違がない場合、この親は '-s ours 'の説明と同じように、他のものの変更を破棄します。 – Vampire