# Confused about "degenerate" combined diff for merge commits

2 messages from 2010-08-15 to 2010-08-15. Participants: Stefan Haller, Thomas Rast.
Thread: https://gitlist.dev/t/24749

## Stefan Haller, 2010-08-15 17:51

Subject: Confused about "degenerate" combined diff for merge commits
Message-ID: <1jna5yt.1pm42a3uw2yquM%lists@haller-berlin.de>
URL: https://gitlist.dev/e/1jna5yt.1pm42a3uw2yquM%25lists%40haller-berlin.de

```
(Git newbie alert. Please be patient with me if I'm missing obvious
things...)

I'm converting a moderately large repository from Subversion to git.  As
part of the process, I'm experimenting with correctly representing
merges in the resulting git repository. In Subversion, we used commit
logs such as "Merged r1234:1279 from branch_xyz", so in most cases it
should be possible to use this information to create the proper parents
in git. I'm currently trying how well this works by using grafts; but
that's not the question.

Now, I'm using "gitk --all --merges" to look at my synthesized merge
commits; and I assume that I manufactured them correctly if the
resulting combined diff is empty.  I only expect diff output for merge
conflicts with a non-trivial resolution, i.e. neither ours nor theirs
was used to resolve the conflict. Is this assumption correct so far?

However, for some of these merge commits I see diff output such as this:

diff --cc Src/ClipBoard.cpp
index 4357ea0,4357ea0..3fad79a
--- a/Src/ClipBoard.cpp
+++ b/Src/ClipBoard.cpp
@@@ -71,7 -71,7 +71,7 @@@ AClipBoard* AClipBoard::SNew(
  
  AClipBoard* AClipBoard::SClipBoard()
  {
--  static AClipBoard* spClipBoard = SNew();
++  static TPtr<AClipBoard> spClipBoard = SNew();
    return spClipBoard;
  }
  
It looks like both merge parents had an identical diff here, so this is
not a conflict; why does diff --cc even show this to me?


-- 
Stefan Haller
Berlin, Germany
http://www.haller-berlin.de/

```

## Thomas Rast, 2010-08-15 19:54

Subject: Re: Confused about "degenerate" combined diff for merge commits
Message-ID: <201008152154.57578.trast@student.ethz.ch>
URL: https://gitlist.dev/e/201008152154.57578.trast%40student.ethz.ch
In-Reply-To: <1jna5yt.1pm42a3uw2yquM%lists@haller-berlin.de>

```
Stefan Haller wrote:
> However, for some of these merge commits I see diff output such as this:
> 
> diff --cc Src/ClipBoard.cpp
> index 4357ea0,4357ea0..3fad79a
> --- a/Src/ClipBoard.cpp
> +++ b/Src/ClipBoard.cpp
> @@@ -71,7 -71,7 +71,7 @@@ AClipBoard* AClipBoard::SNew(
>   
>   AClipBoard* AClipBoard::SClipBoard()
>   {
> --  static AClipBoard* spClipBoard = SNew();
> ++  static TPtr<AClipBoard> spClipBoard = SNew();
>     return spClipBoard;
>   }
>   
> It looks like both merge parents had an identical diff here, so this is
> not a conflict; why does diff --cc even show this to me?

The --cc output has one column per parent, and if you removed all
other +/-/space columns, then (for that hunk) you'd have a unified
diff with that parent.

So I'd say the above means that both parents had

  static AClipBoard* spClipBoard = SNew();

but your merge result was

  static TPtr<AClipBoard> spClipBoard = SNew();

This is usually called an "evil merge" in git terms: it is introducing
changes that are neither coming from one side, nor part of a benign
merge resolution.

-- 
Thomas Rast
trast@{inf,student}.ethz.ch

```
