threads / discuss / 51620

Incorrect behavior from git checkout --patch

Subject: Incorrect behavior from git checkout --patch

## tl;dr

3 messages between Aug 10, 2019 and Aug 11, 2019.

replies: 2people: 2as markdown or json

Dave Kaminski· Aug 10, 2019, 20:12 UTC · lore
I am observing git checkout --patch making changes to the wrong lines of a file.

This is with a clean install of git version 2.20.1 on a debian docker container (image tag 10.0 which is also "latest" as of this writing).

With a diff that looks like the following:
diff --git a/file.txt b/file.txt
index 868aa22..ea4d786 100644
--- a/file.txt
+++ b/file.txt
@@ -1,35 +1,51 @@
 block_one {
 line 1
+line 1.5
 line 2
+line 2.5
 line 3
 2 4 6 8
 line 4
+line 4.5
 line 5
+line 5.5
 line 6
 2 4 6 8
 line 7
+line 7.5
 line 8
+line 8.5
 line 9
 2 4 6 8
 line 10
+line 10.5
 line 11
+line 11.5
 line 12
 }

 block_two {
 line 1
+line 1.5
 line 2
+line 2.5
 line 3
-2 5 6 9
+2 4 6 8
 line 4
+line 4.5
 line 5
+line 5.5
 line 6
-2 5 6 9
+2 4 6 8
 line 7
+line 7.5
 line 8
+line 8.5
 line 9
-2 5 6 9
+2 4 6 8
 line 10
+line 10.5
 line 11
+line 11.5
 line 12
 }

doing a `git checkout --patch -- ./file.txt`, splitting the diff into
hunks, and discarding all of the hunks that begin with numbers, e.g.

@@ -22,3 +32,3 @@
 line 3
-2 5 6 9
+2 4 6 8
 line 4

the expected state of the file in the working directory is this:

diff --git a/file.txt b/file.txt
index 868aa22..9ab67a1 100644
--- a/file.txt
+++ b/file.txt
@@ -1,35 +1,51 @@
 block_one {
 line 1
+line 1.5
 line 2
+line 2.5
 line 3
 2 4 6 8
 line 4
+line 4.5
 line 5
+line 5.5
 line 6
 2 4 6 8
 line 7
+line 7.5
 line 8
+line 8.5
 line 9
 2 4 6 8
 line 10
+line 10.5
 line 11
+line 11.5
 line 12
 }

 block_two {
 line 1
+line 1.5
 line 2
+line 2.5
 line 3
 2 5 6 9
 line 4
+line 4.5
 line 5
+line 5.5
 line 6
 2 5 6 9
 line 7
+line 7.5
 line 8
+line 8.5
 line 9
 2 5 6 9
 line 10
+line 10.5
 line 11
+line 11.5
 line 12
 }

but instead the actual state of the file is this:

diff --git a/file.txt b/file.txt
index 868aa22..76fe65d 100644
--- a/file.txt
+++ b/file.txt
@@ -1,35 +1,51 @@
 block_one {
 line 1
+line 1.5
 line 2
+line 2.5
 line 3
 2 4 6 8
 line 4
+line 4.5
 line 5
+line 5.5
 line 6
 2 4 6 8
 line 7
+line 7.5
 line 8
+line 8.5
 line 9
-2 4 6 8
+2 5 6 9
 line 10
+line 10.5
 line 11
+line 11.5
 line 12
 }

 block_two {
 line 1
+line 1.5
 line 2
+line 2.5
 line 3
 2 5 6 9
 line 4
+line 4.5
 line 5
+line 5.5
 line 6
 2 5 6 9
 line 7
+line 7.5
 line 8
+line 8.5
 line 9
-2 5 6 9
+2 4 6 8
 line 10
+line 10.5
 line 11
+line 11.5
 line 12
 }

See the changes between "line 9" and "line 10" in both blocks that are
not correct.
Phillip Wood· Aug 11, 2019, 09:54 UTC · re: Dave Kaminski · lore

Re: Incorrect behavior from git checkout --patch

Hi Dave

Thanks for the bug report. I've tried to reproduce it on the latest master, version 2.22.0 and 2.20.1 and am unable to do so. I thought it might be related to a bug I recently fixed[1] but it does not appear to be. I've appended the files I used below just in case I made a mistake translating your patches to files that can be used with git checkout.

Best Wishes
Phillip

[1] https://github.com/git/git/commit/1b074e15d0f976be2bc14f9528874a841c055213#diff-588be9a03d1f7e33db12f186aad5fde9

pre-image

block_one { line 1 line 2 line 3 2 4 6 8 line 4 line 5 line 6 2 4 6 8 line 7 line 8 line 9 2 4 6 8 line 10 line 11 line 12 }

block_two { line 1 line 2 line 3 2 5 6 9 line 4 line 5 line 6 2 5 6 9 line 7 line 8 line 9 2 5 6 9 line 10 line 11 line 12 }

post-image

block_one { line 1 line 1.5 line 2 line 2.5 line 3 2 4 6 8 line 4 line 4.5 line 5 line 5.5 line 6 2 4 6 8 line 7 line 7.5 line 8 line 8.5 line 9 2 4 6 8 line 10 line 10.5 line 11 line 11.5 line 12 }

block_two { line 1 line 1.5 line 2 line 2.5 line 3 2 5 6 9 line 4 line 4.5 line 5 line 5.5 line 6 2 5 6 9 line 7 line 7.5 line 8 line 8.5 line 9 2 5 6 9 line 10 line 10.5 line 11 line 11.5 line 12 }

On 10/08/2019 21:12, Dave Kaminski wrote:
Show 199 quoted lines
> I am observing git checkout --patch making changes to the wrong lines of a file.
> 
> This is with a clean install of git version 2.20.1 on a debian docker
> container (image tag 10.0 which is also "latest" as of this writing).
> 
> With a diff that looks like the following:
> 
> diff --git a/file.txt b/file.txt
> index 868aa22..ea4d786 100644
> --- a/file.txt
> +++ b/file.txt
> @@ -1,35 +1,51 @@
>   block_one {
>   line 1
> +line 1.5
>   line 2
> +line 2.5
>   line 3
>   2 4 6 8
>   line 4
> +line 4.5
>   line 5
> +line 5.5
>   line 6
>   2 4 6 8
>   line 7
> +line 7.5
>   line 8
> +line 8.5
>   line 9
>   2 4 6 8
>   line 10
> +line 10.5
>   line 11
> +line 11.5
>   line 12
>   }
> 
>   block_two {
>   line 1
> +line 1.5
>   line 2
> +line 2.5
>   line 3
> -2 5 6 9
> +2 4 6 8
>   line 4
> +line 4.5
>   line 5
> +line 5.5
>   line 6
> -2 5 6 9
> +2 4 6 8
>   line 7
> +line 7.5
>   line 8
> +line 8.5
>   line 9
> -2 5 6 9
> +2 4 6 8
>   line 10
> +line 10.5
>   line 11
> +line 11.5
>   line 12
>   }
> 
> doing a `git checkout --patch -- ./file.txt`, splitting the diff into
> hunks, and discarding all of the hunks that begin with numbers, e.g.
> 
> @@ -22,3 +32,3 @@
>   line 3
> -2 5 6 9
> +2 4 6 8
>   line 4
> 
> the expected state of the file in the working directory is this:
> 
> diff --git a/file.txt b/file.txt
> index 868aa22..9ab67a1 100644
> --- a/file.txt
> +++ b/file.txt
> @@ -1,35 +1,51 @@
>   block_one {
>   line 1
> +line 1.5
>   line 2
> +line 2.5
>   line 3
>   2 4 6 8
>   line 4
> +line 4.5
>   line 5
> +line 5.5
>   line 6
>   2 4 6 8
>   line 7
> +line 7.5
>   line 8
> +line 8.5
>   line 9
>   2 4 6 8
>   line 10
> +line 10.5
>   line 11
> +line 11.5
>   line 12
>   }
> 
>   block_two {
>   line 1
> +line 1.5
>   line 2
> +line 2.5
>   line 3
>   2 5 6 9
>   line 4
> +line 4.5
>   line 5
> +line 5.5
>   line 6
>   2 5 6 9
>   line 7
> +line 7.5
>   line 8
> +line 8.5
>   line 9
>   2 5 6 9
>   line 10
> +line 10.5
>   line 11
> +line 11.5
>   line 12
>   }
> 
> but instead the actual state of the file is this:
> 
> diff --git a/file.txt b/file.txt
> index 868aa22..76fe65d 100644
> --- a/file.txt
> +++ b/file.txt
> @@ -1,35 +1,51 @@
>   block_one {
>   line 1
> +line 1.5
>   line 2
> +line 2.5
>   line 3
>   2 4 6 8
>   line 4
> +line 4.5
>   line 5
> +line 5.5
>   line 6
>   2 4 6 8
>   line 7
> +line 7.5
>   line 8
> +line 8.5
>   line 9
> -2 4 6 8
> +2 5 6 9
>   line 10
> +line 10.5
>   line 11
> +line 11.5
>   line 12
>   }
> 
>   block_two {
>   line 1
> +line 1.5
>   line 2
> +line 2.5
>   line 3
>   2 5 6 9
>   line 4
> +line 4.5
>   line 5
> +line 5.5
>   line 6
>   2 5 6 9
>   line 7
> +line 7.5
>   line 8
> +line 8.5
>   line 9
> -2 5 6 9
> +2 4 6 8
>   line 10
> +line 10.5
>   line 11
> +line 11.5
>   line 12
>   }
> 
> See the changes between "line 9" and "line 10" in both blocks that are
> not correct.
> 
Phillip Wood· Aug 11, 2019, 13:47 UTC · re: Phillip Wood · lore

Re: Incorrect behavior from git checkout --patch

Hi Dave
On 11/08/2019 10:54, Phillip Wood wrote:
> Hi Dave
> 
> Thanks for the bug report. I've tried to reproduce it on the latest 
> master, version 2.22.0 and 2.20.1 and am unable to do so.

Doh, I was doing 'git checkout -p HEAD', when I checkout from the index I can reproduce the bug and it is fixed by the patch I linked to earlier which will be in git 2.23.0. That will be released soon (we're at 2.23.0.rc2 at the moment)

Thanks again for taking the time to report the bug
Best Wishes
Phillip
Show 308 quoted lines
> I thought it 
> might be related to a bug I recently fixed[1] but it does not appear to 
> be. I've appended the files I used below just in case I made a mistake 
> translating your patches to files that can be used with git checkout.
> 
> Best Wishes
> 
> Phillip
> 
> [1] 
> https://github.com/git/git/commit/1b074e15d0f976be2bc14f9528874a841c055213#diff-588be9a03d1f7e33db12f186aad5fde9 
> 
> 
> pre-image
> 
> block_one {
> line 1
> line 2
> line 3
> 2 4 6 8
> line 4
> line 5
> line 6
> 2 4 6 8
> line 7
> line 8
> line 9
> 2 4 6 8
> line 10
> line 11
> line 12
> }
> 
> block_two {
> line 1
> line 2
> line 3
> 2 5 6 9
> line 4
> line 5
> line 6
> 2 5 6 9
> line 7
> line 8
> line 9
> 2 5 6 9
> line 10
> line 11
> line 12
> }
> 
> post-image
> 
> block_one {
> line 1
> line 1.5
> line 2
> line 2.5
> line 3
> 2 4 6 8
> line 4
> line 4.5
> line 5
> line 5.5
> line 6
> 2 4 6 8
> line 7
> line 7.5
> line 8
> line 8.5
> line 9
> 2 4 6 8
> line 10
> line 10.5
> line 11
> line 11.5
> line 12
> }
> 
> block_two {
> line 1
> line 1.5
> line 2
> line 2.5
> line 3
> 2 5 6 9
> line 4
> line 4.5
> line 5
> line 5.5
> line 6
> 2 5 6 9
> line 7
> line 7.5
> line 8
> line 8.5
> line 9
> 2 5 6 9
> line 10
> line 10.5
> line 11
> line 11.5
> line 12
> }
> 
> 
> 
> On 10/08/2019 21:12, Dave Kaminski wrote:
>> I am observing git checkout --patch making changes to the wrong lines 
>> of a file.
>>
>> This is with a clean install of git version 2.20.1 on a debian docker
>> container (image tag 10.0 which is also "latest" as of this writing).
>>
>> With a diff that looks like the following:
>>
>> diff --git a/file.txt b/file.txt
>> index 868aa22..ea4d786 100644
>> --- a/file.txt
>> +++ b/file.txt
>> @@ -1,35 +1,51 @@
>>   block_one {
>>   line 1
>> +line 1.5
>>   line 2
>> +line 2.5
>>   line 3
>>   2 4 6 8
>>   line 4
>> +line 4.5
>>   line 5
>> +line 5.5
>>   line 6
>>   2 4 6 8
>>   line 7
>> +line 7.5
>>   line 8
>> +line 8.5
>>   line 9
>>   2 4 6 8
>>   line 10
>> +line 10.5
>>   line 11
>> +line 11.5
>>   line 12
>>   }
>>
>>   block_two {
>>   line 1
>> +line 1.5
>>   line 2
>> +line 2.5
>>   line 3
>> -2 5 6 9
>> +2 4 6 8
>>   line 4
>> +line 4.5
>>   line 5
>> +line 5.5
>>   line 6
>> -2 5 6 9
>> +2 4 6 8
>>   line 7
>> +line 7.5
>>   line 8
>> +line 8.5
>>   line 9
>> -2 5 6 9
>> +2 4 6 8
>>   line 10
>> +line 10.5
>>   line 11
>> +line 11.5
>>   line 12
>>   }
>>
>> doing a `git checkout --patch -- ./file.txt`, splitting the diff into
>> hunks, and discarding all of the hunks that begin with numbers, e.g.
>>
>> @@ -22,3 +32,3 @@
>>   line 3
>> -2 5 6 9
>> +2 4 6 8
>>   line 4
>>
>> the expected state of the file in the working directory is this:
>>
>> diff --git a/file.txt b/file.txt
>> index 868aa22..9ab67a1 100644
>> --- a/file.txt
>> +++ b/file.txt
>> @@ -1,35 +1,51 @@
>>   block_one {
>>   line 1
>> +line 1.5
>>   line 2
>> +line 2.5
>>   line 3
>>   2 4 6 8
>>   line 4
>> +line 4.5
>>   line 5
>> +line 5.5
>>   line 6
>>   2 4 6 8
>>   line 7
>> +line 7.5
>>   line 8
>> +line 8.5
>>   line 9
>>   2 4 6 8
>>   line 10
>> +line 10.5
>>   line 11
>> +line 11.5
>>   line 12
>>   }
>>
>>   block_two {
>>   line 1
>> +line 1.5
>>   line 2
>> +line 2.5
>>   line 3
>>   2 5 6 9
>>   line 4
>> +line 4.5
>>   line 5
>> +line 5.5
>>   line 6
>>   2 5 6 9
>>   line 7
>> +line 7.5
>>   line 8
>> +line 8.5
>>   line 9
>>   2 5 6 9
>>   line 10
>> +line 10.5
>>   line 11
>> +line 11.5
>>   line 12
>>   }
>>
>> but instead the actual state of the file is this:
>>
>> diff --git a/file.txt b/file.txt
>> index 868aa22..76fe65d 100644
>> --- a/file.txt
>> +++ b/file.txt
>> @@ -1,35 +1,51 @@
>>   block_one {
>>   line 1
>> +line 1.5
>>   line 2
>> +line 2.5
>>   line 3
>>   2 4 6 8
>>   line 4
>> +line 4.5
>>   line 5
>> +line 5.5
>>   line 6
>>   2 4 6 8
>>   line 7
>> +line 7.5
>>   line 8
>> +line 8.5
>>   line 9
>> -2 4 6 8
>> +2 5 6 9
>>   line 10
>> +line 10.5
>>   line 11
>> +line 11.5
>>   line 12
>>   }
>>
>>   block_two {
>>   line 1
>> +line 1.5
>>   line 2
>> +line 2.5
>>   line 3
>>   2 5 6 9
>>   line 4
>> +line 4.5
>>   line 5
>> +line 5.5
>>   line 6
>>   2 5 6 9
>>   line 7
>> +line 7.5
>>   line 8
>> +line 8.5
>>   line 9
>> -2 5 6 9
>> +2 4 6 8
>>   line 10
>> +line 10.5
>>   line 11
>> +line 11.5
>>   line 12
>>   }
>>
>> See the changes between "line 9" and "line 10" in both blocks that are
>> not correct.
>>

← back to recent threads