web-dev-qa-db-ja.com

diff3はgitのデフォルトの競合スタイルにする必要がありますか?

最近diff3を有効にしたので、競合を解決するのがはるかに簡単になりました。

以前は、場合によっては、ログをチェックして、なぜこれを行ったのか、そしてマージを行うためにそれを行ったのかを確認する必要がありました。しかしdiff3では、情報はすべて1か所に表示されます

<<<<<<< HEAD
THIS IS USEFUL
||||||| merged common ancestors
This is useful
=======
This is really useful
>>>>>>> c2392943.....

それから、結果は "THIS IS REALLY USEFUL"となるはずです。

Diff3にマイナス面はあるのでしょうか?なぜそれがgitのデフォルトの動作ではないのですか?

34
Pham

他の読者(そして この記事から ):

gitには、マージの競合を_diff3_形式で表示するオプションがあります(デフォルトでは、マージされる2つのファイルのみが表示されます)。次のように有効にできます:

_git config --global merge.conflictstyle diff3
_

正しいマージが何であるかを決定するために祖先が頻繁に必要になるため、diff3スタイルを有効にしてはならない理由は本当にありません。

これは かなり早い(2008年) で導入されました。デフォルトのUNIX差分は3ウェイ差分として表示されないため、これはデフォルトではないようです。


前述のように このスレッド内 で、設定を設定せずにこのコマンドを実行して、通常のdiffとdiff3sを簡単に切り替えることができるようにする場合、これは特定のケースで可能です。

インデックスで競合がマークされている場合(つまり、競合がマージされた後、パスを解決済みとしてマークする前の状態)、次のことができます。

_git checkout --conflict=diff3 <path...>
_

これは実際にインデックスの内容を作業ツリーにチェックアウトしているため、競合する作業ツリーのコピーに対して行った編集は上書きされることに注意してください。


_|||||| merged common ancestors_はgit 2.24(Q4 2019)で進化することに注意してください

commit b657047 (2019年10月7日)、 commit 8e4ec (2019年10月1日)、および commit 4615a8ccommit 45ef16f を参照=、 commit f3081dacommit 5bf7e57commit e95e481commit a779fb8commit 8599ab4 =、 commit 7c0a6c8commit c749ab1commit bab5687commit ff1bfa2commit 4d7101e =、 commit 724dd76commit 345480dcommit b4db8a2commit 98a1d3dcommit 9822175 =、 commit 10f751c (2019年8月17日)by Elijah Newren(newren
Junio C Hamano-gitster- によってマージ commit 280bd44 、2019年10月15日)

_merge-recursive_ :diff3共通の祖先により適切なラベルを提供します

サインオフ:Elijah Newren

commit 7ca56aa07619 ( "_merge-recursive_:add a label for ancestor"、2010-03-20、Git v1.7.1-rc0- merge )、a '_||||||_'行にラベルが追加され、よりわかりやすい見出し '_|||||| merged common ancestors_'が次のステートメントで示されます。

より情報量の多いラベルを使用した方がよいでしょう。
おそらく誰かがいつか1つ提供するでしょう。

この選択されたラベルは、再帰が始まるとき、つまり複数のマージベースがあるとき、完全に合理的でした。

(私はそのような場合、より良いラベルを考えることはできません。)

ただし、一意のマージベースがある場合、またはマージベースがない場合は、実際には多少誤解を招きます。

マージベースの数に基づいてこれを変更します。

_>=2: "merged common ancestors"
1:   <abbreviated commit hash>
0:   "<empty tree>"
_

また、3つのケースそれぞれに適切な祖先名が得られることを確認するためのテストも追加されています。


Git 2.25(2020年第1四半期)では、「_git apply --3way_」はマージと同様に_merge.conflictStyle_構成変数を尊重することを学びました。

commit 091489dcommit aa76ae4commit 958062commit b006968commit fa87b81 を参照してください(2019年10月23日) Denton Liu(_Denton-L_) による。
Junio C Hamano-gitster- によってマージ commit eff313f 、2019年11月10日)

apply :--3wayのmerge.conflictStyleを尊重します

サインオフ:Denton Liu

以前は、3者間マージを行う場合、_merge.conflictStyle_オプションが考慮されず、 "_diff3_"が指定されていても、常に "merge"スタイルが使用されていました。

git_xmerge_config()の最後でgit_apply_config()を呼び出して、merge.conflictStyle構成が読み取られるようにします。

38
VonC