有没有办法使用结帐--ours
和--theirs
来解决所有文件的冲突?我知道您可以为单个文件执行此操作,但无法找到为所有文件执行此操作的方法。
答案 0 :(得分:79)
只需浏览工作目录并通过xargs命令发送输出:
grep -lr '<<<<<<<' . | xargs git checkout --ours
或
grep -lr '<<<<<<<' . | xargs git checkout --theirs
如何工作:grep
将搜索当前目录中的每个文件(.
)和递归子目录(-r
标志),查找冲突标记(字符串'&lt; ;&LT;&LT;&LT;&LT;&LT;&LT;')
-l
或--files-with-matches
标志会导致grep仅输出找到字符串的文件名。第一次匹配后扫描停止,因此每个匹配的文件只输出一次。
匹配的文件名是piped到xargs,这是一个实用程序,可将管道输入流分解为git checkout --ours
或--theirs
更多at this link。
因为每次在命令行输入都很不方便,如果你发现自己经常使用它,那么为你的shell创建一个alias可能不是一个坏主意。选择:Bash是通常的选择。
此方法应至少通过Git版本2.4.x
答案 1 :(得分:42)
您也可以-Xours
或-Xtheirs
使用git merge
。所以:
git reset --hard HEAD
)git merge -Xours
或git merge -Xtheirs
)免责声明:当然,您只能选择一个选项,-Xours
或-Xtheirs
,请使用您应该采用的不同策略。
我不知道checkout
是否有办法,但我不认为它非常有用:如果你想为不同的文件使用不同的解决方案,选择checkout命令的策略是有用的,否则只是采用合并策略方法。
答案 2 :(得分:30)
git checkout --[ours/theirs] .
就能做你想做的事。我们的/他们只会影响未合并的文件,所以你不应该特意grep / find / etc冲突。
答案 3 :(得分:16)
git diff --name-only --diff-filter=U | xargs git checkout --theirs
似乎可以胜任这项工作。请注意,您必须将CD转到git repo的根目录才能实现此目的。
答案 4 :(得分:0)
万一其他人想简单地用一个分支的内容覆盖另一个分支(例如master)的所有内容,则有一种更简单的方法:
git merge master --strategy=ours
答案 5 :(得分:0)
function gitcheckoutall() {
git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}
我已在 .zshrc 文件中添加了此功能。
以这种方式使用它们:
gitcheckoutall theirs
或gitcheckoutall ours