{"thread":{"id":"57573","subject":"Git has two ways to count modified lines","startedAt":"2022-03-16T18:08:38Z","lastAt":"2022-04-05T21:50:09Z","messageCount":7,"participants":["Laurent Lyaudet","René Scharfe","Ævar Arnfjörð Bjarmason"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"451494","messageId":"CAB1LBmvX4kv3yqSZ+X4Ozkb9esUem3U1JY48kWVi_Eef78Sk=Q@mail.gmail.com","threadId":"57573","inReplyTo":null,"subject":"Git has two ways to count modified lines","fromName":"Laurent Lyaudet","fromEmail":"laurent.lyaudet@gmail.com","sentAt":"2022-03-16T18:08:22Z","receivedAt":"2022-03-16T18:08:38Z","isPatch":false,"sender":{"key":"laurent.lyaudet@gmail.com","avatar":null},"body":"Hello,\n\nI check the number of lines modified by my commits by hand,\nand today I had a surprising count :\n\n1) I commit and get the following count\nlaurent@laurent-GL73-8SD:~/ReposGit/flow$ git commit\n[master c068911] Task CU-21ph8h7 add buttons in PresenceList: \"Tout\ndéplier\", \"Tout replier\", for this the useState for showDetail\n(boolean) in Presence is replaced by a useState for showDetails (Set\nof ids) in PresenceList; correction missing tr between thead and ths\nin PresenceList.\n 2 files changed, 88 insertions(+), 48 deletions(-)\n rewrite src/apps/logs/components/PresenceList.js (61%)\n\n2) I check the diff by hand, it doesn't match.\nI check on github, it agrees with my manual count.\n\n3) I try to get the same answer again in command-line.\nlaurent@laurent-GL73-8SD:~/ReposGit/flow$ git log -1 --shortstat\ncommit c068911547bddbf7bfc4ddc7a68ee8482421ed5c (HEAD -> master,\norigin/master, origin/HEAD)\nAuthor: Laurent Lyaudet <laurent.lyaudet@gmail.com>\nDate:   Wed Mar 16 18:40:25 2022 +0100    Task CU-21ph8h7 add buttons\nin PresenceList: \"Tout déplier\", \"Tout replier\",\n    for this the useState for showDetail (boolean) in Presence is replaced\n    by a useState for showDetails (Set of ids) in PresenceList;\n    correction missing tr between thead and ths in PresenceList. 2\nfiles changed, 71 insertions(+), 31 deletions(-)\n\nHow comes git has two ways to count modified lines ?\nHow can I make git output again the same numbers than just after commit ?\nHow can I check how it computed these numbers in the first place ?\n\nThanks, best regards,\n    Laurent Lyaudet\n"},{"id":"452965","messageId":"CAB1LBms3F1EGswxF9mO=JrmWmj4XFncv4ZrkAy-dvOHdVrkwLQ@mail.gmail.com","threadId":"57573","inReplyTo":"CAB1LBmvX4kv3yqSZ+X4Ozkb9esUem3U1JY48kWVi_Eef78Sk=Q@mail.gmail.com","subject":"Re: Git has two ways to count modified lines","fromName":"Laurent Lyaudet","fromEmail":"laurent.lyaudet@gmail.com","sentAt":"2022-04-02T16:49:00Z","receivedAt":"2022-04-02T16:49:17Z","isPatch":false,"sender":{"key":"laurent.lyaudet@gmail.com","avatar":null},"body":"Le mer. 16 mars 2022 à 19:08, Laurent Lyaudet\n<laurent.lyaudet@gmail.com> a écrit :\n>\n> Hello,\n>\n> I check the number of lines modified by my commits by hand,\n> and today I had a surprising count :\n>\n> 1) I commit and get the following count\n> laurent@laurent-GL73-8SD:~/ReposGit/flow$ git commit\n> [master c068911] Task CU-21ph8h7 add buttons in PresenceList: \"Tout\n> déplier\", \"Tout replier\", for this the useState for showDetail\n> (boolean) in Presence is replaced by a useState for showDetails (Set\n> of ids) in PresenceList; correction missing tr between thead and ths\n> in PresenceList.\n>  2 files changed, 88 insertions(+), 48 deletions(-)\n>  rewrite src/apps/logs/components/PresenceList.js (61%)\n>\n> 2) I check the diff by hand, it doesn't match.\n> I check on github, it agrees with my manual count.\n>\n> 3) I try to get the same answer again in command-line.\n> laurent@laurent-GL73-8SD:~/ReposGit/flow$ git log -1 --shortstat\n> commit c068911547bddbf7bfc4ddc7a68ee8482421ed5c (HEAD -> master,\n> origin/master, origin/HEAD)\n> Author: Laurent Lyaudet <laurent.lyaudet@gmail.com>\n> Date:   Wed Mar 16 18:40:25 2022 +0100    Task CU-21ph8h7 add buttons\n> in PresenceList: \"Tout déplier\", \"Tout replier\",\n>     for this the useState for showDetail (boolean) in Presence is replaced\n>     by a useState for showDetails (Set of ids) in PresenceList;\n>     correction missing tr between thead and ths in PresenceList. 2\n> files changed, 71 insertions(+), 31 deletions(-)\n>\n> How comes git has two ways to count modified lines ?\n> How can I make git output again the same numbers than just after commit ?\n> How can I check how it computed these numbers in the first place ?\n>\n> Thanks, best regards,\n>     Laurent Lyaudet\n\nHello,\n\nI thought my email was sent to the right mailbox, at least it is what\nsays this website :\nhttps://git-scm.com/community\n> General questions or comments for the Git community can be sent to the mailing list by using the email address git@vger.kernel.org.\nMoreover this website is cited in the README here :\nhttps://github.com/git/git/blob/master/README.md\n> Many Git online resources are accessible from https://git-scm.com/ including full documentation and Git related tools.\nIs there any problem with my questions explaining I got no answer, please ?\n\nI have found a partial explanation for the count differences :\n>  2 files changed, 88 insertions(+), 48 deletions(-)\n>  rewrite src/apps/logs/components/PresenceList.js (61%)\nWhen committing, a file considered as \"rewrite\" is counted like m\nlines deleted and n lines added if it had m lines before and n lines\nafter.\nEven if the diff is much smaller.\nHence I answered my question :\n> How can I check how it computed these numbers in the first place ?\nBut the two other questions remains :\n> How comes git has two ways to count modified lines ?\ni.e. What is (was) the purpose of this rewrite counting (when coded) ?\n> How can I make git output again the same numbers than just after commit ?\n\nThanks, best regards,\n    Laurent Lyaudet\n"},{"id":"452969","messageId":"d650bb90-df94-eeab-0684-ee447e080ad6@web.de","threadId":"57573","inReplyTo":"CAB1LBms3F1EGswxF9mO=JrmWmj4XFncv4ZrkAy-dvOHdVrkwLQ@mail.gmail.com","subject":"Re: Git has two ways to count modified lines","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2022-04-02T21:55:39Z","receivedAt":"2022-04-02T21:55:53Z","isPatch":false,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Am 02.04.22 um 18:49 schrieb Laurent Lyaudet:\n> Le mer. 16 mars 2022 à 19:08, Laurent Lyaudet\n> <laurent.lyaudet@gmail.com> a écrit :\n>>\n> I thought my email was sent to the right mailbox, at least it is what\n> says this website :\n> https://git-scm.com/community\n\nSure it was.\n\n>> General questions or comments for the Git community can be sent to\n>> the mailing list by using the email address git@vger.kernel.org.\n> Moreover this website is cited in the README here :\n> https://github.com/git/git/blob/master/README.md\n>> Many Git online resources are accessible from https://git-scm.com/\n>> including full documentation and Git related tools.\n> Is there any problem with my questions explaining I got no answer,\n> please ?\nNot really, don't worry.\n\n> I have found a partial explanation for the count differences :\n>>  2 files changed, 88 insertions(+), 48 deletions(-)\n>>  rewrite src/apps/logs/components/PresenceList.js (61%)\n> When committing, a file considered as \"rewrite\" is counted like m\n> lines deleted and n lines added if it had m lines before and n lines\n> after.\n> Even if the diff is much smaller.\n\nGit stores the file contents before and after your change.  It doesn't\nstore any diff, but calculates them as needed, e.g. for the commit\nconfirmation message, or when you run git diff.  So in that sense there\nis no \"the diff\".  The difference between two stored states can be\nrepresented in many ways.\n\n> Hence I answered my question :\n>> How can I check how it computed these numbers in the first place ?\n\nThe option --break-rewrites controls rewrite detection.  Check out its\ndescription in the documentation of git diff to see how to use it.\n\n> But the two other questions remains :\n>> How comes git has two ways to count modified lines ?\n> i.e. What is (was) the purpose of this rewrite counting (when coded) ?\n\nRewrite detection is meant to improve the diff of a file whose content\nwas replaced with something very different.  Instead of lots of hunks\ncontaining lines that add and remove unrelated stuff, separated by empty\nlines etc. that the diff algorithm matches between the sides even though\nthey are also unrelated, a rewrite diff removes all the old lines en\nbloc and then adds all the new ones, which is easier to read in that\ncase.\n\n>> How can I make git output again the same numbers than just after commit ?\n\ngit show --stat --break-rewrites\n\nBut I have a question to the list as well: Why is break_opt (the\ndiff_options member for --break-rewrites) enabled for git commit by\ndefault?  I ask because the last commit that mentioned it, dc6b1d92ca\n(wt-status: use settings from git_diff_ui_config, 2018-05-04), claimed\nit would turn it off, if I read it correctly.\n\nRené\n"},{"id":"453043","messageId":"c35bd0aa-2e46-e710-2b39-89f18bad0097@web.de","threadId":"57573","inReplyTo":"xmqqh779u72a.fsf@gitster.g","subject":"Re: Git has two ways to count modified lines","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2022-04-04T21:08:26Z","receivedAt":"2022-04-04T21:23:11Z","isPatch":false,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Am 04.04.22 um 00:37 schrieb Junio C Hamano:\n> René Scharfe <l.s.r@web.de> writes:\n>\n>> Git stores the file contents before and after your change.  It doesn't\n>> store any diff, but calculates them as needed, e.g. for the commit\n>> confirmation message, or when you run git diff.  So in that sense there\n>> is no \"the diff\".  The difference between two stored states can be\n>> represented in many ways.\n>\n> That's the crucial point to answer this question.  Even without\n> break/rewrite transformation, depending on the choice of the diff\n> algorithm, the same change may be shown as different patch (with\n> different line count, obviously).\n>\n>> But I have a question to the list as well: Why is break_opt (the\n>> diff_options member for --break-rewrites) enabled for git commit by\n>> default?\n>\n> If it is, that is a bug, I would say.  Don't we initialize the\n> member to \"-1\" at around diff.c:4580 though?\n\nYes, but it's set to 0 in print_commit_summary() at sequencer.c:1330.\nThat line was introduced by 3eb2a15eb3 (builtin-commit: make summary\noutput consistent with status, 2007-12-16).\n\n--- >8 ----\nSubject: [PATCH] commit, sequencer: turn off break_opt for commit summary\n\ndc6b1d92ca (wt-status: use settings from git_diff_ui_config, 2018-05-04)\ndisabled diffopt.break_opt for diffstats shown by git status and in\ncommit templates.  For git status there isn't even a way to enable it.\nMake the commit summary (shown after the commit) consistent by disabling\nit there as well.\n\nReported-by: Laurent Lyaudet <laurent.lyaudet@gmail.com>\nSigned-off-by: René Scharfe <l.s.r@web.de>\n---\n sequencer.c               |  1 -\n t/t7524-commit-summary.sh | 31 +++++++++++++++++++++++++++++++\n 2 files changed, 31 insertions(+), 1 deletion(-)\n create mode 100755 t/t7524-commit-summary.sh\n\ndiff --git a/sequencer.c b/sequencer.c\nindex a1bb39383d..85a17d45bd 100644\n--- a/sequencer.c\n+++ b/sequencer.c\n@@ -1327,7 +1327,6 @@ void print_commit_summary(struct repository *r,\n \tget_commit_format(format.buf, &rev);\n \trev.always_show_header = 0;\n \trev.diffopt.detect_rename = DIFF_DETECT_RENAME;\n-\trev.diffopt.break_opt = 0;\n \tdiff_setup_done(&rev.diffopt);\n\n \trefs = get_main_ref_store(the_repository);\ndiff --git a/t/t7524-commit-summary.sh b/t/t7524-commit-summary.sh\nnew file mode 100755\nindex 0000000000..47b2f1dc22\n--- /dev/null\n+++ b/t/t7524-commit-summary.sh\n@@ -0,0 +1,31 @@\n+#!/bin/sh\n+\n+test_description='git commit summary'\n+. ./test-lib.sh\n+\n+test_expect_success 'setup' '\n+\ttest_seq 101 200 >file &&\n+\tgit add file &&\n+\tgit commit -m initial &&\n+\tgit tag initial\n+'\n+\n+test_expect_success 'commit summary ignores rewrites' '\n+\tgit reset --hard initial &&\n+\ttest_seq 200 300 >file &&\n+\n+\tgit diff --stat >diffstat &&\n+\tgit diff --stat --break-rewrites >diffstatrewrite &&\n+\n+\t# make sure this scenario is a detectable rewrite\n+\t! test_cmp_bin diffstat diffstatrewrite &&\n+\n+\tgit add file &&\n+\tgit commit -m second >actual &&\n+\n+\tgrep \"1 file\" <actual >actual.total &&\n+\tgrep \"1 file\" <diffstat >diffstat.total &&\n+\ttest_cmp diffstat.total actual.total\n+'\n+\n+test_done\n--\n2.35.1\n\n"},{"id":"453077","messageId":"220405.865ynomgkg.gmgdl@evledraar.gmail.com","threadId":"57573","inReplyTo":"c35bd0aa-2e46-e710-2b39-89f18bad0097@web.de","subject":"Re: Git has two ways to count modified lines","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-04-05T01:58:13Z","receivedAt":"2022-04-05T02:54:05Z","isPatch":false,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"\nOn Mon, Apr 04 2022, René Scharfe wrote:\n\n> diff --git a/sequencer.c b/sequencer.c\n> index a1bb39383d..85a17d45bd 100644\n> --- a/sequencer.c\n> +++ b/sequencer.c\n> @@ -1327,7 +1327,6 @@ void print_commit_summary(struct repository *r,\n>  \tget_commit_format(format.buf, &rev);\n>  \trev.always_show_header = 0;\n>  \trev.diffopt.detect_rename = DIFF_DETECT_RENAME;\n> -\trev.diffopt.break_opt = 0;\n>  \tdiff_setup_done(&rev.diffopt);\n>\n>  \trefs = get_main_ref_store(the_repository);\n> diff --git a/t/t7524-commit-summary.sh b/t/t7524-commit-summary.sh\n> new file mode 100755\n> index 0000000000..47b2f1dc22\n> --- /dev/null\n> +++ b/t/t7524-commit-summary.sh\n> @@ -0,0 +1,31 @@\n> +#!/bin/sh\n> +\n> +test_description='git commit summary'\n> +. ./test-lib.sh\n> +\n> +test_expect_success 'setup' '\n> +\ttest_seq 101 200 >file &&\n> +\tgit add file &&\n> +\tgit commit -m initial &&\n> +\tgit tag initial\n> +'\n> +\n> +test_expect_success 'commit summary ignores rewrites' '\n> +\tgit reset --hard initial &&\n\nA leftover debugging aid? You can also use test_commit earlier:\n\t\n\tdiff --git a/t/t7524-commit-summary.sh b/t/t7524-commit-summary.sh\n\tindex 47b2f1dc22a..60027e86ccd 100755\n\t--- a/t/t7524-commit-summary.sh\n\t+++ b/t/t7524-commit-summary.sh\n\t@@ -4,14 +4,10 @@ test_description='git commit summary'\n\t . ./test-lib.sh\n\t \n\t test_expect_success 'setup' '\n\t-\ttest_seq 101 200 >file &&\n\t-\tgit add file &&\n\t-\tgit commit -m initial &&\n\t-\tgit tag initial\n\t+\ttest_commit initial file \"$(test_seq 101 200)\"\n\t '\n\t \n\t test_expect_success 'commit summary ignores rewrites' '\n\t-\tgit reset --hard initial &&\n\t \ttest_seq 200 300 >file &&\n\t \n\t \tgit diff --stat >diffstat &&\n\n\n> +\ttest_seq 200 300 >file &&\n> +\n> +\tgit diff --stat >diffstat &&\n> +\tgit diff --stat --break-rewrites >diffstatrewrite &&\n> +\n> +\t# make sure this scenario is a detectable rewrite\n> +\t! test_cmp_bin diffstat diffstatrewrite &&\n\nIs this really binary? I removed the ! and tried test_cmp, and it's just\na diffstat.\n\nElsewhere in the test suite we test_cmp this output, would be\nclearer/easier to read to do the same here if possible.\n\n> +\n> +\tgit add file &&\n> +\tgit commit -m second >actual &&\n> +\n> +\tgrep \"1 file\" <actual >actual.total &&\n> +\tgrep \"1 file\" <diffstat >diffstat.total &&\n> +\ttest_cmp diffstat.total actual.total\n> +'\n> +\n> +test_done\n\n"},{"id":"453126","messageId":"3dbc5e5c-19dd-eef0-7ce9-e5b639cfb133@web.de","threadId":"57573","inReplyTo":"220405.865ynomgkg.gmgdl@evledraar.gmail.com","subject":"Re: Git has two ways to count modified lines","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2022-04-05T15:57:51Z","receivedAt":"2022-04-05T21:41:32Z","isPatch":false,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Am 05.04.22 um 03:58 schrieb Ævar Arnfjörð Bjarmason:\n>\n> On Mon, Apr 04 2022, René Scharfe wrote:\n>\n>> diff --git a/sequencer.c b/sequencer.c\n>> index a1bb39383d..85a17d45bd 100644\n>> --- a/sequencer.c\n>> +++ b/sequencer.c\n>> @@ -1327,7 +1327,6 @@ void print_commit_summary(struct repository *r,\n>>  \tget_commit_format(format.buf, &rev);\n>>  \trev.always_show_header = 0;\n>>  \trev.diffopt.detect_rename = DIFF_DETECT_RENAME;\n>> -\trev.diffopt.break_opt = 0;\n>>  \tdiff_setup_done(&rev.diffopt);\n>>\n>>  \trefs = get_main_ref_store(the_repository);\n>> diff --git a/t/t7524-commit-summary.sh b/t/t7524-commit-summary.sh\n>> new file mode 100755\n>> index 0000000000..47b2f1dc22\n>> --- /dev/null\n>> +++ b/t/t7524-commit-summary.sh\n>> @@ -0,0 +1,31 @@\n>> +#!/bin/sh\n>> +\n>> +test_description='git commit summary'\n>> +. ./test-lib.sh\n>> +\n>> +test_expect_success 'setup' '\n>> +\ttest_seq 101 200 >file &&\n>> +\tgit add file &&\n>> +\tgit commit -m initial &&\n>> +\tgit tag initial\n>> +'\n>> +\n>> +test_expect_success 'commit summary ignores rewrites' '\n>> +\tgit reset --hard initial &&\n>\n> A leftover debugging aid?\n\nNo, I expect all tests in that file will need to reset the state and\ndidn't want to make an exception just for the first one.  It might be a\ncase of YAGNI, but I put the reset in intentionally.\n\n> You can also use test_commit earlier:\n>\n> \tdiff --git a/t/t7524-commit-summary.sh b/t/t7524-commit-summary.sh\n> \tindex 47b2f1dc22a..60027e86ccd 100755\n> \t--- a/t/t7524-commit-summary.sh\n> \t+++ b/t/t7524-commit-summary.sh\n> \t@@ -4,14 +4,10 @@ test_description='git commit summary'\n> \t . ./test-lib.sh\n>\n> \t test_expect_success 'setup' '\n> \t-\ttest_seq 101 200 >file &&\n> \t-\tgit add file &&\n> \t-\tgit commit -m initial &&\n> \t-\tgit tag initial\n> \t+\ttest_commit initial file \"$(test_seq 101 200)\"\n\nNice.  Would ignore test_seq errors, though.  Probably not worth\nworrying too much about.\n\n> \t '\n>\n> \t test_expect_success 'commit summary ignores rewrites' '\n> \t-\tgit reset --hard initial &&\n> \t \ttest_seq 200 300 >file &&\n>\n> \t \tgit diff --stat >diffstat &&\n>\n>\n>> +\ttest_seq 200 300 >file &&\n>> +\n>> +\tgit diff --stat >diffstat &&\n>> +\tgit diff --stat --break-rewrites >diffstatrewrite &&\n>> +\n>> +\t# make sure this scenario is a detectable rewrite\n>> +\t! test_cmp_bin diffstat diffstatrewrite &&\n>\n> Is this really binary? I removed the ! and tried test_cmp, and it's just\n> a diffstat.\n>\n> Elsewhere in the test suite we test_cmp this output, would be\n> clearer/easier to read to do the same here if possible.\n\nThe required result is one bit (same content or not?).  That sanity\ncheck should not waste cycles calculating and printing a diff of the\ndiffstats.  I only want to make sure they are different.\n\n>\n>> +\n>> +\tgit add file &&\n>> +\tgit commit -m second >actual &&\n>> +\n>> +\tgrep \"1 file\" <actual >actual.total &&\n>> +\tgrep \"1 file\" <diffstat >diffstat.total &&\n>> +\ttest_cmp diffstat.total actual.total\n>> +'\n>> +\n>> +test_done\n>\n"},{"id":"453135","messageId":"CAB1LBms-Urzbx=Q=9Ydvsrgx=6si+FwZa09MEz9zCHRser8iuw@mail.gmail.com","threadId":"57573","inReplyTo":"d650bb90-df94-eeab-0684-ee447e080ad6@web.de","subject":"Re: Git has two ways to count modified lines","fromName":"Laurent Lyaudet","fromEmail":"laurent.lyaudet@gmail.com","sentAt":"2022-04-05T15:57:48Z","receivedAt":"2022-04-05T21:50:09Z","isPatch":false,"sender":{"key":"laurent.lyaudet@gmail.com","avatar":null},"body":"Le sam. 2 avr. 2022 à 23:55, René Scharfe <l.s.r@web.de> a écrit :\n>\n> Am 02.04.22 um 18:49 schrieb Laurent Lyaudet:\n> > Le mer. 16 mars 2022 à 19:08, Laurent Lyaudet\n> The option --break-rewrites controls rewrite detection.  Check out its\n> description in the documentation of git diff to see how to use it.\nHello everyone,\nThanks René, I checked and now I understand how it works :)\n> > But the two other questions remains :\n> >> How comes git has two ways to count modified lines ?\n> > i.e. What is (was) the purpose of this rewrite counting (when coded) ?\n>\n> Rewrite detection is meant to improve the diff of a file whose content\n> was replaced with something very different.  Instead of lots of hunks\n> containing lines that add and remove unrelated stuff, separated by empty\n> lines etc. that the diff algorithm matches between the sides even though\n> they are also unrelated, a rewrite diff removes all the old lines en\n> bloc and then adds all the new ones, which is easier to read in that\n> case.\nIt makes sense to produce diffs simpler to understand.\nFrom my experience, humans are better than computers at knowing when\nto \"break-rewrites\" (or see that a line was moved, etc.) .\nI have dreamed about hinting the diff tools for many years,\nbut I'm more used to simply accept what the computer produces as its\ndiff(s) and have my own analysis that does not match.\nMaybe for git 10.0, someone will add metadata in commits for human\noptimized diffs :)\nFor applying patches, it is useless but for understanding code change, it helps.\nAt least, it is a good mental exercise.\nJust in case, if someone cares, in my notebook I note the following counts :\n- non empty and not space only created lines\n- empty or space only created lines\n- modified lines (non space created or deleted character)\n- space modified lines (but I should split this category between space\npresentation, and space bug related (Yes you can correct bug by\nchanging only spaces, most of the time in strings)\n- moved lines :\n   - as is\n   - with space modification\n   - with non-space modification\n- non empty and not space only deleted lines\n- empty or space only deleted lines\n\n> >> How can I make git output again the same numbers than just after commit ?\n>\n> git show --stat --break-rewrites\nThanks :)\n\nBest regards,\n    Laurent Lyaudet\n"}]}