threads / discuss / 57569

understand Diff Formatting --cc flag?

Subject: understand Diff Formatting --cc flag?

## tl;dr

5 messages between Mar 16, 2022 and Mar 16, 2022.

replies: 4people: 2as markdown or json

Andy Zhang· Mar 16, 2022, 11:36 UTC · lore
understand Diff Formatting --cc flag?
hi,
  It is really too hard to understand Diff Formatting --cc flag.
  It is hard to understand"...hunks whose contents in the parents have
only two variants..".
  My question is:
   1)what does "variant" mean here?
   2)what about all the other cases? 0 variants, 1 variants, and 3
variants and even more?
   3)Can I understand "--cc" as simply as: "--cc lists only hunks
which were modified from all parents."
  Any comments, hinits are welcome!  Thank you in advance!

//--------------------------------------------------------------------- Here is the help from the command: git help log

   Diff Formatting
       Listed below are options that control the formatting of diff
output. Some of them are specific to git-rev-list(1), however other
diff options may be given. See git-diff-files(1) for more options.
       -c
           With this option, diff output for a merge commit shows the
differences from each of the parents to the merge result
simultaneously instead of showing pairwise diff between a parent and
the
           result one at a time. Furthermore, it lists only files
which were modified from all parents.
       --cc
           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 the merge result picks one of
           them without modification.
       -m
           This flag makes the merge commits show the full diff like
regular commits; for each merge parent, a separate log entry and diff
is generated. An exception is that only diff against the first
           parent is shown when --first-parent option is given; in
that case, the output represents the changes the merge brought into
the then-current branch.
Junio C Hamano· Mar 16, 2022, 16:04 UTC · re: Andy Zhang · lore

Re: understand Diff Formatting --cc flag?

Andy Zhang <zhgdrx@gmail.com> writes:
Show 11 quoted lines
> understand Diff Formatting --cc flag?
>
> hi,
>
>   It is really too hard to understand Diff Formatting --cc flag.
>
>   It is hard to understand"...hunks whose contents in the parents have
> only two variants..".
>
>   My question is:
>    1)what does "variant" mean here?

You may be comparing a merge of 5 parents into 1 child. There are 5 pairwise comparison (parent#1 with the child, parent#2 with the child, ..., parent#5 with the child).

Among 5 parents, perhaps parent#1 and parent#2 had the same contents, and parent#4 and parent#5 had the same contents, different from what parent#1 and parent#3 had. You have 3 variants (parent#1's, #3's and #4's; parent#2 has the same contents as #1, parent#5 has the same contents as #4).

>    2)what about all the other cases? 0 variants, 1 variants, and 3
> variants and even more?

By definition, you wouldn't be making any comparison if there are 0 variants. 1 variant means all the parents are identical, so whichever parent you are interested in, the difference to the child is interesting---such a change can only come from the person who merged adding a change that no parent wanted to have. If many parents are different then showing the comparison with the final resolution from them is useful. The case that is not so interesting is when one set of parents had something (call it A), and the other set of parents had something else (B), and the result is A. There is no interesting merge conflict in there.

Andy Zhang· Mar 16, 2022, 18:57 UTC · re: Junio C Hamano · lore

Re: understand Diff Formatting --cc flag?

On Thu, Mar 17, 2022 at 12:04 AM Junio C Hamano <gitster@pobox.com> wrote:
Show 25 quoted lines
>
> Andy Zhang <zhgdrx@gmail.com> writes:
>
> > understand Diff Formatting --cc flag?
> >
> > hi,
> >
> >   It is really too hard to understand Diff Formatting --cc flag.
> >
> >   It is hard to understand"...hunks whose contents in the parents have
> > only two variants..".
> >
> >   My question is:
> >    1)what does "variant" mean here?
>
> You may be comparing a merge of 5 parents into 1 child.  There are 5
> pairwise comparison (parent#1 with the child, parent#2 with the
> child, ..., parent#5 with the child).
>
> Among 5 parents, perhaps parent#1 and parent#2 had the same contents,
> and parent#4 and parent#5 had the same contents, different from what
> parent#1 and parent#3 had.  You have 3 variants (parent#1's, #3's
> and #4's; parent#2 has the same contents as #1, parent#5 has the
> same contents as #4).
>
[Andy wrote:] as per your comments, The 3 variants are indeed into the
following 3 groups.
My question is: why can #1 appear inside multiple groups? A and B.
   <group-A> parent#1, #3, #4;
   <group-B> parent#2, #1;
   <group-C> parent#5, #4;
Show 15 quoted lines
>
> >    2)what about all the other cases? 0 variants, 1 variants, and 3
> > variants and even more?
>
> By definition, you wouldn't be making any comparison if there are 0
> variants.  1 variant means all the parents are identical, so
> whichever parent you are interested in, the difference to the child
> is interesting---such a change can only come from the person who
> merged adding a change that no parent wanted to have.  If many
> parents are different then showing the comparison with the final
> resolution from them is useful.  The case that is not so interesting
> is when one set of parents had something (call it A), and the other
> set of parents had something else (B), and the result is A.  There is
> no interesting merge conflict in there.
>

[Andy wrote:] can I explain "--cc" flag as: "--cc lists only either hunks which were modified from all parents, or hunks which were modified from at least two parents and they had different variants"

Andy Zhang· Mar 16, 2022, 19:00 UTC · re: Junio C Hamano · lore

Re: understand Diff Formatting --cc flag?

On Thu, Mar 17, 2022 at 12:04 AM Junio C Hamano <gitster@pobox.com> wrote:
Show 25 quoted lines
>
> Andy Zhang <zhgdrx@gmail.com> writes:
>
> > understand Diff Formatting --cc flag?
> >
> > hi,
> >
> >   It is really too hard to understand Diff Formatting --cc flag.
> >
> >   It is hard to understand"...hunks whose contents in the parents have
> > only two variants..".
> >
> >   My question is:
> >    1)what does "variant" mean here?
>
> You may be comparing a merge of 5 parents into 1 child.  There are 5
> pairwise comparison (parent#1 with the child, parent#2 with the
> child, ..., parent#5 with the child).
>
> Among 5 parents, perhaps parent#1 and parent#2 had the same contents,
> and parent#4 and parent#5 had the same contents, different from what
> parent#1 and parent#3 had.  You have 3 variants (parent#1's, #3's
> and #4's; parent#2 has the same contents as #1, parent#5 has the
> same contents as #4).
>
[Andy wrote:] as per your comments, The 3 variants are indeed into the
following 3 groups.
My question is: why can #1 appear inside multiple groups? A and B.
   <group-A> parent#1, #3, #4;
   <group-B> parent#2, #1;
   <group-C> parent#5, #4;
Show 14 quoted lines
> >    2)what about all the other cases? 0 variants, 1 variants, and 3
> > variants and even more?
>
> By definition, you wouldn't be making any comparison if there are 0
> variants.  1 variant means all the parents are identical, so
> whichever parent you are interested in, the difference to the child
> is interesting---such a change can only come from the person who
> merged adding a change that no parent wanted to have.  If many
> parents are different then showing the comparison with the final
> resolution from them is useful.  The case that is not so interesting
> is when one set of parents had something (call it A), and the other
> set of parents had something else (B), and the result is A.  There is
> no interesting merge conflict in there.
>

[Andy wrote:] can I explain "--cc" flag as: "--cc lists only either hunks which were modified from all parents, or hunks which were modified from at least two parents and they had different variants"

Junio C Hamano· Mar 16, 2022, 19:39 UTC · re: Andy Zhang · lore

Re: understand Diff Formatting --cc flag?

Andy Zhang <zhgdrx@gmail.com> writes:
Show 13 quoted lines
>> Among 5 parents, perhaps parent#1 and parent#2 had the same contents,
>> and parent#4 and parent#5 had the same contents, different from what
>> parent#1 and parent#3 had.  You have 3 variants (parent#1's, #3's
>> and #4's; parent#2 has the same contents as #1, parent#5 has the
>> same contents as #4).
>>
>
> [Andy wrote:] as per your comments, The 3 variants are indeed into the
> following 3 groups.
> My question is: why can #1 appear inside multiple groups? A and B.
>    <group-A> parent#1, #3, #4;
>    <group-B> parent#2, #1;
>    <group-C> parent#5, #4;

The three variants in my sample scenario were (A) used by #1, (B) used by #3, and (C) used by #4. #2 uses (A) and #5 uses (C).

The contents of #1 does appear twice, in #1 itself and also in #2. That is what "#2 has the same contents as #1" means.

> [Andy wrote:] can I explain  "--cc" flag as:
> "--cc lists only either hunks which were modified from all parents, or
> hunks which were modified from at least two parents and they had
> different variants"

I do not have time to see if that matches the official explanation found in "git diff --help", which I just re-read and I think it gives the right definition.

← back to recent threads