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


113

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


7
git checkout --ours -- .工作吗?所述.装置当前目录,当从工作目录的根应用,因此,它基本上意味着整个工作目录。不确定是否可以与该--ours标志一起使用,并且我不确定它将如何处理已删除或重命名的文件冲突。

@Cupcake我已经成功使用了它。也许应该是答案?
Pedro Gimeno

Answers:


90

只需grep通过工作目录,然后通过xargs命令发送输出即可:

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

要么

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

工作原理:grep将以.递归方式搜索当前目录()和子目录中的每个文件(-r标志),以查找冲突标记(字符串“ <<<<<<<<”)

-l--files-with-matches标志使grep的输出只有在string中找到的文件名。第一次匹配后扫描停止,因此每个匹配的文件仅输出一次。

然后,将匹配的文件名通过管道传递给xargs,该实用程序将通过管道传递的输入流分解为git checkout --ours或的各个参数。--theirs

更多在此链接

由于每次都必须在命令行中键入此命令非常不便,因此,如果您发现自己经常使用它,则为您选择的shell 创建别名可能不是一个坏主意:Bash是通常的用法

此方法至少应在Git 2.4.x版之前有效


14
我认为除了使用grep之外,还可以使用git diff --name-only --diff-filter=U
2015年

10
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]。如果您有大型项目,则比grepping更快。
joshbodily

1
@joshbodily不错。我没有太大的项目以至于我会注意到差异,但是我可以看到它会更快得多,尤其是与目录中的文件总数相比文件更改很少的情况下,正常情况下应该如此提交。
德米特里(Dmitri)

1
请注意,这不适用于重命名/重命名冲突,例如CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard

1
另一个选择:git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
Zitrax

52

你可以-Xours-Xtheirsgit merge为好。所以:

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

免责声明:当然,您只能选择一个选项,或者,-Xours或者-Xtheirs使用不同的策略,当然应该逐个文件。

我不知道是否有一种解决方法checkout,但是老实说,我并不认为这非常有用:如果要为不同文件提供不同的解决方案,则使用checkout命令选择策略很有用,否则可以采用合并策略方法。


谢谢,不知道他们有“-我们的”和“-他们的”要合并。看来,对于合并而言,它们实际上不是'-s'策略的一部分,而是'-X'递归选项的一部分。实际上,我们的'-s'版本仅替换所有文件而不合并,并且它们不存在。
exe163

git v1.9.4 没有--theirs--ours-Option。一种方法是git merge -s recursive -Xtheirs BRANCH
fbmd 2015年

--theirs并且--oursgit都不可用2.2.0。我的答案不准确,或者它们在较旧的git版本中可用(此答案在IT时代相当古老)。正确的方法是-X。我会据此进行更新
ThanksForAllTheFish 2015年

从版本2.4.0开始,--ours和--theirs仍然非常可用git-scm.com/docs/git-checkout
Dmitri

尝试了这一点,并得到“自动合并失败,修复冲突”。该命令显然无法按预期工作,我建议避免使用它-太过马车了。
亚当

37

git checkout --[ours/theirs] .只要您是所有冲突的根源,它就会做您想要的。我们/他们只影响未合并的文件,因此您不必专门grep / find / etc冲突。


5
对我来说,这似乎没有递归到子目录中。
Daniel Baughman

5
我懂了error: path 'foo/bar/blah' does not have our version
罗宾·格林

我正在使用git版本2.16.2.windows.1,它非常适合我。谢谢!
Pankwood

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

似乎做好了工作。请注意,您必须将其安装到git repo的根目录才能实现此目的。


3
我认为这是比投票最多的答案更好的答案,因为(1)它适用于所有文件,而不仅仅是工作目录;(2)围绕grepping冲突标记不会有任何脆弱性。这里的'git diff'命令列出了所有未合并的路径,这正是我们要检出的路径。
bchurchill '18

真好!我一直很担心冲突标记grep的可靠性
00-BBB


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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.