有没有办法使用checkout --ours
和--theirs
解决所有文件的冲突?我知道您可以为单个文件执行此操作,但无法找到为所有文件执行此操作的方法。
只需grep通过工作目录并通过xargs命令发送输出:
grep -lr '<<<<<<<' . | xargs git checkout --ours
要么
grep -lr '<<<<<<<' . | xargs git checkout --theirs
如何工作:grep
将搜索当前目录中的每个文件(.
)和递归子目录(-r
标志)寻找冲突标记(字符串'<<<<<<
-l
或--files-with-matches
标志使grep只输出找到字符串的文件名。首次匹配后扫描停止,因此每个匹配的文件仅输出一次。
匹配的文件名然后是piped到xargs,这个实用程序将管道输入流分解为git checkout --ours
或--theirs
的单个参数
更多at this link。
因为每次在命令行输入它都非常不方便,如果你发现自己经常使用它,那么为你选择的shell创建一个alias可能不是一个坏主意:Bash是通常的一个。
这种方法至少应该通过Git版本2.4.x
你也可以和-Xours
一起使用-Xtheirs
或git merge
。所以:
git reset --hard HEAD
)git merge -Xours
或git merge -Xtheirs
)免责声明:当然你只能选择一个选项,无论是-Xours
还是-Xtheirs
,都要使用不同的策略你当然应该逐个文件。
我不知道checkout
是否有办法,但我不认为它非常有用:如果你想为不同的文件使用不同的解决方案,选择checkout命令的策略是有用的,否则只需要采用合并策略方法。
只要你是所有冲突的根源,git checkout --[ours/theirs] .
就会做你想做的事。我们的/他们只影响未合并的文件,所以你不应该特别grep / find / etc冲突。
git diff --name-only --diff-filter=U | xargs git checkout --theirs
似乎做了这个工作。请注意,您必须cd'ed到git repo的根目录才能实现此目的。
如果其他人想要简单地用一个分支(比如大师)覆盖另一个分支的内容,那么有一种更简单的方法:
git merge master --strategy=ours
感谢https://stackoverflow.com/a/1295232/560114
或者换句话说,请参阅Is there a "theirs" version of "git merge -s ours"?
function gitcheckoutall() {
git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}
我在.zshrc文件中添加了这个函数。
以这种方式使用它们:gitcheckoutall theirs
或gitcheckoutall ours