threads / discuss / 51091

Is git-checkout's restoring d/f conflict really sane?

Subject: Is git-checkout's restoring d/f conflict really sane?

## tl;dr

4 messages between May 14, 2019 and May 15, 2019.

replies: 3people: 2as markdown or json

Duy Nguyen· May 14, 2019, 09:41 UTC · lore

$ echo data > one $ git add one $ rm one $ mkdir one $ echo two > one/two $ echo three > one/three $ git checkout one $ ls -l one -rw-r--r-- 1 pclouds pclouds 5 May 14 16:36 one

Replacing a file is one thing. In this case we're deleting a directory and unknown number of files inside (in this case 'two' and 'three'). Is this really a good thing to do?

If it's not but too late to do anything about git-checkout, could git-restore do something better (and exactly what)?

-- 
Duy
Junio C Hamano· May 14, 2019, 10:37 UTC · re: Duy Nguyen · lore

Re: Is git-checkout's restoring d/f conflict really sane?

Duy Nguyen <pclouds@gmail.com> writes:
Show 16 quoted lines
> $ echo data > one
> $ git add one
> $ rm one
> $ mkdir one
> $ echo two > one/two
> $ echo three > one/three
> $ git checkout one
> $ ls -l one
> -rw-r--r-- 1 pclouds pclouds 5 May 14 16:36 one
>
> Replacing a file is one thing. In this case we're deleting a directory
> and unknown number of files inside (in this case 'two' and 'three').
> Is this really a good thing to do?
>
> If it's not but too late to do anything about git-checkout, could
> git-restore do something better (and exactly what)?

The user said "I do not want whatever I have under name 'one' in the working tree, and I want what I have as 'one' in the index instead", so I tend to think that failing the request would be a disservice.

I suspect that this will become even more right thing to do, in the new world where the no-overlay mode becomes the default. Unlike "checkout HEAD ." that only adds to the set of paths in the working tree, "restore HEAD ." will remove what's in the working tree and in the index but not in the HEAD, no?

Duy Nguyen· May 14, 2019, 10:49 UTC · re: Junio C Hamano · lore

Re: Is git-checkout's restoring d/f conflict really sane?

On Tue, May 14, 2019 at 5:37 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 23 quoted lines
>
> Duy Nguyen <pclouds@gmail.com> writes:
>
> > $ echo data > one
> > $ git add one
> > $ rm one
> > $ mkdir one
> > $ echo two > one/two
> > $ echo three > one/three
> > $ git checkout one
> > $ ls -l one
> > -rw-r--r-- 1 pclouds pclouds 5 May 14 16:36 one
> >
> > Replacing a file is one thing. In this case we're deleting a directory
> > and unknown number of files inside (in this case 'two' and 'three').
> > Is this really a good thing to do?
> >
> > If it's not but too late to do anything about git-checkout, could
> > git-restore do something better (and exactly what)?
>
> The user said "I do not want whatever I have under name 'one' in the
> working tree, and I want what I have as 'one' in the index instead",
> so I tend to think that failing the request would be a disservice.

Except that sometimes the user has those "oops that's not what I meant" moments (and I think it's more often "I want to restore _file_ 'one'"). One tricky thing in this situation is (to me) one/two and one/three are untracked and we generally do not touch them unless requested.

Technically 'one' is still tracked (even if it's a directory) so what we're doing is right. I'm just not sure if there's some big surprise factor here. And whether it's better to pause and double check with the user before deleting everything.

Show 5 quoted lines
> I suspect that this will become even more right thing to do, in the
> new world where the no-overlay mode becomes the default.  Unlike
> "checkout HEAD ."  that only adds to the set of paths in the working
> tree, "restore HEAD ." will remove what's in the working tree and in
> the index but not in the HEAD, no?

Yes. It makes me really want 'git restore --diff [--stat]' just to show what's going to be restored. A careful user may see something unexpected and examine more before really doing 'git restore'.

-- 
Duy
Junio C Hamano· May 15, 2019, 01:56 UTC · re: Duy Nguyen · lore

Re: Is git-checkout's restoring d/f conflict really sane?

Duy Nguyen <pclouds@gmail.com> writes:
> Technically 'one' is still tracked (even if it's a directory) so what
> we're doing is right. I'm just not sure if there's some big surprise
> factor here. And whether it's better to pause and double check with
> the user before deleting everything.

I agree to all of the above, including the part "technically it is correct", but more importantly "stop and double check".

As changing between a directory and a non-directory is a rare event anyway, I do not mind making it a bit more cumbersome and say "you asked me to check out a regular file 'one', but you have a directory 'one', that has an unignored untracked file in it, so I'd refuse to do so. Come back after you removed them manually, or use the '--force' option".

We should not refuse if 'one' is an empty directory or all files in it are ignored, though.

Thanks.

← back to recent threads