Is there a way to resolve conflict for all files using checkout --ours
and --theirs
? I know that you can do it for individual files but couldn't find a way to do it for all.
问题:
回答1:
Just grep through the working directory and send the output through the xargs command:
grep -lr '<<<<<<<' . | xargs git checkout --ours
or
grep -lr '<<<<<<<' . | xargs git checkout --theirs
How this works: grep
will search through every file in the current directory (the .
) and subdirectories recursively (the -r
flag) looking for conflict markers (the string '<<<<<<<')
the -l
or --files-with-matches
flag causes grep to output only the filename where the string was found. Scanning stops after first match, so each matched file is only output once.
The matched file names are then piped to xargs, a utility that breaks up the piped input stream into individual arguments for git checkout --ours
or --theirs
More at this link.
Since it would be very inconvenient to have to type this every time at the command line, if you do find yourself using it a lot, it might not be a bad idea to create an alias for your shell of choice: Bash is the usual one.
This method should work through at least Git versions 2.4.x
回答2:
You can -Xours
or -Xtheirs
with git merge
as well. So:
- abort the current merge (for instance with
git reset --hard HEAD
) - merge using the strategy you prefer (
git merge -Xours
orgit merge -Xtheirs
)
DISCLAIMER: of course you can choose only one option, either -Xours
or -Xtheirs
, do use different strategy you should of course go file by file.
I do not know if there is a way for checkout
, but I do not honestly think it is terribly useful: selecting the strategy with the checkout command is useful if you want different solutions for different files, otherwise just go for the merge strategy approach.
回答3:
git checkout --[ours/theirs] .
will do what you want, as long as you're at the root of all conflicts. ours/theirs only affects unmerged files so you shouldn't have to grep/find/etc conflicts specifically.
回答4:
git diff --name-only --diff-filter=U | xargs git checkout --theirs
Seems to do the job. Note that you have to be cd'ed to the root directory of the git repo to achieve this.
回答5:
In case anyone else is looking to simply overwrite everything from one branch (say master) with the contents of another, there's an easier way:
git merge master --strategy=ours
Thanks to https://stackoverflow.com/a/1295232/560114
Or for the other way around, see Is there a "theirs" version of "git merge -s ours"?