2016-04-18 12 views
1

私はちょうど約recursiveのマージ戦略は、oursパラメータを持つことがわかった。 ours戦略もあります。マージの際にgitマージ戦略が使用されましたか?

さらに多くの人がファイルを操作してリモートリポジトリにプッシュすると、私は来てgit pull -s oursを実行しますが、リモート変更を無視して代わりに私の代わりにします。

このファイルは、他の人物の履歴が残っていないように見えるため、これは非常に混乱しています。これを見るには、git log --follow <file>と書いてください。また、マージコミットを見ると、ファイルが影響を受けているという証拠はありません。

このようなことが起こったときは、どうすればわかりますか?使用されるマージ戦略を確認することは可能ですか?または、ファイルの履歴が変更されたことを確認することはできますか?

答えて

2

ファイルの履歴は変更されておらず、表示されるマージコミットに追加の変更はありませんでした。 -X oursまたは-s oursを使用すると、(コンフリクトまたは常に)マージされたツリーのどちら側が使用されるのかが示され、操作履歴は存在しません。そして、-X oursが存在するかどうかはもちろん検出できません。 -X oursを使用せずに、マージの面を完全に克服することで発生する競合を解決することもできます。同じ結果になるでしょう。正しいことをするのは合併の仕事です。

+0

おそらく、問題は 'git pull -s ours'でもっと問題になります。私がそれを行い、 'git log 'でファイルの履歴を見ると、他の人の変更は表示されません。彼らが姿を消したようです。そして、マージが歴史に現れないので、いつ起きたのかわかりません。 – Adi

+0

まあ、 '-s ours'は、矛盾したファイルだけでなく、すべてのファイルの"すべてのバージョンをマージから取る "と言っています。併合はもちろん歴史の一部であり、あなたは他の人々の変化を持っています。マージがあると、履歴は2つのパスになります。あなたが最初の親だけに従うならば、あなたはもちろんあなたの変更を見るでしょう、もしあなたが第2の親に従うならば、あなたは他の人の変化を見るでしょう。マージで新しい変更が導入されなかったため、マージでdiffが表示されません。マージの意味であるマージでファイルまたはバージョンの1つのバージョンを選択したばかりです... – Vampire

+0

...ファイルのどのバージョンがマージの正しい結果であるか、または2つの開発ブランチまた、 '-s ours'は、実際にそのオプションを使用せずに簡単に達成できるショートカットです。しかし、マージの親に対してポスト・マージ状態を比較することによって、それが使用されたかどうか(または同じ結果を出すために実行されたコマンド)をチェックすることができます。両親のうちの1つに相違がない場合、この親は '-s ours 'の説明と同じように、他のものの変更を破棄します。 – Vampire

1

(これは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、 を覚えるよりも もっと混乱して見つけること。

+0

ありがとう!私はスクリプトが役に立つと思います。現在、いくつかの誤検出が発生する可能性があります。 – Adi

関連する問題