# "git diff" surprising default output

3 messages from 2023-03-01 to 2023-03-01. Participants: Sergey Organov, Junio C Hamano.
Thread: https://gitlist.dev/t/59330

## Sergey Organov, 2023-03-01 18:25

Subject: "git diff" surprising default output
Message-ID: <871qm849co.fsf@osv.gnss.ru>
URL: https://gitlist.dev/e/871qm849co.fsf%40osv.gnss.ru

```
Hello,

By default, 'git diff' produces an output that is often rather
surprising and difficult to grok, here is a simple example:

$ git diff --no-index -- f0.txt f1.txt
diff --git a/f0.txt b/f1.txt
index 3af00a929..35478f7bd 100644
--- a/f0.txt
+++ b/f1.txt
@@ -3,9 +3,6 @@
 #endif
 #if CANOPEN > 0
     IMD_CANOPEN,
-#endif
-#if MDL_LASER > 0
-    IMD_LASER,
 #endif
     IMD_AUTO,
     IMD_NONE,

I figured the offender is --indent-heuristic that is described in the
manual as:

      Enable the heuristic that shifts diff hunk boundaries to make
      patches easier to read. This is the default.

but apparently rather makes patches harder to read, at least at some
conditions. Turning it off helps to get the expected result:

$ git diff --no-index --no-indent-heuristic -- f0.txt f1.txt
diff --git a/f0.txt b/f1.txt
index 3af00a929..35478f7bd 100644
--- a/f0.txt
+++ b/f1.txt
@@ -4,9 +4,6 @@
 #if CANOPEN > 0
     IMD_CANOPEN,
 #endif
-#if MDL_LASER > 0
-    IMD_LASER,
-#endif
     IMD_AUTO,
     IMD_NONE,
     IMD_COUNT


Changing --diff-algorithm doesn't change the outcome.

So the questions are:

- Is there an example of an advantage the option has?

- Is it possible to flip the default?

Thanks,
-- Sergey Organov

```

## Junio C Hamano, 2023-03-01 19:40

Subject: Re: "git diff" surprising default output
Message-ID: <xmqqzg8wmfa6.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqqzg8wmfa6.fsf%40gitster.g
In-Reply-To: <871qm849co.fsf@osv.gnss.ru>

```
Sergey Organov <sorganov@gmail.com> writes:

> I figured the offender is --indent-heuristic that is described in the
> manual as:
>
>       Enable the heuristic that shifts diff hunk boundaries to make
>       patches easier to read. This is the default.
>
> but apparently rather makes patches harder to read, at least at some
> conditions. Turning it off helps to get the expected result:

As a heuristic, it is not surprising that it has some corner cases
where it does not shine.  I think the version that was eventually
merged starts here

  https://lore.kernel.org/git/cover.1473068229.git.mhagger@alum.mit.edu/

and we should be able to find a few links to the original
observation that motivated the change, e.g.

  https://public-inbox.org/git/cover.1470259583.git.mhagger@alum.mit.edu/



Thanks.

```

## Sergey Organov, 2023-03-01 20:28

Subject: Re: "git diff" surprising default output
Message-ID: <87sfeo2p38.fsf@osv.gnss.ru>
URL: https://gitlist.dev/e/87sfeo2p38.fsf%40osv.gnss.ru
In-Reply-To: <xmqqzg8wmfa6.fsf@gitster.g>

```
Junio C Hamano <gitster@pobox.com> writes:

> Sergey Organov <sorganov@gmail.com> writes:
>
>> I figured the offender is --indent-heuristic that is described in the
>> manual as:
>>
>>       Enable the heuristic that shifts diff hunk boundaries to make
>>       patches easier to read. This is the default.
>>
>> but apparently rather makes patches harder to read, at least at some
>> conditions. Turning it off helps to get the expected result:
>
> As a heuristic, it is not surprising that it has some corner cases
> where it does not shine.  I think the version that was eventually
> merged starts here
>
>   https://lore.kernel.org/git/cover.1473068229.git.mhagger@alum.mit.edu/
>
> and we should be able to find a few links to the original
> observation that motivated the change, e.g.
>
>   https://public-inbox.org/git/cover.1470259583.git.mhagger@alum.mit.edu/

Thanks a lot for the references!

From what I briefly read there it apparently follows that it'd shine at
regular C code, yet won't shine at preprocessor directives that are
usually out of regular alignment.

It'd be nice to improve this, but I'm not sure it's a simple thing to
fix, or even at all possible, though maybe it'd help to somehow favoring
chunks that start and end at the same alignment?

Or maybe it's just plain bug in the implementation?

Thanks,
-- Sergey Organov

```
