threads / discuss / 41692

git checkout --theirs fails

Subject: git checkout --theirs fails

## tl;dr

5 messages between Mar 15, 2016 and Mar 16, 2016.

replies: 4people: 4as markdown or json

Phil Susi· Mar 15, 2016, 17:27 UTC · lore

I'm doing a rebase and got some conflicts. I just want to take their version of all files, but git checkout --theirs complains:

--ours/--theirs' cannot be used with switching branches

What gives? I'm not *trying* to switch branches. I just want to resolve the conflict by taking their version. If I try git checkout --theirs ., then it complains that not every single file in the directory has a "their" version. So? Take the ones that do.

Stefan Beller· Mar 15, 2016, 21:35 UTC · re: Phil Susi · lore

Re: git checkout --theirs fails

On Tue, Mar 15, 2016 at 10:27 AM, Phil Susi <phillsusi@gmail.com> wrote:
Show 9 quoted lines
> I'm doing a rebase and got some conflicts.  I just want to take their
> version of all files, but git checkout --theirs complains:
>
> --ours/--theirs' cannot be used with switching branches
>
> What gives?  I'm not *trying* to switch branches.  I just want to
> resolve the conflict by taking their version.  If I try git checkout
> --theirs ., then it complains that not every single file in the
> directory has a "their" version.  So?  Take the ones that do.

I think for checking out files you'd need to add the file names. In case of a collision between branch name and file name, even add a double dash:

    git checkout --theirs -- file/name
Show 5 quoted lines
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Junio C Hamano· Mar 15, 2016, 21:47 UTC · re: Stefan Beller · lore

Re: git checkout --theirs fails

Stefan Beller <sbeller@google.com> writes:
Show 16 quoted lines
> On Tue, Mar 15, 2016 at 10:27 AM, Phil Susi <phillsusi@gmail.com> wrote:
>> I'm doing a rebase and got some conflicts.  I just want to take their
>> version of all files, but git checkout --theirs complains:
>>
>> --ours/--theirs' cannot be used with switching branches
>>
>> What gives?  I'm not *trying* to switch branches.  I just want to
>> resolve the conflict by taking their version.  If I try git checkout
>> --theirs ., then it complains that not every single file in the
>> directory has a "their" version.  So?  Take the ones that do.
>
> I think for checking out files you'd need to add the file names.
> In case of a collision between branch name and file name, even add
> a double dash:
>
>     git checkout --theirs -- file/name

That is true, but notice that the last example by Phil gives a dot as the pathspec to match all available files.

Having said that,
    $ git checkout --theirs -- file/name

would fail when the path file/name is unmerged and does not have stage #3 entry, wouldn't it? So with ".", unless all paths that match that pathspec (i.e. all available files) are either merged (i.e. without conflict) or have stage #3 entry, it is expected that the command would fail consistently to the case where a pathspec "file/name" that happens to match only one path is given, and that is the behaviour Phil saw, I would think.

Phil Susi· Mar 16, 2016, 12:45 UTC · re: Junio C Hamano · lore

Re: git checkout --theirs fails

On 3/15/2016 5:47 PM, Junio C Hamano wrote:
Show 7 quoted lines
> would fail when the path file/name is unmerged and does not have
> stage #3 entry, wouldn't it?  So with ".", unless all paths that
> match that pathspec (i.e. all available files) are either merged
> (i.e. without conflict) or have stage #3 entry, it is expected that
> the command would fail consistently to the case where a pathspec
> "file/name" that happens to match only one path is given, and that
> is the behaviour Phil saw, I would think.

Right... why is this though? Why doesn't it just check out those files that *do* have a #3 entry? And also why the nonsense about switching branches when you don't specify any path or branch?

Jeff King· Mar 16, 2016, 21:12 UTC · re: Phil Susi · lore

Re: git checkout --theirs fails

On Wed, Mar 16, 2016 at 08:45:57AM -0400, Phil Susi wrote:
Show 11 quoted lines
> On 3/15/2016 5:47 PM, Junio C Hamano wrote:
> > would fail when the path file/name is unmerged and does not have
> > stage #3 entry, wouldn't it?  So with ".", unless all paths that
> > match that pathspec (i.e. all available files) are either merged
> > (i.e. without conflict) or have stage #3 entry, it is expected that
> > the command would fail consistently to the case where a pathspec
> > "file/name" that happens to match only one path is given, and that
> > is the behaviour Phil saw, I would think.
> 
> Right... why is this though?  Why doesn't it just check out those files
> that *do* have a #3 entry?

Certainly "git checkout --theirs foo" should complain if "foo" does not have a "theirs" entry. But in your case, you are picking the entries up only via a recursive pathspec, so you'd probably be fine if _any_ entries were updated.

We do something like that in git-add, where "git add 'foo*'" will complain only if "foo*" didn't match anything. I suspect we could do the same here, but nobody has bothered to implement it.

Probably (and now I am in the realm of pure speculation) because "checkout --theirs" was intended to be done on specific paths, once you had looked at the conflicts. If you want to do a blanket "checkout --theirs .", wouldn't merging with `-Xtheirs` be simpler?

> And also why the nonsense about switching
> branches when you don't specify any path or branch?

Because the default for checkout without any arguments has always been to "switch" branches to HEAD. That's obviously a noop, but people have long done it to see the switching message.

Nobody until now bothered to think about how that decision would interact with "--theirs". So it does _a_ logical thing, but not the one that would be most useful to you. I do not think it would be harmful to DWIM "git checkout --theirs" to "git checkout --theirs .".

-Peff

← back to recent threads