Git使用--ours / - 解决所有文件的冲突

时间:2014-07-14 18:57:54

标签: git conflict resolve merge-conflict-resolution

有没有办法使用结帐--ours--theirs来解决所有文件的冲突?我知道您可以为单个文件执行此操作,但无法找到为所有文件执行此操作的方法。

6 个答案:

答案 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仅输出找到字符串的文件名。第一次匹配后扫描停止,因此每个匹配的文件只输出一次。

匹配的文件名是pipedxargs,这是一个实用程序,可将管道输入流分解为git checkout --ours--theirs

的各个参数

更多at this link

因为每次在命令行输入都很不方便,如果你发现自己经常使用它,那么为你的shell创建一个alias可能不是一个坏主意。选择:Bash是通常的选择。

此方法应至少通过Git版本2.4.x

答案 1 :(得分:42)

您也可以-Xours-Xtheirs使用git merge。所以:

  1. 中止当前合并(例如使用git reset --hard HEAD
  2. 使用您喜欢的策略进行合并(git merge -Xoursgit merge -Xtheirs
  3. 免责声明:当然,您只能选择一个选项,-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

感谢https://stackoverflow.com/a/1295232/560114

或者相反,请参见Is there a "theirs" version of "git merge -s ours"?

答案 5 :(得分:0)

function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

我已在 .zshrc 文件中添加了此功能。

以这种方式使用它们: gitcheckoutall theirsgitcheckoutall ours