{"thread":{"id":"51620","subject":"Incorrect behavior from git checkout --patch","startedAt":"2019-08-10T20:12:39Z","lastAt":"2019-08-11T13:47:52Z","messageCount":3,"participants":["Dave Kaminski","Phillip Wood"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"380268","messageId":"CA+zjYZsojm0QgHBC3GFb2NeZR1aK3Uh7vO4ojBzsMKVvP6X+Tg@mail.gmail.com","threadId":"51620","inReplyTo":null,"subject":"Incorrect behavior from git checkout --patch","fromName":"Dave Kaminski","fromEmail":"davekaminski@gmail.com","sentAt":"2019-08-10T20:12:13Z","receivedAt":"2019-08-10T20:12:39Z","isPatch":false,"sender":{"key":"davekaminski@gmail.com","avatar":null},"body":"I am observing git checkout --patch making changes to the wrong lines of a file.\n\nThis is with a clean install of git version 2.20.1 on a debian docker\ncontainer (image tag 10.0 which is also \"latest\" as of this writing).\n\nWith a diff that looks like the following:\n\ndiff --git a/file.txt b/file.txt\nindex 868aa22..ea4d786 100644\n--- a/file.txt\n+++ b/file.txt\n@@ -1,35 +1,51 @@\n block_one {\n line 1\n+line 1.5\n line 2\n+line 2.5\n line 3\n 2 4 6 8\n line 4\n+line 4.5\n line 5\n+line 5.5\n line 6\n 2 4 6 8\n line 7\n+line 7.5\n line 8\n+line 8.5\n line 9\n 2 4 6 8\n line 10\n+line 10.5\n line 11\n+line 11.5\n line 12\n }\n\n block_two {\n line 1\n+line 1.5\n line 2\n+line 2.5\n line 3\n-2 5 6 9\n+2 4 6 8\n line 4\n+line 4.5\n line 5\n+line 5.5\n line 6\n-2 5 6 9\n+2 4 6 8\n line 7\n+line 7.5\n line 8\n+line 8.5\n line 9\n-2 5 6 9\n+2 4 6 8\n line 10\n+line 10.5\n line 11\n+line 11.5\n line 12\n }\n\ndoing a `git checkout --patch -- ./file.txt`, splitting the diff into\nhunks, and discarding all of the hunks that begin with numbers, e.g.\n\n@@ -22,3 +32,3 @@\n line 3\n-2 5 6 9\n+2 4 6 8\n line 4\n\nthe expected state of the file in the working directory is this:\n\ndiff --git a/file.txt b/file.txt\nindex 868aa22..9ab67a1 100644\n--- a/file.txt\n+++ b/file.txt\n@@ -1,35 +1,51 @@\n block_one {\n line 1\n+line 1.5\n line 2\n+line 2.5\n line 3\n 2 4 6 8\n line 4\n+line 4.5\n line 5\n+line 5.5\n line 6\n 2 4 6 8\n line 7\n+line 7.5\n line 8\n+line 8.5\n line 9\n 2 4 6 8\n line 10\n+line 10.5\n line 11\n+line 11.5\n line 12\n }\n\n block_two {\n line 1\n+line 1.5\n line 2\n+line 2.5\n line 3\n 2 5 6 9\n line 4\n+line 4.5\n line 5\n+line 5.5\n line 6\n 2 5 6 9\n line 7\n+line 7.5\n line 8\n+line 8.5\n line 9\n 2 5 6 9\n line 10\n+line 10.5\n line 11\n+line 11.5\n line 12\n }\n\nbut instead the actual state of the file is this:\n\ndiff --git a/file.txt b/file.txt\nindex 868aa22..76fe65d 100644\n--- a/file.txt\n+++ b/file.txt\n@@ -1,35 +1,51 @@\n block_one {\n line 1\n+line 1.5\n line 2\n+line 2.5\n line 3\n 2 4 6 8\n line 4\n+line 4.5\n line 5\n+line 5.5\n line 6\n 2 4 6 8\n line 7\n+line 7.5\n line 8\n+line 8.5\n line 9\n-2 4 6 8\n+2 5 6 9\n line 10\n+line 10.5\n line 11\n+line 11.5\n line 12\n }\n\n block_two {\n line 1\n+line 1.5\n line 2\n+line 2.5\n line 3\n 2 5 6 9\n line 4\n+line 4.5\n line 5\n+line 5.5\n line 6\n 2 5 6 9\n line 7\n+line 7.5\n line 8\n+line 8.5\n line 9\n-2 5 6 9\n+2 4 6 8\n line 10\n+line 10.5\n line 11\n+line 11.5\n line 12\n }\n\nSee the changes between \"line 9\" and \"line 10\" in both blocks that are\nnot correct.\n"},{"id":"380279","messageId":"a243aa2f-b237-db8e-0cac-cb3f776fdbd2@gmail.com","threadId":"51620","inReplyTo":"CA+zjYZsojm0QgHBC3GFb2NeZR1aK3Uh7vO4ojBzsMKVvP6X+Tg@mail.gmail.com","subject":"Re: Incorrect behavior from git checkout --patch","fromName":"Phillip Wood","fromEmail":"phillip.wood123@gmail.com","sentAt":"2019-08-11T09:54:31Z","receivedAt":"2019-08-11T09:54:42Z","isPatch":false,"sender":{"key":"phillip.wood@dunelm.org.uk","avatar":null},"body":"Hi Dave\n\nThanks for the bug report. I've tried to reproduce it on the latest \nmaster, version 2.22.0 and 2.20.1 and am unable to do so. I thought it \nmight be related to a bug I recently fixed[1] but it does not appear to \nbe. I've appended the files I used below just in case I made a mistake \ntranslating your patches to files that can be used with git checkout.\n\nBest Wishes\n\nPhillip\n\n[1] \nhttps://github.com/git/git/commit/1b074e15d0f976be2bc14f9528874a841c055213#diff-588be9a03d1f7e33db12f186aad5fde9\n\npre-image\n\nblock_one {\nline 1\nline 2\nline 3\n2 4 6 8\nline 4\nline 5\nline 6\n2 4 6 8\nline 7\nline 8\nline 9\n2 4 6 8\nline 10\nline 11\nline 12\n}\n\nblock_two {\nline 1\nline 2\nline 3\n2 5 6 9\nline 4\nline 5\nline 6\n2 5 6 9\nline 7\nline 8\nline 9\n2 5 6 9\nline 10\nline 11\nline 12\n}\n\npost-image\n\nblock_one {\nline 1\nline 1.5\nline 2\nline 2.5\nline 3\n2 4 6 8\nline 4\nline 4.5\nline 5\nline 5.5\nline 6\n2 4 6 8\nline 7\nline 7.5\nline 8\nline 8.5\nline 9\n2 4 6 8\nline 10\nline 10.5\nline 11\nline 11.5\nline 12\n}\n\nblock_two {\nline 1\nline 1.5\nline 2\nline 2.5\nline 3\n2 5 6 9\nline 4\nline 4.5\nline 5\nline 5.5\nline 6\n2 5 6 9\nline 7\nline 7.5\nline 8\nline 8.5\nline 9\n2 5 6 9\nline 10\nline 10.5\nline 11\nline 11.5\nline 12\n}\n\n\n\nOn 10/08/2019 21:12, Dave Kaminski wrote:\n> I am observing git checkout --patch making changes to the wrong lines of a file.\n> \n> This is with a clean install of git version 2.20.1 on a debian docker\n> container (image tag 10.0 which is also \"latest\" as of this writing).\n> \n> With a diff that looks like the following:\n> \n> diff --git a/file.txt b/file.txt\n> index 868aa22..ea4d786 100644\n> --- a/file.txt\n> +++ b/file.txt\n> @@ -1,35 +1,51 @@\n>   block_one {\n>   line 1\n> +line 1.5\n>   line 2\n> +line 2.5\n>   line 3\n>   2 4 6 8\n>   line 4\n> +line 4.5\n>   line 5\n> +line 5.5\n>   line 6\n>   2 4 6 8\n>   line 7\n> +line 7.5\n>   line 8\n> +line 8.5\n>   line 9\n>   2 4 6 8\n>   line 10\n> +line 10.5\n>   line 11\n> +line 11.5\n>   line 12\n>   }\n> \n>   block_two {\n>   line 1\n> +line 1.5\n>   line 2\n> +line 2.5\n>   line 3\n> -2 5 6 9\n> +2 4 6 8\n>   line 4\n> +line 4.5\n>   line 5\n> +line 5.5\n>   line 6\n> -2 5 6 9\n> +2 4 6 8\n>   line 7\n> +line 7.5\n>   line 8\n> +line 8.5\n>   line 9\n> -2 5 6 9\n> +2 4 6 8\n>   line 10\n> +line 10.5\n>   line 11\n> +line 11.5\n>   line 12\n>   }\n> \n> doing a `git checkout --patch -- ./file.txt`, splitting the diff into\n> hunks, and discarding all of the hunks that begin with numbers, e.g.\n> \n> @@ -22,3 +32,3 @@\n>   line 3\n> -2 5 6 9\n> +2 4 6 8\n>   line 4\n> \n> the expected state of the file in the working directory is this:\n> \n> diff --git a/file.txt b/file.txt\n> index 868aa22..9ab67a1 100644\n> --- a/file.txt\n> +++ b/file.txt\n> @@ -1,35 +1,51 @@\n>   block_one {\n>   line 1\n> +line 1.5\n>   line 2\n> +line 2.5\n>   line 3\n>   2 4 6 8\n>   line 4\n> +line 4.5\n>   line 5\n> +line 5.5\n>   line 6\n>   2 4 6 8\n>   line 7\n> +line 7.5\n>   line 8\n> +line 8.5\n>   line 9\n>   2 4 6 8\n>   line 10\n> +line 10.5\n>   line 11\n> +line 11.5\n>   line 12\n>   }\n> \n>   block_two {\n>   line 1\n> +line 1.5\n>   line 2\n> +line 2.5\n>   line 3\n>   2 5 6 9\n>   line 4\n> +line 4.5\n>   line 5\n> +line 5.5\n>   line 6\n>   2 5 6 9\n>   line 7\n> +line 7.5\n>   line 8\n> +line 8.5\n>   line 9\n>   2 5 6 9\n>   line 10\n> +line 10.5\n>   line 11\n> +line 11.5\n>   line 12\n>   }\n> \n> but instead the actual state of the file is this:\n> \n> diff --git a/file.txt b/file.txt\n> index 868aa22..76fe65d 100644\n> --- a/file.txt\n> +++ b/file.txt\n> @@ -1,35 +1,51 @@\n>   block_one {\n>   line 1\n> +line 1.5\n>   line 2\n> +line 2.5\n>   line 3\n>   2 4 6 8\n>   line 4\n> +line 4.5\n>   line 5\n> +line 5.5\n>   line 6\n>   2 4 6 8\n>   line 7\n> +line 7.5\n>   line 8\n> +line 8.5\n>   line 9\n> -2 4 6 8\n> +2 5 6 9\n>   line 10\n> +line 10.5\n>   line 11\n> +line 11.5\n>   line 12\n>   }\n> \n>   block_two {\n>   line 1\n> +line 1.5\n>   line 2\n> +line 2.5\n>   line 3\n>   2 5 6 9\n>   line 4\n> +line 4.5\n>   line 5\n> +line 5.5\n>   line 6\n>   2 5 6 9\n>   line 7\n> +line 7.5\n>   line 8\n> +line 8.5\n>   line 9\n> -2 5 6 9\n> +2 4 6 8\n>   line 10\n> +line 10.5\n>   line 11\n> +line 11.5\n>   line 12\n>   }\n> \n> See the changes between \"line 9\" and \"line 10\" in both blocks that are\n> not correct.\n> \n"},{"id":"380283","messageId":"caebef3e-b8ef-176d-ae70-ae3d5864f32c@gmail.com","threadId":"51620","inReplyTo":"a243aa2f-b237-db8e-0cac-cb3f776fdbd2@gmail.com","subject":"Re: Incorrect behavior from git checkout --patch","fromName":"Phillip Wood","fromEmail":"phillip.wood123@gmail.com","sentAt":"2019-08-11T13:47:45Z","receivedAt":"2019-08-11T13:47:52Z","isPatch":false,"sender":{"key":"phillip.wood@dunelm.org.uk","avatar":null},"body":"Hi Dave\n\nOn 11/08/2019 10:54, Phillip Wood wrote:\n> Hi Dave\n> \n> Thanks for the bug report. I've tried to reproduce it on the latest \n> master, version 2.22.0 and 2.20.1 and am unable to do so.\n\nDoh, I was doing 'git checkout -p HEAD', when I checkout from the index \nI can reproduce the bug and it is fixed by the patch I linked to earlier \nwhich will be in git 2.23.0. That will be released soon (we're at \n2.23.0.rc2 at the moment)\n\nThanks again for taking the time to report the bug\n\nBest Wishes\n\nPhillip\n\n\n> I thought it \n> might be related to a bug I recently fixed[1] but it does not appear to \n> be. I've appended the files I used below just in case I made a mistake \n> translating your patches to files that can be used with git checkout.\n> \n> Best Wishes\n> \n> Phillip\n> \n> [1] \n> https://github.com/git/git/commit/1b074e15d0f976be2bc14f9528874a841c055213#diff-588be9a03d1f7e33db12f186aad5fde9 \n> \n> \n> pre-image\n> \n> block_one {\n> line 1\n> line 2\n> line 3\n> 2 4 6 8\n> line 4\n> line 5\n> line 6\n> 2 4 6 8\n> line 7\n> line 8\n> line 9\n> 2 4 6 8\n> line 10\n> line 11\n> line 12\n> }\n> \n> block_two {\n> line 1\n> line 2\n> line 3\n> 2 5 6 9\n> line 4\n> line 5\n> line 6\n> 2 5 6 9\n> line 7\n> line 8\n> line 9\n> 2 5 6 9\n> line 10\n> line 11\n> line 12\n> }\n> \n> post-image\n> \n> block_one {\n> line 1\n> line 1.5\n> line 2\n> line 2.5\n> line 3\n> 2 4 6 8\n> line 4\n> line 4.5\n> line 5\n> line 5.5\n> line 6\n> 2 4 6 8\n> line 7\n> line 7.5\n> line 8\n> line 8.5\n> line 9\n> 2 4 6 8\n> line 10\n> line 10.5\n> line 11\n> line 11.5\n> line 12\n> }\n> \n> block_two {\n> line 1\n> line 1.5\n> line 2\n> line 2.5\n> line 3\n> 2 5 6 9\n> line 4\n> line 4.5\n> line 5\n> line 5.5\n> line 6\n> 2 5 6 9\n> line 7\n> line 7.5\n> line 8\n> line 8.5\n> line 9\n> 2 5 6 9\n> line 10\n> line 10.5\n> line 11\n> line 11.5\n> line 12\n> }\n> \n> \n> \n> On 10/08/2019 21:12, Dave Kaminski wrote:\n>> I am observing git checkout --patch making changes to the wrong lines \n>> of a file.\n>>\n>> This is with a clean install of git version 2.20.1 on a debian docker\n>> container (image tag 10.0 which is also \"latest\" as of this writing).\n>>\n>> With a diff that looks like the following:\n>>\n>> diff --git a/file.txt b/file.txt\n>> index 868aa22..ea4d786 100644\n>> --- a/file.txt\n>> +++ b/file.txt\n>> @@ -1,35 +1,51 @@\n>>   block_one {\n>>   line 1\n>> +line 1.5\n>>   line 2\n>> +line 2.5\n>>   line 3\n>>   2 4 6 8\n>>   line 4\n>> +line 4.5\n>>   line 5\n>> +line 5.5\n>>   line 6\n>>   2 4 6 8\n>>   line 7\n>> +line 7.5\n>>   line 8\n>> +line 8.5\n>>   line 9\n>>   2 4 6 8\n>>   line 10\n>> +line 10.5\n>>   line 11\n>> +line 11.5\n>>   line 12\n>>   }\n>>\n>>   block_two {\n>>   line 1\n>> +line 1.5\n>>   line 2\n>> +line 2.5\n>>   line 3\n>> -2 5 6 9\n>> +2 4 6 8\n>>   line 4\n>> +line 4.5\n>>   line 5\n>> +line 5.5\n>>   line 6\n>> -2 5 6 9\n>> +2 4 6 8\n>>   line 7\n>> +line 7.5\n>>   line 8\n>> +line 8.5\n>>   line 9\n>> -2 5 6 9\n>> +2 4 6 8\n>>   line 10\n>> +line 10.5\n>>   line 11\n>> +line 11.5\n>>   line 12\n>>   }\n>>\n>> doing a `git checkout --patch -- ./file.txt`, splitting the diff into\n>> hunks, and discarding all of the hunks that begin with numbers, e.g.\n>>\n>> @@ -22,3 +32,3 @@\n>>   line 3\n>> -2 5 6 9\n>> +2 4 6 8\n>>   line 4\n>>\n>> the expected state of the file in the working directory is this:\n>>\n>> diff --git a/file.txt b/file.txt\n>> index 868aa22..9ab67a1 100644\n>> --- a/file.txt\n>> +++ b/file.txt\n>> @@ -1,35 +1,51 @@\n>>   block_one {\n>>   line 1\n>> +line 1.5\n>>   line 2\n>> +line 2.5\n>>   line 3\n>>   2 4 6 8\n>>   line 4\n>> +line 4.5\n>>   line 5\n>> +line 5.5\n>>   line 6\n>>   2 4 6 8\n>>   line 7\n>> +line 7.5\n>>   line 8\n>> +line 8.5\n>>   line 9\n>>   2 4 6 8\n>>   line 10\n>> +line 10.5\n>>   line 11\n>> +line 11.5\n>>   line 12\n>>   }\n>>\n>>   block_two {\n>>   line 1\n>> +line 1.5\n>>   line 2\n>> +line 2.5\n>>   line 3\n>>   2 5 6 9\n>>   line 4\n>> +line 4.5\n>>   line 5\n>> +line 5.5\n>>   line 6\n>>   2 5 6 9\n>>   line 7\n>> +line 7.5\n>>   line 8\n>> +line 8.5\n>>   line 9\n>>   2 5 6 9\n>>   line 10\n>> +line 10.5\n>>   line 11\n>> +line 11.5\n>>   line 12\n>>   }\n>>\n>> but instead the actual state of the file is this:\n>>\n>> diff --git a/file.txt b/file.txt\n>> index 868aa22..76fe65d 100644\n>> --- a/file.txt\n>> +++ b/file.txt\n>> @@ -1,35 +1,51 @@\n>>   block_one {\n>>   line 1\n>> +line 1.5\n>>   line 2\n>> +line 2.5\n>>   line 3\n>>   2 4 6 8\n>>   line 4\n>> +line 4.5\n>>   line 5\n>> +line 5.5\n>>   line 6\n>>   2 4 6 8\n>>   line 7\n>> +line 7.5\n>>   line 8\n>> +line 8.5\n>>   line 9\n>> -2 4 6 8\n>> +2 5 6 9\n>>   line 10\n>> +line 10.5\n>>   line 11\n>> +line 11.5\n>>   line 12\n>>   }\n>>\n>>   block_two {\n>>   line 1\n>> +line 1.5\n>>   line 2\n>> +line 2.5\n>>   line 3\n>>   2 5 6 9\n>>   line 4\n>> +line 4.5\n>>   line 5\n>> +line 5.5\n>>   line 6\n>>   2 5 6 9\n>>   line 7\n>> +line 7.5\n>>   line 8\n>> +line 8.5\n>>   line 9\n>> -2 5 6 9\n>> +2 4 6 8\n>>   line 10\n>> +line 10.5\n>>   line 11\n>> +line 11.5\n>>   line 12\n>>   }\n>>\n>> See the changes between \"line 9\" and \"line 10\" in both blocks that are\n>> not correct.\n>>\n"}]}