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

exe*_*163 101 git conflict resolve merge-conflict-resolution

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

Dmi*_*tri 83

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

grep -lr '<<<<<<<' . | xargs git checkout --ours
Run Code Online (Sandbox Code Playgroud)

要么

grep -lr '<<<<<<<' . | xargs git checkout --theirs
Run Code Online (Sandbox Code Playgroud)

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

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

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

更多在这个链接.

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

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

  • 我认为也可以使用[`git diff --name-only --diff-filter = U`](http://stackoverflow.com/a/10874862/559913)而不是grepping. (14认同)
  • 也是`git status | grep两个| awk'{print $ 3}'| xargs git checkout - [他们的|我们的]`.如果你有一个大型项目,比grepping更快. (9认同)

Tha*_*ish 47

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

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

免责声明:当然,你可以只选择一个选项,或者-Xours还是-Xtheirs,不要使用不同的策略,你当然应该由文件去文件.

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


Cor*_*sky 33

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

  • `$ git checkout --ours` 给出:`致命:'--ours/--theirs' 不能与切换分支一起使用`。`git 版本 2.31.1 中心版本 2.14.2` (6认同)
  • 对我来说,这似乎没有递归到子目录. (5认同)
  • 我得到`错误:路径'foo/bar/blah'没有我们的版本`. (5认同)
  • 您还可以使用 `git Restore [--ours] [--theirs] [--staged] &lt;pathspec&gt;` (3认同)

Pet*_*ter 24

git diff --name-only --diff-filter=U | xargs git checkout --theirs
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*wne 14

场景一

如果其他人希望用另一个分支的内容简单地覆盖一个分支(例如 master)中的所有内容,则有一种更简单的方法:

git merge origin/master --strategy=ours
Run Code Online (Sandbox Code Playgroud)

感谢/sf/answers/90666271/

场景二

相反,请参阅是否有“他们的”版本的“git merge -s ours”?

更新

对于场景 2,链接的答案建议使用:

git checkout branchA
git merge -X theirs branchB
Run Code Online (Sandbox Code Playgroud)

我发现这并不完全相反,--strategy=ours您可能仍然会遇到合并冲突(在某些情况下,您实际上想要删除的其他分支中的代码会被保留)。因此,如果您想要一个真正与 相反的解决方案git merge other-branch --strategy=ours,最好的方法是分两步完成(两次合并)。假设你的目标是取代branch-a与内容branch-b。那么第一步就是这样做:

git checkout branch-b
git fetch branch-a
git merge branch-a --strategy=ours
Run Code Online (Sandbox Code Playgroud)

现在 branch-b 已准备好合并到 branch-a 中而不会发生冲突。此时,如果您使用的是 Github 之类的东西,您可以提出一个 PR 将分支 b 合并到分支 a。或者,如果不需要同行评审,您可以直接进行合并:

git checkout branch-a
git merge branch-b

# Cleanup - delete branch-b (if desired)
git branch -d branch-b
git push origin --delete branch-b
Run Code Online (Sandbox Code Playgroud)