37952


`git log --help`で読めるヘルプの`-cc`オプションについての説明で理解し切れないところがあります。

>   1. "omitting hunks whose contents in the parents have only two variants"
>   2. "merge result picks one of them"
>

**1に関して：** 「マージ後とその親の間で、変更点が2つ以下のhunkは省略しますよ」という理解でよいのでしょうか？

**2に関して：** "them"が何を指しているのか、また、マージ後のcombined diffを見ようとするための`git log
--cc`で、どうしてマージ結果はthemのうち1つを"選ぶ(?)"ということになるのか(マージ結果は確定しているのでは？)、という2点が分かりません。


CC BY-SA 3.0
2017-09-13T13:16:39.323
37928
2017-09-15T07:03:54.250
2017-09-14T04:07:28.960
3060
25367
question
git
git log --helpで読めるヘルプの-ccオプションについて


興味があったので調べてみました。私の解釈として回答させて下さい。  
ちなみに私は英語は母国語ではないので、そこは割り引いて下さい。

`git log --help` の該当する `--cc` の部分の内容は多分2008年以降変わっていないと思うので
([最終更新](https://git.kernel.org/pub/scm/git/git.git/commit/Documentation/rev-
list-options.txt?id=b1264da8637dc991b84e329c2c4958c1332d069f))
以下に引用して、整形・括弧書きを追加しました。

> This flag implies the -c option and further compresses the patch output by  
>  omitting uninteresting hunks
>
> whose contents in the parents have only two variants  
>  and  
>  (which are) the merge result picks one of them without modification.

ハンクを省略するのはどんな場合かを説明していて、後ろの方の `and`
以降もその説明の一部なんだろう、というのが私の解釈です、つまり、質問者さんの挙げている、1と2に該当する場合に「hunkを省略しますよ」と言っていると解釈します。

`uninteresting hunks` 以降は関係代名詞を経て、それを説明していると考えることができます。 `and`
の直後には、主格の関係代名詞+be動詞が省略されていて、先行する `hunks` の説明が続いている、と。それと `hunks` を受けているのに `the
merge result` のように `result`
が単数形なのは、マージの結果は必ず一つ・単数になるわけなので、と考えました。冗長な感じですけれども以下のような日本語になるのかなと思います。

> 興味のないハンクを省略することでパッチの出力をより最小化します、  
>  興味のないハンクというのは以下のようなものです。
>
>   * 複数ある親でも内容は二種類で、
>   * 変更無しにその（親の内容の）うちの一つを選んだようなマージ結果である
>

>
> ようなハンクです。

以下が私の考える訳です。

>
> 親の内容が二種類で、変更無しにその（親の）うちの一つを選んだようなマージ結果であるような、興味のないハンクを省略することで、パッチの出力をより最小化します。

`git log -p` 等のハンクは通常のコミットの場合には、一つの親と一つの子という２つの内容の差分が表示されます。マージ時の場合でも同様なのですが、
`--cc` では、 `-c` も暗に指定されたことになり、マージコミットでは複数の親と一つの子の差分が一斉に表示(combined diff
format)されます。この時、 `--cc` が指定された場合には、パッチの出力がより小さくされて、上記のようなハンクが表示されなくなります。

こちらに、  
<https://gist.github.com/hchbaw/31f9d89b9e21f9ad43a4f6c699436d78>  
combined diff formatであっても、 `-c` と `--cc`
では表示が変わるものを作ってみました。masterブランチの最後一番上がマージコミットになっています。

`-c` のみの場合、差分の表示は以下です。

[code]

    diff --combined txt.txt
    index 54ac207,c53a8d3..2857086
    --- a/txt.txt
    +++ b/txt.txt
    @@@ -7,8 -7,8 +7,9 @@@ Add Hell
           7  txt
           8  txt
           9  txt
     +Hello
          10  txt
    + World
          11  txt
          12  txt
          13  txt
    @@@ -18,4 -18,5 +19,5 @@@
          17  txt
          18  txt
          19  txt
    -     20  txt
    + Add World
    + Add World one more
    
[/code]

`--cc` の場合は以下です。

[code]

    diff --cc txt.txt
    index 54ac207,c53a8d3..2857086
    --- a/txt.txt
    +++ b/txt.txt
    @@@ -7,8 -7,8 +7,9 @@@ Add Hell
           7  txt
           8  txt
           9  txt
     +Hello
          10  txt
    + World
          11  txt
          12  txt
          13  txt
    
[/code]

ここで `--cc` の場合に、下のハンク (`-c` のみの時には表示されていた、 `@@@ -18,4 -18,5 +19,5 @@@`
以降の部分)は省略されています。理由は、マージ結果の親がhelloとworldブランチで、それらの内容はhelloブランチのものとworldブランチのものの二種類であり、その内の一つ（この場合、worldブランチのもの）が編集無しに選ばれているためです。

競合した、もしくは競合しそうだった箇所のみを見るのに便利なオプションだと思います。

* * *

参考: combined diff format で該当箇所をスキップする処理は [combine-
diff.c](https://git.kernel.org/pub/scm/git/git.git/tree/combine-
diff.c?h=v2.14.1#n577)
で行われています。で、[ここのコメント](https://git.kernel.org/pub/scm/git/git.git/tree/combine-
diff.c?h=v2.14.1#n645)を見ると、この解釈で当たらずとも遠からずと思っています。

> Even when we have only two versions, if the result does not match any of the
> parents, the it should be considered interesting.


CC BY-SA 3.0
2017-09-15T03:03:06.577
37952
2017-09-15T07:03:54.250
2017-09-15T07:03:54.250
3383
3383
37928
answer