Git 解决冲突使用—— our/—— their 来解决所有文件

是否有办法解决冲突的所有文件使用检出 --ours--theirs?我知道你可以为个人文件做到这一点,但不能找到一种方法来做到这一点的所有。

176129 次浏览

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

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

或者

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

工作原理: grep将递归地搜索工作目录(.)和子目录(-r标志)中的每个文件,寻找冲突标记(字符串’< < < < < < < <’)

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

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

更多 在这个链接

因为每次都必须在命令行中输入这个命令是非常不方便的,所以如果您确实发现自己经常使用它,那么为您选择的 shell 创建一个 化名可能是一个不错的主意: 巴斯是常用的一个。

此方法至少应该可以工作到 Git 版本 2.4. x

你可以选择 -Xours或者 -Xtheirs,也可以选择 git merge,所以:

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

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

我不知道是否有一种方法可以用于 checkout,但是我并不认为它是非常有用的: 如果你想为不同的文件选择不同的解决方案,那么使用 checkout 命令来选择策略是非常有用的,否则就使用合并策略方法。

git checkout --[ours/theirs] .会做你想做的,只要你是所有冲突的根源。Our/their 仅影响未合并的文件,因此不必专门对 grep/find/etc 冲突进行操作。

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

看起来很管用。请注意,您必须被 cd 到 git repo 的根目录才能实现这一点。

场景1

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

git merge origin/master --strategy=ours

多亏了 https://stackoverflow.com/a/1295232/560114

场景2

反过来,请参阅 有没有“他们的”版本的“ Git 合并是我们的”?

更新

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

git checkout branchA
git merge -X theirs branchB

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

git checkout branch-b
git fetch branch-a
git merge branch-a --strategy=ours

现在分支 -b 已经准备好合并到分支 -a 中,而且没有冲突。此时,如果您正在使用类似 Github 的东西,那么您可以通过一个 PR 来将 Branch-b 合并到 Branch-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
function gitcheckoutall() {
git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

我已经在 。 zhrc文件中添加了这个函数。

这样使用它们: gitcheckoutall theirsgitcheckoutall ours