62

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

以前は、ログをチェックして、人々がマージを行う理由を確認する必要がありました。しかし、diff3 を使用すると、情報はすべて 1 か所に表示されます。

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

そのことから、結果が「これは本当に便利です」であることが簡単にわかります。

diff3 に欠点があるのだろうか?git のデフォルトの動作ではないのはなぜですか?

4

4 に答える 4

66

他の読者の場合 (およびこの記事から):

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

git config --global merge.conflictstyle diff3

diff3 スタイルを有効にしない理由はありません。なぜなら、正しいマージが何であるかを判断するために祖先が必要になることがよくあるからです。

これはかなり早い段階 (2008 年)に導入されましたが、デフォルトではないと思います。デフォルトの Unixdiffは 3 方向の差分として表示されないからです。

Git 2.35 では、zdiff3 ( " Zealous diff3 ") もあります。


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

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

git checkout --conflict=diff3 <path...>

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


|||||| merged common ancestorsは git 2.24 (2019 年第 4 四半期) で進化することに注意してください。

コミット b657047 ( 201910月7日) 、コミット8e4ec33 ( 2019年101)参照しください。、コミット 4d7101eコミット 724dd76コミット 345480dコミット b4db8a2コミット 98a1d3dコミット 9822175commit 10f751c (2019 年 8 月 17 日) by Elijah Newren ( newren) .
( 2019 年 10 月 15 日、コミット 280bd44Junio C Hamanoによってマージされました)gitster

merge-recursive: diff3 共通の祖先により良いラベルを提供する

署名者: Elijah Newren

コミット 7ca56aa07619 ( " merge-recursive: 先祖のラベルを追加"、2010-03-20、Git v1.7.1-rc0 --マージ) では、' ' 行にラベルが追加され||||||、より有益な見出し ' |||||| merged common ancestors'が付けられました。ステートメントで:

より有益なラベルを使用する方が良いでしょう。
いつか誰かが提供してくれるかもしれません。

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

(そのような場合、より良いラベルは思いつきません。)

しかし、ユニークなマージ ベースがある場合とマージ ベースがない場合は、実際にはやや誤解を招く可能性があります。

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

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

3 つのケースのそれぞれについて正しい祖先名を取得することを確認するためのテストも追加されています。


Git 2.25 (2020 年第 1 四半期) では、" " は、マージのように構成変数git apply --3wayを尊重することを学びました。merge.conflictStyle

commit 091489d、commit aa76ae4commit 9580620commit b006968commit fa87b81 (2019 年 10 月 23 日) by Denton Liu ( Denton-L)を参照してください。
( 2019 年 11 月 10 日、コミット eff313fJunio C Hamanoによってマージされました)gitster

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

署名者: Denton Liu

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

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

于 2014-12-11T07:57:22.827 に答える