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

问题描述 投票:90回答:6

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

git conflict resolve merge-conflict-resolution
6个回答
81
投票

只需grep通过工作目录并通过xargs命令发送输出:

grep -lr '<<<<<<<' . | xargs git checkout --ours

要么

grep -lr '<<<<<<<' . | xargs git checkout --theirs

如何工作:grep将搜索当前目录中的每个文件(.)和递归子目录(-r标志)寻找冲突标记(字符串'<<<<<<

-l--files-with-matches标志使grep只输出找到字符串的文件名。首次匹配后扫描停止,因此每个匹配的文件仅输出一次。

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

更多at this link

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

这种方法至少应该通过Git版本2.4.x


44
投票

你也可以和-Xours一起使用-Xtheirsgit merge。所以:

  1. 中止当前合并(例如使用git reset --hard HEAD
  2. 使用您喜欢的策略合并(git merge -Xoursgit merge -Xtheirs

免责声明:当然你只能选择一个选项,无论是-Xours还是-Xtheirs,都要使用不同的策略你当然应该逐个文件。

我不知道checkout是否有办法,但我不认为它非常有用:如果你想为不同的文件使用不同的解决方案,选择checkout命令的策略是有用的,否则只需要采用合并策略方法。


32
投票

只要你是所有冲突的根源,git checkout --[ours/theirs] .就会做你想做的事。我们的/他们只影响未合并的文件,所以你不应该特别grep / find / etc冲突。


20
投票
git diff --name-only --diff-filter=U | xargs git checkout --theirs

似乎做了这个工作。请注意,您必须cd'ed到git repo的根目录才能实现此目的。


1
投票

如果其他人想要简单地用一个分支(比如大师)覆盖另一个分支的内容,那么有一种更简单的方法:

git merge master --strategy=ours

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

或者换句话说,请参阅Is there a "theirs" version of "git merge -s ours"?


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

我在.zshrc文件中添加了这个函数。

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

© www.soinside.com 2019 - 2024. All rights reserved.